npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ng-hub-ui-modal

v1.2.4

Published

Standalone boomodalt

Downloads

226

Readme

ng-hub-ui-modal

This library provides a decoupled and independent modal component, originally based on the modals from ng-bootstrap but with additional features and flexibility. It aims to offer a more versatile and customizable modal solution for Angular applications.

Motivation

The main motivation behind the development of this library was to decouple the modal component from ng-bootstrap, allowing it to be used autonomously without relying on the entire ng-bootstrap library. Additionally, new functionalities and customization options have been introduced to better suit the needs of different projects.

Features

  • Standalone Modal Component: No need to install ng-bootstrap or any other additional dependencies.
  • Bootstrap-based Styling: While using its own CSS classes, the modal's appearance follows Bootstrap's design guidelines, making it easier to customize.
  • Flexible Content Projection: Instead of projecting all content into a single ng-content, this library allows defining CSS selectors to project content into different parts of the modal (header, body, footer).
  • Customizable Dismiss Triggers: You can define a CSS selector for elements that will act as dismiss triggers for the modal.
  • Data Binding to Modal Component: It's possible to pass additional data to the modal component through the configuration options.
  • New Control Methods: Methods have been added to show and hide the modal on demand.

Installation

npm install ng-hub-ui-modal

Usage

  1. Import the ModalModule into your Angular module:
import { ModalModule } from 'ng-hub-ui-modal';

@NgModule({
  imports: [
    // ...
    ModalModule
  ]
})
export class AppModule {}
  1. Inject the ModalService into your component:
import { ModalService } from 'ng-hub-ui-modal';

@Component({...})
export class MyComponent {
  constructor(private modalService: ModalService) {}

  openModal() {
    const modalRef = this.modalService.open(MyModalComponent, {
      headerSelector: '.modal-header',
      footerSelector: '.modal-footer',
      dismissSelector: '[data-dismiss="modal"]',
      data: { /* additional data */ }
    });
  }
}
  1. Define the modal component:
import { Component } from '@angular/core';

@Component({
  template: `
    <div class="modal-header">
      <h4 class="modal-title">Modal Title</h4>
    </div>
    <div class="modal-body">
      Modal Body
    </div>
    <div class="modal-footer">
      <button type="button" data-dismiss="modal">Close</button>
    </div>
  `
})
export class MyModalComponent {}

Documentation

ModalService

The ModalService is the main entry point for creating and managing modals in your application.

open(component, options?)

Opens a new modal instance with the provided component and options.

Arguments:

  • component (ComponentType<any>): The component to be displayed in the modal.
  • options (ModalOptions | optional): An object containing the configuration options for the modal.

Returns: ModalRef

ModalOptions

The ModalOptions object allows you to configure various aspects of the modal.

  • headerSelector (string | optional): A CSS selector for the header section of the modal content. Any elements matching this selector will be projected into the modal header.
  • bodySelector (string | optional): A CSS selector for the body section of the modal content. Any elements matching this selector will be projected into the modal body.
  • footerSelector (string | optional): A CSS selector for the footer section of the modal content. Any elements matching this selector will be projected into the modal footer.
  • dismissSelector (string | optional): A CSS selector for elements that should act as dismiss triggers for the modal. When clicked, these elements will dismiss the modal. Default: '[data-dismiss="modal"]'.
  • data (any | optional): An object containing additional data that will be bound to the modal component instance.

ModalRef

The ModalRef is a reference to the currently open modal instance. It provides methods to interact with the modal.

  • dismiss(reason?): Dismisses the modal with an optional reason.
    • reason (any | optional): A value that will be passed to the modal's dismissal event.
  • result: A promise that resolves when the modal is dismissed, providing the dismissal reason.

Modal Component

The modal component is the component that you define to be displayed within the modal. It can have any structure and content you desire, but it's recommended to follow the Bootstrap modal structure for consistency.

Here's an example modal component:

import { Component } from '@angular/core';

@Component({
  selector: 'app-my-modal',
  template: `
    <div class="modal-header">
      <h4 class="modal-title">{{ title }}</h4>
      <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span>
      </button>
    </div>
    <div class="modal-body">
      {{ body }}
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
      <button type="button" class="btn btn-primary" (click)="confirm()">Confirm</button>
    </div>
  `
})
export class MyModalComponent {
  title: string;
  body: string;

  constructor(@Inject(MODAL_DATA) public data: any) {
    this.title = data.title;
    this.body = data.body;
  }

  confirm() {
    // Perform any necessary actions here
    // ...

    // Dismiss the modal
    this.modalRef.dismiss('confirmed');
  }
}

In this example, the modal component receives data through the MODAL_DATA injection token, which is populated with the data object passed in the ModalOptions. The component displays a modal with a header, body, and footer, with a "Cancel" button that dismisses the modal and a "Confirm" button that performs some actions and then dismisses the modal with the reason 'confirmed'.

Note that the modalRef instance is injected into the modal component automatically by the library, allowing you to interact with the modal from within the component.

Styling

The modal component uses Bootstrap's modal styles by default, but you can override them or define your own styles by targeting the appropriate CSS classes. The modal component has the following structure:

<div class="modal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <!-- Header content projected here -->
      </div>
      <div class="modal-body">
        <!-- Body content projected here -->
      </div>
      <div class="modal-footer">
        <!-- Footer content projected here -->
      </div>
    </div>
  </div>
</div>

You can target these classes or add your own classes to customize the modal's appearance.

Examples

Basic Modal

import { Component } from '@angular/core';
import { ModalService } from 'ng-hub-ui-modal';

@Component({
  selector: 'app-example',
  template: `
    <button (click)="openModal()">Open Modal</button>
  `
})
export class ExampleComponent {
  constructor(private modalService: ModalService) {}

  openModal() {
    const modalRef = this.modalService.open(BasicModalComponent);
  }
}

@Component({
  selector: 'app-basic-modal',
  template: `
    <div class="modal-header">
      <h4 class="modal-title">Basic Modal</h4>
    </div>
    <div class="modal-body">
      This is a basic modal example.
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    </div>
  `
})
export class BasicModalComponent {}

Modal with Data

import { Component, Inject } from '@angular/core';
import { ModalService, MODAL_DATA } from 'ng-hub-ui-modal';

@Component({
  selector: 'app-example',
  template: `
    <button (click)="openModal()">Open Modal</button>
  `
})
export class ExampleComponent {
  constructor(private modalService: ModalService) {}

  openModal() {
    const modalRef = this.modalService.open(DataModalComponent, {
      data: { name: 'John Doe' }
    });
  }
}

@Component({
  selector: 'app-data-modal',
  template: `
    <div class="modal-header">
      <h4 class="modal-title">Modal with Data</h4>
    </div>
    <div class="modal-body">
      Hello, {{ name }}!
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    </div>
  `
})
export class DataModalComponent {
  name: string;

  constructor(@Inject(MODAL_DATA) public data: any) {
    this.name = data.name;
  }
}

Modal with Content Projection

import { Component } from '@angular/core';
import { ModalService } from 'ng-hub-ui-modal';

@Component({
  selector: 'app-example',
  template: `
    <button (click)="openModal()">Open Modal</button>

    <ng-template modalHeader>
      <h4 class="modal-title">Modal with Content Projection</h4>
    </ng-template>

    <ng-template modalBody>
      <p>This is the modal body content.</p>
    </ng-template>

    <ng-template modalFooter>
      <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      <button type="button" class="btn btn-primary">Save</button>
    </ng-template>
  `
})
export class ExampleComponent {
  constructor(private modalService: ModalService) {}

  openModal() {
    const modalRef = this.modalService.open(null, {
      headerSelector: '[modalHeader]',
      bodySelector: '[modalBody]',
      footerSelector: '[modalFooter]'
    });
  }
}

Modal with Dismiss Trigger

import { Component } from '@angular/core';
import { ModalService } from 'ng-hub-ui-modal';

@Component({
  selector: 'app-example',
  template: `
    <button (click)="openModal()">Open Modal</button>

    <ng-template modalContent>
      <div class="modal-header">
        <h4 class="modal-title">Modal with Dismiss Trigger</h4>
      </div>
      <div class="modal-body">
        <p>Click the button below to dismiss the modal.</p>
        <button type="button" class="btn btn-primary" myDismissTrigger>Dismiss</button>
      </div>
    </ng-template>
  `
})
export class ExampleComponent {
  constructor(private modalService: ModalService) {}

  openModal() {
    const modalRef = this.modalService.open(null, {
      bodySelector: '[modalContent]',
      dismissSelector: '[myDismissTrigger]'
    });
  }
}