ngx-bootstrap icon indicating copy to clipboard operation
ngx-bootstrap copied to clipboard

BsModalService.getModalsCount() is not accurate when implement a nesting modal

Open miazocool opened this issue 1 year ago • 1 comments

Bug description:

I implement a nested modal, and the getModalCount is not accurate.

The code can be found at ngx-bootstrap documentation at nested modal

https://valor-software.com/ngx-bootstrap/#/components/modals?tab=overview

I tweaked the code a bit to show console.log

HTML Component

<button type="button" class="btn btn-primary" (click)="openModal(template)">Open first modal</button>
 
<ng-template #template>
  <div class="modal-header">
    <h4 class="modal-title pull-left">First modal</h4>
    <button type="button" class="btn-close close pull-right" aria-label="Close" (click)="modalRef?.hide()">
      <span aria-hidden="true" class="visually-hidden">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    This is a first modal<br />
    <button type="button" class="btn btn-primary" (click)="openModal2(templateNested)">Open second modal</button>
    <button type="button" class="btn btn-primary" (click)="closeModal(1)">Close self</button>
    <button type="button" class="btn btn-primary" (click)="closeModal()">Close all modal</button>
  </div>
</ng-template>
 
<ng-template #templateNested>
  <div class="modal-header">
    <h4 class="modal-title pull-left">Second modal</h4>
    <button type="button" class="btn-close close pull-right" aria-label="Close" (click)="modalRef2?.hide()">
      <span aria-hidden="true" class="visually-hidden">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    This is nested modal.<br />
    <button *ngIf="modalRef" type="button" class="btn btn-danger" (click)="closeFirstModal()">Close first modal</button>
    <button type="button" class="btn btn-danger" (click)="closeModal(2)">Close self</button>
    <button type="button" class="btn btn-danger" (click)="closeModal()">Close all modal</button>
  </div>
</ng-template>

TS compoenent

@Component({
  // eslint-disable-next-line @angular-eslint/component-selector
  selector: 'nested-modal',
  templateUrl: './nested-modal.component.html',
  standalone: true,
  imports: [CommonModule],
})
export class NestedModalComponent {
  modalRef?: BsModalRef | null;
  modalRef2?: BsModalRef;
  constructor(private modalService: BsModalService) {}

  openModal(template: TemplateRef<void>) {
    console.log(
      'modalCount before open modal',
      this.modalService.getModalsCount()
    );
    this.modalRef = this.modalService.show(template, {
      id: 1,
      class: 'modal-lg',
    });
    console.log(
      'modalCount after open modal',
      this.modalService.getModalsCount()
    );
  }
  openModal2(template: TemplateRef<void>) {
    console.log(
      'modalCount before open modal 2',
      this.modalService.getModalsCount()
    );
    this.modalRef2 = this.modalService.show(template, {
      id: 2,
      class: 'second',
    });
    console.log(
      'modalCount after open modal 2',
      this.modalService.getModalsCount()
    );
  }
  closeFirstModal() {
    if (!this.modalRef) {
      return;
    }

    this.modalRef.hide();
    this.modalRef = null;
  }
  closeModal(modalId?: number) {
    console.log('modalCount before hide', this.modalService.getModalsCount());
    this.modalService.hide(modalId);
    console.log('modalCount after hide', this.modalService.getModalsCount());
  }
}

Versions of ngx-bootstrap, Angular, and Bootstrap:

ngx-bootstrap: "^18.0.2"

Angular: "^18.2.0"

Bootstrap: 5.2.3

Build system: Angular CLI, System.js, webpack, starter seed:

Expected behavior

When both modals are open, the getModalsCount is accurate, but when i close the modal one by one, the modal counts is inaccurate

When second modal is closed at here

  closeModal(modalId?: number) {
    console.log('modalCount before hide', this.modalService.getModalsCount());
    this.modalService.hide(modalId);
    console.log('modalCount after hide', this.modalService.getModalsCount());
  }

The output will be

modalCount before hide 2 modalCount after hide 1

Which is correct, because before hide() there are two modals, and after hide one modal, the modal count will be 1

But when i close the first modal, the output is below

modalCount before hide 0 modalCount after hide 0

Which is incorrect, because before hide, there should be one open modal.

I think there's a bug in getModalsCount(), hope someone can help me

miazocool avatar Aug 16 '24 08:08 miazocool

Hello,

I can confirm, we are facing the same issue, as you already mentioned, visible on demo page under nested modals example.

ladislavskufca avatar Aug 23 '24 07:08 ladislavskufca

@miazocool @ladislavskufca This is fixed withe latest release please confirm.

lexasq avatar Oct 21 '24 11:10 lexasq

@miazocool @ladislavskufca This is fixed withe latest release please confirm.

Confirming, works good, thanks! 👌

ladislavskufca avatar Dec 10 '24 08:12 ladislavskufca