Introduction

Endless Angular Theme is pure angular theme, Yes! you read correct, it's No Jquery angular admin theme including all feature and functionality with ease of integration for your project.Endless theme document will help you to understand angular from scratch to making perfect real time dream application.

Follow the documentation carefully for solving your issues in minutes, Apart from that if you don't find when you following the docs you can raise a support ticket from pixelstrap.freshdesk.com

Dependencies
  • Angular-20
  • Node-20.19
  • bootstrap-5
  • SASS
  • Yes! again No Jquery dependency.

    Getting started

    Welcome to Angular! Angular helps you build modern applications for the web, mobile, or desktop.

    For getting started an Angular application you needs two things as Prerequisites.

    Prerequisites

    Before you begin, make sure your development environment includes Node and an npm package manager.

    Node.js
  • Install Node.js using downloaded file
  • To check your node version, run node -v in a terminal/console window.
  • Npm package manager

    Angular CLI, and Angular apps depend on features and functionality provided by libraries that are available as npm packages. To download and install npm packages, you must have an npm package manager. This Quick Start uses the npm client command line interface, which is installed with Node.js by default. To check that you have the npm client installed, run npm -v in a terminal/console window.

    For better understanding angular we suggest you to once go through official documentation of an Angular from angular.io

    Angular setup

    Installing Angular CLI

    You use the Angular CLI to create projects, generate application and library code, and perform a variety of ongoing development tasks such as testing, bundling, and deployment.

    Install the Angular CLI globally.

    To install the CLI using npm, open a terminal/console window and enter the following command:

    npm install -g @angular/cli
                           
                          
    Create Initial application
  • 1 . Run the CLI command ng new and provide the name my-app, as shown here:
  • ng new my-app
                           
                          
  • 2. The ng new command prompts you for information about features to include in the initial app project. Accept the defaults by pressing the Enter or Return key.
  • Serve Application
  • 1. Go to the workspace folder (my-app).
  • cd my-app
                           
                          
  • 2. Launch the server by using the CLI command ng serve, with the --open option.
  • ng serve --open
                           
                          

    Endless setup

    If you have already download and install node.js and Angular CLI then ignore prerequisites accordingly.

    Prerequisites
    Node.js

    Download latest version of node.js from 20.19 & below 22 version nodejs.org.

  • Install Node.js using downloaded file
  • To check your node version, run node -v in a terminal/console window.
  • Angular CLI

    Install Angular CLI Using:

    npm install -g @angular/cli
                           
                          
    Setup an Endless theme by
    • 1) Download and extract an endless themes from themeforest
    • 2) Extract it and then go in to particular folder in which theme is there.
    • cd  theme-folder
                             
                            
    • 3) Import all dependency by installing npm command
    • npm install
                             
                            
    • 4) Now you are in stage to successfully run endless using below command:
    • ng serve
                             
                            

    Common Issues:

    A common issue which user face during setup
    • 1) If you had not doing "npm i" command for installing all depencies and directly run "ng serve" command you may have following error
    • Solution:
      npm install
                               
                              
    • 2) when running command using "ng serve" you may get sass error as below:
    • Solution:
      npm install node-sass --save-dev 
                               
                              

    Folder Structured

    Here we represent Angular Folder Structure and Style Customize

    • endless
      • public
        • assets
          • audio
          • css
          • data
          • fonts
          • i18n
          • images
          • scss
          • svg
          • .gitkeep
        • favicon.ico
      • src
        • app
          • auth
            • login
              • login.html
              • login.scss
              • login.ts
          • componenet
            • advance
              • image-cropper
              • ngx-dropzone
              • ngx-toastr
              • owl-carousel
              • range-slider
              • sticky
              • sweet-alert
            • base
            • blog
            • button
            • calendar
            • card
            • chart
            • chat
            • contacts
            • dashboard
            • e-commerce
            • editor
            • email
            • faq
            • forms
            • gallery
            • icons
            • jpb-search
            • knowledge-base
            • learning
            • map
            • pricing
            • sample-page
            • search-result
            • social-app
            • support-tickit
            • table
            • timeline
            • to-do
            • ui-element
            • users
            • widgets
          • pages
            • authentication
            • coming-soon
            • error-pages
            • maintenance
          • shared
            • component
            • data
            • directive
            • guard
            • modal
            • routing
            • service
          • app.html
          • app.scss
          • app.ts
          • app.config.ts
          • app.routes.ts
        • environments
          • environment.prod.ts
          • environment.ts
        • fevicon.ico
        • index.html
        • main.ts
        • style.css
      • angular.json
      • package.json
      • tsconfig.app.json
      • tsconfig.json
      • tsconfig.spec.son

    Theme Customize

    Layouts

    We have provided a bunch of page layouts and menu layouts that can be implemented with just a options change to body! Please refer the below table for corresponding classes.

    Layout Options
    Boxed Layout Class:
    box-layout
    RTL Layout Class:
    rtl
    Light layout -
    Dark Page-body Attribute:
    main-theme-layout="main-theme-layout-2"
    Dark Page-body & Sidebar Attribute:
    main-theme-layout="main-theme-layout-3"
    Dark Layout Attribute:
    main-theme-layout="main-theme-layout-4"
    Theme options

    We have some inbuilt themes for sidebar that can be switched with just a class change

    Sidebar Options
    Default Sidebar layout Attribute:
    native-default
    native scroll Attribute:
    native-scroll
    Bordered Navigation Attribute:
    navigation-bordered
    Right Side icons Attribute:
    navigation-rightside
    Background Image Attribute:
    native-image-bg
    Dark Sidebar layout Attribute:
    main-theme-layout="main-theme-layout-1"
    Header options

    We have some inbuilt themes for header that can be switched with just a class change

    Header semilight-bg-color
    Light version bg-default
    Primary version bg-Primary
    secondary version bg-secondary
    danger version bg-danger
    success version bg-success
    info version bg-info

    Ngx-Translate

    Installing and usage
                                  npm i @ngx-translate/core npm i @ngx-translate/http-loader   
                           
                          

    The @ngx-translate/core contains the core routines for the translation: The TranslateService and some pipes.

    The @ngx-translate/http-loader loads the translation files from your webserver.

    Now you have to init the translation TranslateModule in your app.config.ts:

                            
    import { ApplicationConfig } from '@angular/core';
    import { provideRouter } from '@angular/router';
    import { provideAnimations } from '@angular/platform-browser/animations';
    import { provideCharts, withDefaultRegisterables, } from 'ng2-charts';
    import { provideToastr } from 'ngx-toastr';
    import { TranslateHttpLoader } from '@ngx-translate/http-loader';
    import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
    import { HttpClient, provideHttpClient } from '@angular/common/http';
    
    export function HttpLoaderFactory(http: HttpClient) {
      return new TranslateHttpLoader(http, './assets/i18n/', '.json');
    }
    
    import { routes } from './app.routes';
    
    export const appConfig: ApplicationConfig = {
      providers: [
        provideAnimations(),
        provideHttpClient(),
        provideRouter(routes),
        importProvidersFrom(
          TranslateModule.forRoot({
            loader: {
              provide: TranslateLoader,
              useFactory: HttpLoaderFactory,
              deps: [HttpClient]
            }
          }),
        ),
      ]
    };
    
        
                          

    app.html:

                          
    <ul class="language-dropdown onhover-show-div p-20"> <li><a href="javascript:void(0)" data-lng="en" (click)="changeLanguage('en')"><i class="flag-icon flag-icon-is"></i> English</a></li> <li><a href="javascript:void(0)" data-lng="es" (click)="changeLanguage('es')"><i class="flag-icon flag-icon-um"></i> German</a></li> <ul>

    Add TranslateService in app.ts:

                          
        import {Component} from '@angular/core';
        import {TranslateService} from '@ngx-translate/core';
        import { TranslateModule, TranslateService } from '@ngx-translate/core';
        import { CommonModule } from '@angular/common';
        @Component({
            selector: 'app-root',
            imports: [CommonModule,TranslateModule],
            providers:[TranslateService],
            templateUrl: './app.html',
            styleUrls: ['./app.scss']
        })
        export class App {
            constructor(private translate: TranslateService) {
                translate.setDefaultLang('en');
            }      
            public changeLanguage(lang){
              this.translate.use(lang)
            }
        }
                        

    So by doing this you set the default language of your application using translate.setDefaultLang('en'). In a real app you can of course load language from the user's settings.

    Reloading the app now shows an error in the browser console:

    Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:4200/assets/i18n/en.json

    Now we have to make json file accroding to language which we want:
    The JSON translation file

    Now use variable with translate any where in your HTML structureEach language is stored in a separate .json file. Let's create the JSON file for the English translation: assets/i18n/en.json.

              {
              "title": "Translation demo",
              "text": "This is a simple demonstration app for ngx-translate"
            }
    

    To switch language you'll first have to add other language Json file. Let's create a German translation for the demo: assets/i18n/de.json

              {
                "title": "Übersetzungs-Demo",
                "text": "Dies ist eine einfache Applikation um die Funktionen von ngx-transalte zu demonstrieren."
          }
    

    Now use variable with translate any where in your HTML structure

      
    <!-- translation: translation pipe -->
    <h1>{{ 'title' | translate }}</h1>
    <!-- translation: directive (key as attribute)-->
    <p [translate]="'demo.text'"></p>
    <!-- translation: directive (key as content of element) -->
    <p translate>demo.text</p>

    HTML Structured

    Header Structured

    General HTML structure is the same throughout the template. Here is the header structure.

                              <div class="page-main-header">
    <div class="main-header-right row">
    <div class="main-header-left d-lg-none">
    ........
    </div>
    <div class="nav-right col p-0">
    ........
    </div>
    </div>
    </div>
    Content Structured

    Generate endless content area using following structure.

                                  <div class="page-body">
    <div class="container-fluid">
    ........
    </div>
    <!-- Container-fluid starts-->
    <div class="container-fluid">
    .......
    </div>
    <!-- Container-fluid Ends-->
    </div>
    Footer Structured

    Footer structure to complete endless structure.

                                  <footer class="footer">

    <div class="container-fluid">
    .............
    </div>

    </footer>
    Basic UI Elements
    PrimarySecondarySuccessInfoWarningDangerLightDark
                                    <span class="badge badge-primary">Primary</span>
    <span class="badge badge-secondary">Secondary</span>
    <span class="badge badge-success">Success</span>
    <span class="badge badge-info">Info</span>
    <span class="badge badge-warning">Warning</span>
    <span class="badge badge-danger">Danger</span>
    <span class="badge badge-light">Light</span>
    <span class="badge badge-dark tag-pills-sm-mb">Dark</span>
                                    <div class="progress">
    <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
    </div>
    <div class="progress">
    <div class="progress-bar bg-primary" role="progressbar" style="width: 25%" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">
    </div>
    <div class="progress">
    <div class="progress-bar bg-secondary" role="progressbar" style="width: 50%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
    </div>
    <div class="progress">
    <div class="progress-bar bg-success" role="progressbar" style="width: 75%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
    </div>
    <div class="progress">
    <div class="progress-bar bg-info" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
    </div>
                                    <div class="alert alert-primary dark" role="alert">This is a info alert—check it out!</div>
    <div class="alert alert-secondary dark" role="alert">This is a light alert—check it out!</div>
    <div class="alert alert-success dark" role="alert">This is a success alert—check it out!</div>
    <div class="alert alert-info dark" role="alert">This is a danger alert—check it out!</div>
    <div class="alert alert-warning dark" role="alert">This is a secondary alert—check it out!</div>
    <div class="alert alert-danger dark" role="alert">This is a warning alert—check it out!</div>
    <div class="alert alert-light dark" role="alert">This is a dark alert—check it out!</div>
    <div class="alert alert-dark dark" role="alert">This is a dark alert—check it out!</div>
    Dismissible popover
                                    <button type="button" class="btn btn-primary example-popover mr-1" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?"> Click to toggle popover
    </button>
    <a tabindex="0" class="example-popover btn btn-secondary" role="button" data-toggle="popover" data-trigger="focus" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?"> Dismissible popover</a>
    <button type="button" data-trigger="hover" class="example-popover btn btn-success" data-container="body" data-toggle="popover" data-placement="bottom" title="Popover title" data-offset="-20px -20px" data-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus." >On Hover Tooltip</button> </div> <h6> class="p-t-20 p-b-20">To use java script you have to add the following script tag</h6> <div class="card-body"> <!--popover js-->
    <script src="../assets/js/popover-custom.js"> </script>
                                    
    <button type="button" class="example-popover btn btn-primary" placement="top" ngbTooltip="Popover title"> Hover Me </button>

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting,remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting,remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum

                                    
    <ngb-tabset>
    <ngb-tab title="Home">
    <ng-template ngbTabContent>
    <p class="mb-0 m-t-30">Lorem Ipsum is simply dummy text of the printing and typesetting
    industry. Lorem Ipsum has been the industry's standard dummy text ever since the
    1500s, when an unknown printer took a galley of type and scrambled it to make a type
    specimen book. It has survived not only five centuries, but also the leap into
    electronic typesetting,remaining essentially unchanged. It was popularised in the
    1960s with the release of Letraset sheets containing Lorem Ipsum passages,and more
    recently with desktop publishing software like Aldus PageMaker including versions of
    Lorem Ipsum</p>
    </ng-template>
    </ngb-tab>
    <ngb-tab>
    ....
    </ngb-tab>
    <ngb-tab title="Disabled" [disabled]="true">
    ....
    </ngb-tab>
    </ngb-tabset>
    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute,non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et.
    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute,non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et.
    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute,non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et.
                                    
    <div class="card">
    <ngb-accordion [closeOthers]="true" activeIds="static-1">
    <ngb-panel id="static-1" title="Collapsible Group Item #1">
    <ng-template ngbPanelContent>
    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf
    moon officia
    aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf
    moon tempor,
    sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim
    keffiyeh helvetica,
    craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo.
    Leggings
    occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them
    accusamus
    labore sustainable VHS.
    </ng-template>
    </ngb-panel>
    <ngb-panel id="static-2">
    <ng-template ngbPanelTitle>
    <span>Collapsible Group Item #1</span>
    </ng-template>
    <ng-template ngbPanelContent>
    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf
    moon officia
    aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf
    moon tempor,
    sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim
    keffiyeh helvetica,
    craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo.
    Leggings
    occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them
    accusamus
    labore sustainable VHS.
    </ng-template>
    </ngb-panel>
    <ngb-panel id="static-3" title="Collapsible Group Item #3" >
    <ng-template ngbPanelContent>
    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf
    moon officia
    aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf
    moon tempor,
    sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim
    keffiyeh helvetica,
    craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo.
    Leggings
    occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them
    accusamus
    labore sustainable VHS.
    </ng-template>
    </ngb-panel>
    </ngb-accordion>
    </div>
    Larger shadow
    Larger shadow
    Regular shadow
    Regular shadow
    small shadow
    Small shadow
                                      <div class="shadow-lg p-25 shadow-showcase text-center">
    <h6 class="m-0 f-18">Larger shadow</h5>
    </div>
    <h6 class="sub-title mb-5 mt-5">Regular shadow</h6>
    <div class="shadow shadow-showcase p-25 text-center">
    <h6 class="m-0 f-18">Regular shadow</h5>
    </div>
    <h6 class="sub-title mb-5 mt-5">small shadow</h6>
    <div class="shadow-sm shadow-showcase p-25 text-center mb-5">
    <h6 class="m-0 f-18">Small shadow</h5>
    </div>

    Components

    Advance UI Elements
    Sweet Alert

    A beautiful, responsive, customizable, accessible (WAI-ARIA) replacement for JavaScript's popup boxes. Zero dependencies.

    Installing and usage
                                npm install --save sweetalert2
                         
                        
                                    <div class="card-body btn-showcase">
    <button type="button" class="btn btn-primary" (click)="basicAlert()">Basic</button>
    </div>
                                    
      // ES6 Modules or TypeScript
      import { CommonModule } from '@angular/common';
      import { Component, OnInit } from '@angular/core';
      import Swal from 'sweetalert2';
      
      @Component({
        selector: 'app-sweet-alert',
        imports: [CommonModule],
        templateUrl: './sweet-alert.component.html',
        styleUrls: ['./sweet-alert.component.scss']
      })
    
      export class SweetAlertComponent implements OnInit {
      
        constructor() { }
      
        ngOnInit() { }
      
        basicAlert() {
          Swal.fire('Any fool can use a computer')
        }
    
      }
    
      
                              
    DropZone

    This is an Angular wrapper library for the Dropzone. To use this library you should get familiar with the Dropzone documentation as well since this documentation only explains details specific to this wrapper.

    Installing and usage
                                npm i ngx-dropzone-wrapper
                           
                            
                                    
      <div class="card-body">
       <div class="dropzone dropzone-primary" [dropzone]="config1" (error)="onUploadError($event)" (success)="onUploadSuccess($event)">
       </div>
      </div>
       
                                    
    import { CommonModule } from '@angular/common';
    import { Component, OnInit, ViewEncapsulation } from '@angular/core';
    import { DropzoneConfigInterface, DropzoneModule } from "ngx-dropzone-wrapper";
    import { NgxDropzoneChangeEvent } from 'ngx-dropzone';
    
    @Component({
      selector: 'app-ngx-dropzone',
      imports: [CommonModule,DropzoneModule],
      templateUrl: './ngx-dropzone.component.html',
      styleUrls: ['./ngx-dropzone.component.scss'],
      encapsulation: ViewEncapsulation.None
    })
    export class NgxDropzoneComponent implements OnInit {
    
      public config1: DropzoneConfigInterface = {
        url: 'https://httpbin.org/post',
        clickable: true,
        maxFiles: 1,
        addRemoveLinks: true,
        uploadMultiple: false,
        autoReset: null,
        errorReset: null,
        cancelReset: null
      };
    
      public onUploadError(args: any): void { }
    
      public onUploadSuccess(args: any): void { }
    
      ngOnInit() {
      }
    
    }
    
    
    
    Toastr
    Installing and usage
                            npm install ngx-toastr  --save
                           
                          

    Add css in app.scsspage.

                            @import '~ngx-toastr/toastr.css';
                           
                            
                                <div class="card-body btn-showcase">
    <button type="button" class="btn btn-warning" (click)="warning()">Warning</button>
    </div>
                                
    import { CommonModule } from '@angular/common';
    import { Component, OnInit } from '@angular/core';
    import { ToastrModule, ToastrService } from 'ngx-toastr';
    
    @Component({
        selector: 'app-ngx-toastr',
        imports: [CommonModule,ToastrModule],
        templateUrl: './ngx-toastr.component.html',
        styleUrls: ['./ngx-toastr.component.scss']
    })
    export class NgxToastrComponent implements OnInit {
    
        constructor(private toastrService: ToastrService) { }
    
        ngOnInit() { }
    
        // warning Type
        warning() {
            this.toastrService.warning('My name is John Dio. You killed my father, prepare to die!');
        }
    }
      
                                
    import { ApplicationConfig } from '@angular/core';
    import { provideRouter } from '@angular/router';
    import { provideAnimations } from '@angular/platform-browser/animations';
    
    import { provideCharts, withDefaultRegisterables, } from 'ng2-charts';
    import { provideToastr } from 'ngx-toastr';
    
    import { HttpClient, provideHttpClient } from '@angular/common/http';
    
    import { routes } from './app.routes';
    
    export const appConfig: ApplicationConfig = {
      providers: [
        provideAnimations(),
        provideToastr(),
        provideHttpClient(),
        provideCharts(withDefaultRegisterables()),
        provideRouter(routes),
      ]
    };
    
    
    Owl-Carousel
    Installing and usage

    ngx-owl-carousel-o is built for Angular >=20.0.0. It doesn't use jQuery.

                            npm i ngx-owl-carousel-o
     
                            
                                
    <owl-carousel-o [options]="owlcarousel1Options">
      @for(img of owlcarousel1; track img){
       <ng-template carouselSlide class="item">
        <img [src]="[img.img]" alt="" />
       </ng-template>
      }
    </owl-carousel-o>
      
                                
    import { CommonModule } from "@angular/common";
    import { Component, OnInit } from "@angular/core";
    import { CarouselModule } from "ngx-owl-carousel-o";
    
    @Component({
      selector: "app-owl-carousel",
      imports: [CommonModule, CarouselModule],
      templateUrl: "./owl-carousel.html",
      styleUrls: ["./owl-carousel.scss"],
    })
    
    export class OwlCarousel implements OnInit {
    
      constructor() { }
    
      ngOnInit() { }
    
      owlcarousel1 = [
        { img: "assets/images/slider/1.jpg" },
        { img: "assets/images/slider/2.jpg" },
        { img: "assets/images/slider/3.jpg" },
        { img: "assets/images/slider/4.jpg" },
        { img: "assets/images/slider/5.jpg" },
        { img: "assets/images/slider/6.jpg" },
        { img: "assets/images/slider/7.jpg" },
        { img: "assets/images/slider/8.jpg" },
        { img: "assets/images/slider/9.jpg" },
        { img: "assets/images/slider/10.jpg" },
      ];
    
      //Options
      owlcarousel1Options = {
        loop: true,
        margin: 10,
        nav: false,
        responsive: {
          0: {
            items: 1,
          },
          600: {
            items: 3,
          },
          1000: {
            items: 5,
          },
        },
      };
    }
    
      
    Range Slider
    Installing and usage

    Self-contained, mobile friendly slider component for Angular 20+ based on angularjs-slider.

                            npm i @angular-slider/ngx-slider
                            
                                
    <ngx-slider [options]="simpleSliderOptions" [formControl]="simpleSliderControl"></ngx-slider>
    
    
                                
    import { LabelType, NgxSliderModule, Options } from '@angular-slider/ngx-slider';
    import { CommonModule } from '@angular/common';
    import { Component, OnInit } from '@angular/core';
    import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
    
    @Component({
      selector: 'app-range-slider',
      standalone: true,
      imports: [CommonModule,NgxSliderModule,FormsModule,ReactiveFormsModule],
      templateUrl: './range-slider.html',
      styleUrls: ['./range-slider.scss']
    })
    export class RangeSlider implements OnInit {
    
      constructor() { }
    
      ngOnInit() {  }
    
      simpleSliderOptions: Options = {
        floor: 0,
        ceil: 250
      };
    
      simpleSliderControl: FormControl = new FormControl(100);
    
    }
        
        

    Map

    Google Map
    Installing and usage
                              npm install @angular/google-maps --save
                              
                                  <!-- this creates a google map on the page with the given lat/lng from -->
    <google-map width="100%" height="450px" [zoom]="zoom"> @for(marker of markers;track marker){ <map-marker [position]="marker.position" [label]="marker.label"> </map-marker> } </google-map>
                                  
    import { AfterViewInit, Component, OnInit, ViewChild } from "@angular/core";
    import { GoogleMap, GoogleMapsModule } from "@angular/google-maps";
    
    @Component({
      selector: "app-google-map",
      imports: [GoogleMapsModule],
      templateUrl: "./google-map.html",
      styleUrls: ["./google-map.scss"],
    })
    export class GoogleMaps implements OnInit, AfterViewInit {
      public markers: IMapMarker[];
      public markers1: IMapMarker[];
      public zoom: number;
    
      constructor() {
        this.markers = [];
        this.zoom = 2;
      }
    
      ngOnInit() {
        this.markers1.push({
          position: {
            lat: 12.97,
            lng: 77.59,
          },
          label: {
            color: "red",
            text: "Arial",
          },
          Option: {
            draggable: true,
            animation: google.maps.Animation.DROP,
            zoomControl: false,
            mapTypeControl: false,
            streetViewControl: false,
            fullscreenControl: false,
          },
        });
    
        this.markers.push({
          position: {
            lat: 35.717,
            lng: 139.731,
          },
          label: {
            color: "black",
            text: "Madrid",
          },
          Option: {
            draggable: true,
            animation: google.maps.Animation.DROP,
          },
        });
    
        this.markers.push({
          position: {
            lat: 48.8615515,
            lng: 2.3112233,
          },
          label: {
            color: "black",
            text: "Paris",
          },
        });
      }
    
      //Street View
      @ViewChild(GoogleMap) map!: GoogleMap;
    
      ngAfterViewInit() {
        const streetView = this.map.getStreetView();
        streetView.setOptions({
          position: { lat: 38.9938386, lng: -77.2515373 },
          pov: { heading: 70, pitch: -10 },
        });
        streetView.setVisible(true);
        const bounds = this.getBounds(this.markers);
        this.map.googleMap?.fitBounds(bounds);
      }
    
      getBounds(markers: IMapMarker[]): google.maps.LatLngBoundsLiteral {
        if (!markers.length) {
          // Fallback bounds or throw error
          return {
            north: 0,
            south: 0,
            east: 0,
            west: 0,
          };
        }
    
        let north = markers[0].position.lat;
        let south = markers[0].position.lat;
        let east = markers[0].position.lng;
        let west = markers[0].position.lng;
    
        for (const marker of markers) {
          north = Math.max(north, marker.position.lat);
          south = Math.min(south, marker.position.lat);
          east = Math.max(east, marker.position.lng);
          west = Math.min(west, marker.position.lng);
        }
    
        return { north, south, east, west };
      }
    }
                                    
    
    
    
                                
    Ngx-leaflet

    Leaflet packages for Angular. Provides flexible and extensible components for integrating Leaflet v20 into Angular projects. Supports Angular v20,and use in Angular-CLI based projects.

    Installing and usage
                              npm install leaflet
    npm i @bluehalo/ngx-leaflet
                                  
    <div class="map-height" leaflet [leafletOptions]="options1"></div>
    
                                    
    To use java script you have to add the following script tag
                                  //import file in angular.on 
    import { Component, OnInit } from '@angular/core'; import * as L from 'leaflet'; import { HttpClient } from "@angular/common/http"; import { LeafletModule } from '@bluehalo/ngx-leaflet'; import { CommonModule } from '@angular/common'; import { GeoJsonObject } from 'geojson'; @Component({ selector: 'app-leaflet-map', imports: [CommonModule, LeafletModule], templateUrl: './leaflet-map.html', styleUrls: ['./leaflet-map.scss'] }) export class LeafletMap implements OnInit { constructor(private http: HttpClient) { } //First map options options1 = { layers: [ L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' }) ], zoom: 5, center: L.latLng(46.879966, -121.726909) }; layersControl = { baseLayers: { 'Open Street Map': L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' }), 'Open Cycle Map': L.tileLayer('http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' }) }, overlays: { 'Big Circle': L.circle([46.95, -122], { radius: 5000 }), 'Big Square': L.polygon([[46.8, -121.55], [46.9, -121.55], [46.9, -121.7], [46.8, -121.7]]) } } }
    To use java script you have to add the following script tag
                                  //import file in global scss 
    @import "leaflet/dist/leaflet.css";

    Editors

    @ckeditor/ckeditor5-angular

    The CKEditor component for angular(3.x+)

    Installing and usage
                              npm i ngx-editor
                              

                                    
    
    <div class="NgxEditor__Wrapper">
          <ngx-editor-menu [editor]="editor"> </ngx-editor-menu>
          <ngx-editor [editor]="editor" [ngModel]="html" [disabled]="false" [placeholder]="'Type here...'"></ngx-editor>                    
    </div>
                                    
                                  
    import { CommonModule } from '@angular/common'; import { Component, OnInit } from '@angular/core'; import { AngularEditorModule } from '@kolkov/angular-editor'; import { FormsModule } from '@angular/forms'; import { Editor, NgxEditorModule } from 'ngx-editor'; @Component({ selector: 'app-editor' imports: [CommonModule, AngularEditorModule, FormsModule, NgxEditorModule], templateUrl: './editor.html', styleUrls: ['./editor.scss'] }) export class AngularEditorConfig implements OnInit { public editor: Editor; public html = ''; constructor() { } ngOnInit(): void { this.editor = new Editor(); } // make sure to destory the editor ngOnDestroy(): void { this.editor.destroy(); } }
    Kolkov Editors

    A simple native wysiwyg editor for Angular 20

    Installing and usage
                              npm install @kolkov/angular-editor --save
                              

                                  
    <angular-editor [placeholder]="'Enter text here...'" [(ngModel)]="htmlContent" [config]="editorConfig"></angular-editor>
    
                                  
                                  
    import { CommonModule } from '@angular/common';
    import { Component, OnInit } from '@angular/core';
    import { AngularEditorConfig, AngularEditorModule } from '@kolkov/angular-editor';
    import { FormsModule } from '@angular/forms';
    import { Editor, NgxEditorModule } from 'ngx-editor';
    
    @Component({
      selector: 'app-editor',
      imports: [CommonModule, AngularEditorModule, FormsModule, NgxEditorModule],
      templateUrl: './editor.html',
      styleUrls: ['./editor.scss']
    })
    
    export class Editor implements OnInit {
    
      public htmlContent = '';
      public editor: Editor;
    
      constructor() { }
    
      editorConfig: AngularEditorConfig = {
        editable: true,
          spellcheck: true,
          height: 'auto',
          minHeight: '0',
          maxHeight: 'auto',
          width: 'auto',
          minWidth: '0',
          translate: 'yes',
          enableToolbar: true,
          showToolbar: true,
          placeholder: 'Enter text here...',
          defaultParagraphSeparator: '',
          defaultFontName: '',
          defaultFontSize: '',
          fonts: [
            {class: 'arial', name: 'Arial'},
            {class: 'times-new-roman', name: 'Times New Roman'},
            {class: 'calibri', name: 'Calibri'},
            {class: 'comic-sans-ms', name: 'Comic Sans MS'}
          ],
          customClasses: [
          {
            name: 'quote',
            class: 'quote',
          },
          {
            name: 'redText',
            class: 'redText'
          },
          {
            name: 'titleText',
            class: 'titleText',
            tag: 'h1',
          },
        ],
      }
    }
    
    

    Cards

                                
    <div class="container-fluid">
    <div class="row">
    <div class="col-sm-12 col-xl-6">
    <div class="card">
    <div class="card-header">
    <h5>Basic Card</h5>
    </div>
    <div class="card-body">
    <p class="mb-0"> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
    Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer
    took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and
    typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the
    1500s, when an unknown printer took a galley of type and scrambled. </p>
    </div>
    </div>
    </div>
    </div>
                                    
    <div class="container-fluid">
    <div class="row">
    <div class="col-sm-12 col-xl-6">
    <div class="card ">
    <div class="card-header b-l-primary">
    <h5>Border left</h5>
    </div>
    <div class="card-body">
    <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been
    the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley
    of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting
    industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an
    unknown printer took a galley of type and scrambled.</p>
    </div>
    </div>
    </div>
    </div>
    </div>
                                    
    <div class="container-fluid">
    <div class="row">
    <div class="col-xl-6 xl-100 col-lg-12">
    <div class="card">
    <div class="card-header">
    <h5 class="pull-left">Simple Tab</h5>
    </div>
    <div class="card-body">
    <ngb-tabset type="pills" class="tabbed-card">
    <ngb-tab title="Home" class="pull-right nav nav-pills nav-primary">
    <ng-template ngbTabContent class="tab-content">
    <div class="tab-pane fade show">
    <p>
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
    Ipsum is simply dummy text of the printing and typesetting industry. text ever
    since the 1500s, when an unknown printer took a galley of type and scrambled it
    to make a type specimen book. It has survived not only five centuries, but also
    the leap into electronic typesetting, remaining essentially unchanged. It was
    popularised in the 1960s with the release of Letraset sheets containing Lorem
    Ipsum passages, and more recently with desktop publishing software like Aldus
    PageMaker including versions of Lorem Ipsum
    </p>
    </div>
    </ng-template>
    </ngb-tab>
    <ngb-tab>
    <ng-template ngbTabTitle class="pull-right nav nav-pills nav-primary">Profile</ng-template>
    <ng-template ngbTabContent class="tab-content">
    <div class="tab-pane fade show">
    <p>
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. dummy
    text of the printing and typesetting industry. since the 1500s, when an unknown
    printer took a galley of type and scrambled it to make a type specimen book. It
    has survived not only five centuries, but also the leap into electronic
    typesetting, remaining essentially unchanged. It was popularised in the 1960s
    with the release of Letraset sheets containing Lorem Ipsum passages, and more
    recently with desktop publishing software like Aldus PageMaker including
    versions of Lorem Ipsum
    </p>
    </div>
    </ng-template>
    </ngb-tab>
    <ngb-tab title="Contact" ngbTabTitle class="pull-right nav nav-pills nav-primary">
    <ng-template ngbTabContent class="tab-content">
    <div class="tab-pane fade show">
    <p>
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
    Ipsum has been the industry's standard dummy text ever since the 1500s, when an
    unknown printer took a galley of type and scrambled it to make a type specimen
    book. It has survived not only five centuries, but also the leap into electronic
    typesetting, remaining essentially unchanged. It was popularised in the 1960s
    with the release of Letraset sheets containing Lorem Ipsum passages, and more
    recently with desktop publishing software like Aldus PageMaker including
    versions of Lorem Ipsum
    </p>
    </div>
    </ng-template>
    </ngb-tab>
    </ngb-tabset>
    </div>
    </div>
    </div>
    </div>
    </div>

    Charts

    Ng-chartist
    Installing and usage
                              npm i --save ng-chartist chartist
                              
                                  
    <x-chartist [configuration]="chart1"></x-chartist>
    
    
                                
    import { Component, OnInit, ViewEncapsulation } from '@angular/core';
    import * as chartData from '../../../shared/data/chart/chartist';
    import { ChartistModule } from 'ng-chartist';
    import { CommonModule } from '@angular/common';
    
    @Component({
      selector: 'app-chartist',
      imports: [CommonModule, ChartistModule],
      templateUrl: './chartist.html',
      styleUrls: ['./chartist.scss'],
      encapsulation: ViewEncapsulation.None
    })
    
    export class Chartist {
    
      constructor() { }
    
      public chart1 = chartData.chart1;
    
    }
    
      
                                
                                      //data 
    export var chart1: Chart = {
      type: "Line",
      data: {
        labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
        series: [
          [12, 9, 7, 8, 5, 4, 6, 2, 3, 3, 4, 6],
          [4, 5, 3, 7, 3, 5, 5, 3, 4, 4, 5, 5],
          [5, 3, 4, 5, 6, 3, 3, 4, 5, 6, 3, 4],
          [3, 4, 5, 6, 7, 6, 4, 5, 6, 7, 6, 3],
        ],
      },
      options: {
        low: 0,
        showArea: false,
        fullWidth: true,
        height: 450,
      },
     
    };
        
        
    Ng2-charts
    Installing and usage
                                  npm i ng2-charts
                              
                                      
       <canvas baseChart class="chart" [datasets]="barChartData" [labels]="barChartLabels"
       [options]="barChartOptions" [legend]="barChartLegend"
       [type]="barChartType" (chartHover)="chartHovered($event)"
       (chartClick)="chartClicked($event)"></canvas>
      
      
                                        
                                      
    import { Component, ViewEncapsulation } from '@angular/core';
    import * as chartData from '../../../shared/data/chart/chartjs';
    import { BaseChartDirective } from 'ng2-charts';
    import { CommonModule } from '@angular/common';
    
    @Component({
      selector: 'app-chartjs',
      standalone: true,
      imports: [CommonModule, BaseChartDirective],
      templateUrl: './chartjs.html',
      styleUrls: ['./chartjs.scss'],
      encapsulation:ViewEncapsulation.None
    })
    export class chartjs3 {
    
      constructor() { }
    
      // barChart
      public barChartOptions = chartData.barChartOptions;
      public barChartLabels = chartData.barChartLabels;
      public barChartType = chartData.barChartType;
      public barChartLegend = chartData.barChartLegend;
      public barChartData = chartData.barChartData;
      public barChartColors = chartData.barChartColors; 
    }
        
        
                                      
     // barChart
    export var barChartOptions: barChartOption = {
      scaleShowVerticalLines: false,
      responsive: true
    };
    export var barChartLabels: string[] = ["January", "February", "March", "April", "May", "June", "July"];
    export var barChartType :string = 'bar';
    export var barChartLegend = false;
    export var barChartData: ChartistSeries[] = [
      { data: [35, 59, 80, 81, 56, 55, 40], label: 'Series A' },
      { data: [28, 48, 40, 19, 86, 27, 90], label: 'Series B' }
    ];
    export var barChartColors: BarChartColor[] = [
      {
        backgroundColor: '#4466f2',
        borderColor: "rgba(30, 166, 236, 0.8)",
        borderWidth: 1,
      },
      {
        backgroundColor: '#1ea6ec',
        borderColor: "rgba(68, 102, 242, 0.8)",
        borderWidth: 1,
      },
    ];
      
                                
                                      
    import { ApplicationConfig } from '@angular/core';
    import { provideRouter } from '@angular/router';
    import { provideAnimations } from '@angular/platform-browser/animations';
    import { provideCharts, withDefaultRegisterables, } from 'ng2-charts';
    
    import { provideToastr } from 'ngx-toastr';
    
    import { HttpClient, provideHttpClient } from '@angular/common/http';
    
    import { routes } from './app.routes';
    
    export const appConfig: ApplicationConfig = {
      providers: [
        provideAnimations(),
        provideToastr(),
        provideHttpClient(),
        provideCharts(withDefaultRegisterables()),
        provideRouter(routes),
      ]
    };
    
      
                                
    Ng2-google-charts
    Installing and usage
                                  npm i ng2-google-charts
                              
                                      
    <google-chart [data]="pieChart1"></google-chart>
                                      
                                
                                      
    import { Component } from '@angular/core';
    import * as chartData from '../../../shared/data/chart/google-chart';
    import { CommonModule } from '@angular/common';
    import { Ng2GoogleChartsModule } from 'ng2-google-charts';
    
    @Component({
      selector: 'app-google',
      imports: [CommonModule,Ng2GoogleChartsModule],
      templateUrl: './google.html',
      styleUrls: ['./google.scss']
    })
    
    export class Google {
    
      // Pie Chart
      public pieChart1 = chartData.pieChart1;
      public pieChart2 = chartData.pieChart2;
      public pieChart3 = chartData.pieChart3;
      public pieChart4 = chartData.pieChart4;
    }
      
                                
                                      
    export var pieChart1 = {
      chartType: 'PieChart',
      dataTable: [
        ['Task', 'Hours per Day'],
        ['Work', 5],
        ['Eat', 10],
        ['Commute', 15],
        ['Watch TV', 20],
        ['Sleep', 25]
      ],
      options: {
        title: 'My Daily Activities',
        width: '100%',
        height: 400,
        colors: ["#4466f2", "#1ea6ec", "#22af47", "#007bff", "#FF5370"],
        backgroundColor:'transparent'
      },
    };
      
                                
    Ngx-charts
    Installing and usage
                                  npm i @swimlane/ngx-graph
                              
                                      
    <ngx-charts-bar-vertical [scheme]="barChartColorScheme" [results]="barChartsingle"
     [gradient]="barChartGradient" [xAxis]="barChartShowXAxis" [yAxis]="barChartShowYAxis"
     [legend]="barChartShowLegend" [showXAxisLabel]="barChartShowXAxisLabel"
     [showYAxisLabel]="barChartShowYAxisLabel" [xAxisLabel]="barChartXAxisLabel"
     [yAxisLabel]="barChartYAxisLabel" [roundEdges]="false" (select)="onSelect($event)">
    </ngx-charts-bar-vertical>
      
      
                                
                                        
    import { Component, OnInit } from '@angular/core';
    import { barChartSingle, pieChart, multiData, single } from '../../../shared/data/chart/ngx-chart';
    import * as graphoptions from '../../../shared/data/chart/config';
    import { CommonModule } from '@angular/common';
    import { NgxChartsModule } from '@swimlane/ngx-charts';
    
    @Component({
      selector: 'app-ngx-chart',
      imports: [CommonModule,NgxChartsModule],
      templateUrl: './ngx-chart.html',
      styleUrls: ['./ngx-chart.scss']
    })
    
    export class NgxChart implements OnInit {
    
      ngOnInit() { }
    
      // Bar-chart options
      public barChartShowYAxis = graphoptions.barChartShowYAxis;
      public barChartShowXAxis = graphoptions.barChartShowXAxis;
      public barChartGradient = graphoptions.barChartGradient;
      public barChartShowLegend = graphoptions.barChartShowLegend;
      public barChartShowXAxisLabel = graphoptions.barChartShowXAxisLabel;
      public barChartXAxisLabel = graphoptions.barChartXAxisLabel;
      public barChartShowYAxisLabel = graphoptions.barChartShowYAxisLabel;
      public barChartYAxisLabel = graphoptions.barChartYAxisLabel;
      public barChartColorScheme = graphoptions.barChartColorScheme;
      public barChartshowGridLines = graphoptions.barChartshowGridLines;
    }
      
                                
                                      
    export var barChartShowXAxis = true;
    export var barChartShowYAxis = true;
    export var barChartGradient = true;
    export var barChartShowLegend = false;
    export var barChartShowXAxisLabel = true;
    export var barChartXAxisLabel = 'Country';
    export var barChartShowYAxisLabel = true;
    export var barChartYAxisLabel = 'Population';
    export var roundEdges: boolean = true;
    export var barChartshowGridLines = false;
    export var barChartColorScheme :any = {
        domain: ["#007bff", "#ff9f40", "#ff5370", "#1ea6ec"]
    };
    
      
                                

    Tables

    NGX-DataTable

    Simple table extension with sorting, filtering, paging... for Angular apps.

    Installing and usage
                                npm install @ng-bootstrap/ng-bootstrap
                                
                                    <form>
    <div class="mb-3 row">
      <label for="table-complete-search" class="col-xs-3 col-sm-auto col-form-label">Full text search:</label>
      <div class="col-xs-3 col-sm-auto">
        <input
          id="table-complete-search"
          type="text"
          class="form-control"
          name="searchTerm"
          [(ngModel)]="service.searchTerm"
        />
      </div>
      @if (service.loading$ | async) {
        <span class="col col-form-label">Loading...</span>
      }
    </div>
    
    <table class="table table-striped">
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col" sortable="name" (sort)="onSort($event)">Country</th>
          <th scope="col" sortable="area" (sort)="onSort($event)">Area</th>
          <th scope="col" sortable="population" (sort)="onSort($event)">Population</th>
        </tr>
      </thead>
      <tbody>
        @for (country of countries$ | async; track country.id) {
          <tr>
            <th scope="row">{{ country.id }}</th>
            <td>
              <img
                [src]="'https://upload.wikimedia.org/wikipedia/commons/' + country.flag"
                [alt]="'The flag of ' + country.name"
                class="me-2"
                style="width: 20px"
              />
              <ngb-highlight [result]="country.name" [term]="service.searchTerm" />
            </td>
            <td><ngb-highlight [result]="country.area | number" [term]="service.searchTerm" /></td>
            <td><ngb-highlight [result]="country.population | number" [term]="service.searchTerm" /></td>
          </tr>
        } @empty {
          <tr>
            <td colspan="4" style="text-align: center">No countries found</td>
          </tr>
        }
      </tbody>
    </table>
    
    <div class="d-flex justify-content-between p-2">
      <ngb-pagination [collectionSize]="(total$ | async)!" [(page)]="service.page" [pageSize]="service.pageSize">
      </ngb-pagination>
    
      <select class="form-select" style="width: auto" name="pageSize" [(ngModel)]="service.pageSize">
        <option [ngValue]="2">2 items per page</option>
        <option [ngValue]="4">4 items per page</option>
        <option [ngValue]="6">6 items per page</option>
      </select>
    </div>
        import { AsyncPipe, DecimalPipe } from '@angular/common';
    import { Component, QueryList, ViewChildren } from '@angular/core';
    import { Observable } from 'rxjs';
    
    import { Country } from './country';
    import { CountryService } from './country.service';
    import { NgbdSortableHeader, SortEvent } from './sortable.directive';
    import { FormsModule } from '@angular/forms';
    import { NgbHighlight, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
    
    @Component({
    	selector: 'ngbd-table-complete',
    	imports: [DecimalPipe, FormsModule, AsyncPipe, NgbHighlight, NgbdSortableHeader, NgbPaginationModule],
    	templateUrl: './table-complete.html',
    	providers: [CountryService, DecimalPipe],
    })
    export class NgbdTableComplete {
    	countries$: Observable;
    	total$: Observable;
    
    	@ViewChildren(NgbdSortableHeader) headers: QueryList;
    
    	constructor(public service: CountryService) {
    		this.countries$ = service.countries$;
    		this.total$ = service.total$;
    	}
    
    	onSort({ column, direction }: SortEvent) {
    		// resetting other headers
    		this.headers.forEach((header) => {
    			if (header.sortable !== column) {
    				header.direction = '';
    			}
    		});
    
    		this.service.sortColumn = column;
    		this.service.sortDirection = direction;
    	}
    } 
        
    import { Injectable, PipeTransform } from '@angular/core';
    
    import { BehaviorSubject, Observable, of, Subject } from 'rxjs';
    
    import { Country } from './country';
    import { COUNTRIES } from './countries';
    import { DecimalPipe } from '@angular/common';
    import { debounceTime, delay, switchMap, tap } from 'rxjs/operators';
    import { SortColumn, SortDirection } from './sortable.directive';
    
    interface SearchResult {
    	countries: Country[];
    	total: number;
    }
    
    interface State {
    	page: number;
    	pageSize: number;
    	searchTerm: string;
    	sortColumn: SortColumn;
    	sortDirection: SortDirection;
    }
    
    const compare = (v1: string | number, v2: string | number) => (v1 < v2 ? -1 : v1 > v2 ? 1 : 0);
    
    function sort(countries: Country[], column: SortColumn, direction: string): Country[] {
    	if (direction === '' || column === '') {
    		return countries;
    	} else {
    		return [...countries].sort((a, b) => {
    			const res = compare(a[column], b[column]);
    			return direction === 'asc' ? res : -res;
    		});
    	}
    }
    
    function matches(country: Country, term: string, pipe: PipeTransform) {
    	return (
    		country.name.toLowerCase().includes(term.toLowerCase()) ||
    		pipe.transform(country.area).includes(term) ||
    		pipe.transform(country.population).includes(term)
    	);
    }
    
    @Injectable({ providedIn: 'root' })
    export class CountryService {
    	private _loading$ = new BehaviorSubject(true);
    	private _search$ = new Subject();
    	private _countries$ = new BehaviorSubject([]);
    	private _total$ = new BehaviorSubject(0);
    
    	private _state: State = {
    		page: 1,
    		pageSize: 4,
    		searchTerm: '',
    		sortColumn: '',
    		sortDirection: '',
    	};
    
    	constructor(private pipe: DecimalPipe) {
    		this._search$
    			.pipe(
    				tap(() => this._loading$.next(true)),
    				debounceTime(200),
    				switchMap(() => this._search()),
    				delay(200),
    				tap(() => this._loading$.next(false)),
    			)
    			.subscribe((result) => {
    				this._countries$.next(result.countries);
    				this._total$.next(result.total);
    			});
    
    		this._search$.next();
    	}
    
    	get countries$() {
    		return this._countries$.asObservable();
    	}
    	get total$() {
    		return this._total$.asObservable();
    	}
    	get loading$() {
    		return this._loading$.asObservable();
    	}
    	get page() {
    		return this._state.page;
    	}
    	get pageSize() {
    		return this._state.pageSize;
    	}
    	get searchTerm() {
    		return this._state.searchTerm;
    	}
    
    	set page(page: number) {
    		this._set({ page });
    	}
    	set pageSize(pageSize: number) {
    		this._set({ pageSize });
    	}
    	set searchTerm(searchTerm: string) {
    		this._set({ searchTerm });
    	}
    	set sortColumn(sortColumn: SortColumn) {
    		this._set({ sortColumn });
    	}
    	set sortDirection(sortDirection: SortDirection) {
    		this._set({ sortDirection });
    	}
    
    	private _set(patch: Partial) {
    		Object.assign(this._state, patch);
    		this._search$.next();
    	}
    
    	private _search(): Observable {
    		const { sortColumn, sortDirection, pageSize, page, searchTerm } = this._state;
    
    		// 1. sort
    		let countries = sort(COUNTRIES, sortColumn, sortDirection);
    
    		// 2. filter
    		countries = countries.filter((country) => matches(country, searchTerm, this.pipe));
    		const total = countries.length;
    
    		// 3. paginate
    		countries = countries.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);
    		return of({ countries, total });
    	}
    }
                                          
        
    import { Country } from './country';
    
    export const COUNTRIES: Country[] = [
    	{
    		id: 1,
    		name: 'Russia',
    		flag: 'f/f3/Flag_of_Russia.svg',
    		area: 17075200,
    		population: 146989754,
    	},
    	{
    		id: 2,
    		name: 'France',
    		flag: 'c/c3/Flag_of_France.svg',
    		area: 640679,
    		population: 64979548,
    	},
    	{
    		id: 3,
    		name: 'Germany',
    		flag: 'b/ba/Flag_of_Germany.svg',
    		area: 357114,
    		population: 82114224,
    	},
    	{
    		id: 4,
    		name: 'Portugal',
    		flag: '5/5c/Flag_of_Portugal.svg',
    		area: 92090,
    		population: 10329506,
    	},
    	{
    		id: 5,
    		name: 'Canada',
    		flag: 'c/cf/Flag_of_Canada.svg',
    		area: 9976140,
    		population: 36624199,
    	},
    	{
    		id: 6,
    		name: 'Vietnam',
    		flag: '2/21/Flag_of_Vietnam.svg',
    		area: 331212,
    		population: 95540800,
    	},
    	{
    		id: 7,
    		name: 'Brazil',
    		flag: '0/05/Flag_of_Brazil.svg',
    		area: 8515767,
    		population: 209288278,
    	},
    	{
    		id: 8,
    		name: 'Mexico',
    		flag: 'f/fc/Flag_of_Mexico.svg',
    		area: 1964375,
    		population: 129163276,
    	},
    	{
    		id: 9,
    		name: 'United States',
    		flag: 'a/a4/Flag_of_the_United_States.svg',
    		area: 9629091,
    		population: 324459463,
    	},
    	{
    		id: 10,
    		name: 'India',
    		flag: '4/41/Flag_of_India.svg',
    		area: 3287263,
    		population: 1324171354,
    	},
    	{
    		id: 11,
    		name: 'Indonesia',
    		flag: '9/9f/Flag_of_Indonesia.svg',
    		area: 1910931,
    		population: 263991379,
    	},
    	{
    		id: 12,
    		name: 'Tuvalu',
    		flag: '3/38/Flag_of_Tuvalu.svg',
    		area: 26,
    		population: 11097,
    	},
    	{
    		id: 13,
    		name: 'China',
    		flag: 'f/fa/Flag_of_the_People%27s_Republic_of_China.svg',
    		area: 9596960,
    		population: 1409517397,
    	},
    ];
                                          
        
    export interface Country {
    	id: number;
    	name: string;
    	flag: string;
    	area: number;
    	population: number;
    }
                                          
        
    import { Directive, EventEmitter, Input, Output } from '@angular/core';
    import { Country } from './country';
    
    export type SortColumn = keyof Country | '';
    export type SortDirection = 'asc' | 'desc' | '';
    const rotate: { [key: string]: SortDirection } = { asc: 'desc', desc: '', '': 'asc' };
    
    export interface SortEvent {
    	column: SortColumn;
    	direction: SortDirection;
    }
    
    @Directive({
    	selector: 'th[sortable]',
    	standalone: true,
    	host: {
    		'[class.asc]': 'direction === "asc"',
    		'[class.desc]': 'direction === "desc"',
    		'(click)': 'rotate()',
    	},
    })
    export class NgbdSortableHeader {
    	@Input() sortable: SortColumn = '';
    	@Input() direction: SortDirection = '';
    	@Output() sort = new EventEmitter();
    
    	rotate() {
    		this.direction = rotate[this.direction];
    		this.sort.emit({ column: this.sortable, direction: this.direction });
    	}
    }
                                          

    Apps

    E-commerce
    Chat
    To-D0
    Email
    Bookmark
    Calender
    Installing and usage
                                    npm install --save angular-calendar date-fns
                            

    Add following import statement in your app.config.ts and then use calender app as per your wish.

                                        
    import { ApplicationConfig, importProvidersFrom } from '@angular/core';
    import { provideRouter } from '@angular/router';
    import { provideAnimations } from '@angular/platform-browser/animations';
    
    import { CalendarModule, DateAdapter } from 'angular-calendar';
    import { adapterFactory } from 'angular-calendar/date-adapters/date-fns';
    
    import { TranslateHttpLoader } from '@ngx-translate/http-loader';
    import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
    
    import { HttpClient, provideHttpClient } from '@angular/common/http';
    
    import { routes } from './app.routes';
    
    export const appConfig: ApplicationConfig = {
      providers: [
        provideAnimations(),
        provideHttpClient(),
        provideRouter(routes),
        importProvidersFrom(
          CalendarModule.forRoot({
            provide: DateAdapter,
            useFactory: adapterFactory
          }),
        ),
      ]
    };
    
                                  
    Others
    There are many others application in endless which is help you in improve your knowledge and solve your issues.
  • Knowledge Base
  • Job Search
  • Learning
  • Social App
  • Thank You

    Basically Our team will support in
  • Answering your questions, problems regarding theme with best to solving before 24 working hours,once you generate a ticket.
  • Solution of Reported Bug
  • Update you with latest version of theme
  • Apart from that, if you needs any extra / customization work then also you can get in touch with our experts by raising ticket to help you in customize with affordable extra budget.

    Once again thank you for purchasing one of our Templates , if you like our Templates please rate us

    Best Regards

    Pixelstrap

    Hand crafted & made with