Angular v18 - pie chart not visible

Discussão em 'Angular' iniciado por Fantastic four, Janeiro 23, 2025.

  1. I have upgraded my code from angular v9 to v18, but I am unable to view pie charts now.

    Below is the ts,

    import { Component, OnInit } from '@angular/core';
    import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts';
    import { Chart, registerables } from 'chart.js';
    import { ChartType, ChartOptions } from 'chart.js'; // Use chart.js for these types
    import moment from 'moment'; // Use default import for moment.js
    import { CampaignService } from 'Services/Campaign/campaign.service';
    import { CampaignsDetails, DeviceStatus, PieChartData } from 'Classes/Campaign/campaign';
    import { ActivatedRoute } from '@angular/router';
    import { ValidationService } from 'Services/Validation/validation.service';

    interface status {
    type: string;
    deviceId: string;
    passed: number;
    failed: number;
    }

    const deviceStatus: status[] = [
    {
    type: 'Mobile',
    deviceId: 'as2uu',
    passed: 121,
    failed: 12
    },
    {
    type: 'Box',
    deviceId: 'asjkd43as',
    passed: 112,
    failed: 18
    }
    ];

    Chart.register(...registerables);

    @Component({
    selector: 'campaigniterationoverview',
    templateUrl: './campaign-iteration-overview.component.html',
    styleUrls: ['./campaign-iteration-overview.component.css']
    })
    export class CampaignIterationOverviewComponent implements OnInit {
    deviceStatus = deviceStatus;
    test_total = null;
    test_failed = null;
    test_passed = null;
    test_skipped = null;
    overviewDateBegin: any = null;
    overviewDateEnd: any = null;
    duration = null;
    campName = null;
    campBranch = null;
    failureData: any = null;
    ErrorData: any = null;
    deviceData: any = null;
    dataLoaded = false;
    failureEmpty = false;
    errorEmpty = false;
    status = [];
    campView = '';
    campaignId = null;
    dateBegin: any = null;
    dateEnd: any = null;
    validationData: any = [];

    // Doughnut chart data and labels
    public doughnutChartData: number[] = null;
    public doughnutChartLabels: string[] = ['Number of test cases failed', 'Number of test cases passed', 'Number of test cases skipped', 'Number of test cases executed'];
    public doughnutChartType: ChartType = 'doughnut';

    // Pie chart options, data, and labels
    public pieChartOptions: ChartOptions = { responsive: true };
    public pieChartType: ChartType = 'pie';
    public pieChartLegend = true;
    public pieChartPlugins = [];
    public pieChartLabels: string[] = null;
    public pieChartData: number[] = null;
    public pieChartLabels2: string[] = null;
    public pieChartData2: number[] = null;

    constructor(
    public CampaignService: CampaignService,
    public ValidationService: ValidationService,
    private route: ActivatedRoute
    ) { }

    ngOnInit(): void {
    console.log("overview init");
    this.campName = this.route.snapshot.params['camp_name'];
    this.campBranch = this.route.snapshot.params['camp_branch'];
    this.campView = this.route.snapshot.params['camp_view'];
    this.dateBegin = this.route.snapshot.params['camp_begin'];
    this.campaignId = this.route.snapshot.params['campaign_id'];

    this.loadData();
    }

    loadData() {
    console.log("load data");
    this.dataLoaded = false;
    let campaign_name = this.campName;
    let branch = this.campBranch;
    let type = this.campView;

    return this.ValidationService.getCampaignDetails(campaign_name, branch, type).subscribe((result: CampaignsDetails) => {
    this.validationData = result.campaigns;
    console.log("validation data ", this.validationData);
    this.loadOverviewData();
    },
    err => { console.log('Error --> ', err) })
    }

    loadOverviewData() {
    console.log("load overview data ");
    let temp = this.dateBegin;
    console.log("temp ", temp);
    console.log("validation data ", this.validationData);
    this.validationData.forEach(element => {
    if (element.begin === temp) {
    this.test_passed = element.tests_passed;
    this.test_failed = element.tests_failed;
    this.test_skipped = element.tests_skipped;
    this.test_total = element.tests_total;
    this.dateEnd = element.end;
    }
    });
    this.resolveOverviewData();
    }

    resolveOverviewData() {
    console.log("resolve overview data ");
    if (this.test_failed === undefined) {
    this.test_failed = 0;
    this.test_total = this.test_passed + this.test_skipped;
    }
    if (this.test_passed === undefined) {
    this.test_passed = 0;
    this.test_total = this.test_failed + this.test_skipped;
    }
    if (this.test_skipped === undefined) {
    this.test_skipped = 0;
    this.test_total = this.test_failed + this.test_passed;
    }
    this.overviewDateBegin = moment(this.dateBegin).format('MMMM Do YYYY, h:mm:ss a');
    this.overviewDateEnd = moment(this.dateEnd).format('MMMM Do YYYY, h:mm:ss a');
    var date1 = moment(this.dateBegin);
    var date2 = moment(this.dateEnd);
    this.duration = moment.utc(moment(date2, "DD/MM/YYYY HH:mm:ss").diff(moment(date1, "DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss");

    // Set data for doughnut chart
    this.doughnutChartData = [this.test_failed, this.test_passed, this.test_skipped, this.test_total];
    this.getFailureCategory();
    }

    getFailureCategory() {
    return this.CampaignService.getFailureCategory(this.campaignId).subscribe((result: PieChartData) => {
    this.failureData = result;

    if (this.failureData !== null && this.failureData !== undefined) {
    this.pieChartLabels = this.failureData.labels;
    this.pieChartData = this.failureData.values;
    if (this.pieChartLabels.length === 0) {
    this.pieChartLabels.push('No data to display');
    this.pieChartData.push(0);
    }
    this.getFailureError();
    }
    },
    err => { console.log('Error --> ', err) });
    }

    getFailureError() {
    return this.CampaignService.getFailureError(this.campaignId).subscribe((result: PieChartData) => {
    this.ErrorData = result;

    if (this.ErrorData !== null && this.ErrorData !== undefined) {
    this.pieChartLabels2 = this.ErrorData.labels;
    this.pieChartData2 = this.ErrorData.values;
    if (this.pieChartLabels2.length === 0) {
    this.pieChartLabels2.push('No data to display');
    this.pieChartData2.push(0);
    }
    this.getDeviceStatus();
    }
    },
    err => {});
    }

    getDeviceStatus() {
    return this.CampaignService.getDeviceStatus(this.campaignId).subscribe((result: DeviceStatus[]) => {
    this.deviceData = result;
    this.dataLoaded = true;
    },
    err => {});
    }
    }`


    Below is my HTML,

    <div style="margin-top: 2%;">
    <campaigniterationsidebar></campaigniterationsidebar>
    <div class="card divRight">
    <div class="card-body">
    <h2 class="card-title">Global Overview</h2>
    <!-- <div style="float: left;"> -->
    <div class="spinner-border text-primary" role="status" [hidden]="dataLoaded"></div>
    <div style="float: left;" *ngIf="dataLoaded">
    <p class="card-text"><u><i>Campaign</i></u> : <b>{{ campName }}</b></p>
    <p class="card-text"><u><i>Branch</i></u> : <b>{{ campBranch }}</b></p>
    <p class="card-text"><u><i>Begin Date</i></u> : <b>{{ overviewDateBegin }}</b></p>
    <p class="card-text"><u><i>End Date</i></u> : <b>{{ overviewDateEnd }}</b></p>
    <p class="card-text"><u><i>Duration</i></u> : <b>{{ duration }}</b></p>
    <p class="card-text"><u><i>Number of test cases passed</i></u> : <b>{{ test_passed }}</b></p>
    <p class="card-text"><u><i>Number of test cases failed</i></u> : <b>{{ test_failed }}</b></p>
    <p class="card-text"><u><i>Number of test cases skipped</i></u> : <b>{{ test_skipped }}</b></p>
    <p class="card-text"><u><i>Number of test cases executed</i></u> : <b>{{ test_total }}</b></p>
    </div>
    <!-- <div style="display: block; width: 50%; height: 50%; float: right;"> -->
    <div style="display: block; width: 50%; height: 50%; float: right;" *ngIf="dataLoaded">
    <canvas baseChart [data]="doughnutChartData" [labels]="doughnutChartLabels" [type]="doughnutChartType">
    </canvas>
    </div>
    </div>
    </div>


    <div class="divRightBelow">
    <div class="col-sm-6" style="float: left; margin-bottom: 2%;">
    <div class="card">
    <div class="card-body">
    <h2 class="card-title" >Failure distribution by error type </h2>
    <div class="spinner-border text-primary" role="status" [hidden]="dataLoaded"></div>
    <div class="divCard" *ngIf="dataLoaded">

    <canvas baseChart [data]="pieChartData2" [labels]="pieChartLabels2" [type]="pieChartType"
    [options]="pieChartOptions" [plugins]="pieChartPlugins" [legend]="pieChartLegend">
    </canvas>
    </div>
    </div>
    </div>
    </div>
    <div class="col-sm-6" style="float: right; margin-bottom: 2%;">
    <div class="card">
    <div class="card-body">
    <h2 class="card-title">Failure distribution by category</h2>

    <div class="spinner-border text-primary" role="status" [hidden]="dataLoaded"></div>
    <div class="divCard" *ngIf="dataLoaded">
    <p *ngIf="failureEmpty">No data to display</p>
    <canvas baseChart [data]="pieChartData" [labels]="pieChartLabels" [type]="pieChartType"
    [options]="pieChartOptions" [plugins]="pieChartPlugins" [legend]="pieChartLegend" >
    </canvas>

    </div>
    </div>
    </div>
    </div>
    </div>
    <!-- <div class="card divRightBottom">
    <div class="card-body">
    <h2 class="card-title">Failure distribution by error type</h2>
    <div class="spinner-border text-primary" role="status" [hidden]="dataLoaded"></div>
    <div class="divCard" *ngIf="dataLoaded">

    <canvas baseChart [data]="pieChartData2" [labels]="pieChartLabels2" [chartType]="pieChartType"
    [options]="pieChartOptions" [plugins]="pieChartPlugins" [legend]="pieChartLegend">
    </canvas>
    </div>

    </div>
    </div>
    <div class="card divRightBottom">
    <div class="card-body">
    <h2 class="card-title">Failure distribution by category</h2>
    <div class="spinner-border text-primary" role="status" [hidden]="dataLoaded"></div>
    <div class="divCard" *ngIf="dataLoaded">
    <p *ngIf="failureEmpty">No data to display</p>
    <canvas baseChart [data]="pieChartData" [labels]="pieChartLabels" [chartType]="pieChartType"
    [options]="pieChartOptions" [plugins]="pieChartPlugins" [legend]="pieChartLegend" >
    </canvas>

    </div>

    </div>
    </div> -->
    <div class="card divRightBottom">
    <div class="card-body">
    <h2 class="card-title">Device Status</h2>
    <div class="spinner-border text-primary" role="status" [hidden]="dataLoaded"></div>
    <table class="table table-striped" *ngIf="dataLoaded">
    <thead>
    <tr>
    <th scope="col">Device Type</th>
    <th scope="col">Device ID</th>
    <!-- <th *ngFor="let head of status">{{head}}</th> -->
    <th scope="col">Passed</th>
    <th scope="col">Failed</th>
    <th scope="col">Skipped</th>
    </tr>
    </thead>
    <tbody>
    <tr *ngFor="let item of deviceData | keyvalue">
    <td>{{ item.value.device_type }}</td>
    <td>{{ item.value.name }}</td>
    <td>{{ item.value.passed_tests | number }}</td>
    <td>{{ item.value.failed_tests | number }}</td>
    <td>{{ item.value.skipped_tests | number }}</td>
    </tr>
    </tbody>
    </table>


    </div>
    </div>
    </div>
    <br/>
    <br/>


    Here is the content for app.module.ts

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule, CUSTOM_ELEMENTS_SCHEMA, APP_INITIALIZER } from '@angular/core';
    import { AppConfigService } from './app-config.service';
    import { AppRoutingModule } from './app-routing.module';
    import { AppComponent } from './app.component';
    import { MainSidebarComponent } from './main-sidebar/main-sidebar.component';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    import { MatSliderModule } from '@angular/material/slider';
    import { MatToolbarModule } from '@angular/material/toolbar';
    import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
    import {MatIconModule} from '@angular/material/icon';
    import {MatSidenavModule} from '@angular/material/sidenav';
    import {MatListModule} from '@angular/material/list';
    import {MatButtonModule} from '@angular/material/button';
    import {NgbPaginationModule, NgbAlertModule} from '@ng-bootstrap/ng-bootstrap';
    import { RouterModule } from '@angular/router';
    //import { ScrollTopModule } from 'ng-boosted';
    import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
    import { MainCarouselComponent } from './main-carousel/main-carousel.component';
    import { FormsModule } from '@angular/forms';
    import {MatCardModule} from '@angular/material/card';
    import { HomepageComponent } from './homepage/homepage.component';
    import { FooterComponent } from './footer/footer.component';
    import { ValidationViewComponent } from './validation-view/validation-view.component';
    import {MatTabsModule} from '@angular/material/tabs';
    import { InformationCardComponent } from './information-card/information-card.component';
    import { ValidationDetailsComponent } from './validation-details/validation-details.component';
    import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
    import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts';
    import { CampaignIterationOverviewComponent } from './campaign-iteration-overview/campaign-iteration-overview.component';
    import { SupervisionViewComponent } from './supervision-view/supervision-view.component';
    import { InfraViewComponent } from './infra-view/infra-view.component';
    import { UserMgmtInfoComponent } from './user-mgmt-info/user-mgmt-info.component';
    import {MatCheckboxModule} from '@angular/material/checkbox';
    import { UserMgmtMenuComponent } from './user-mgmt-menu/user-mgmt-menu.component';
    import { UserMgmtChainComponent } from './user-mgmt-chain/user-mgmt-chain.component';
    import { ReactiveFormsModule } from '@angular/forms';
    import { MatDialogModule } from '@angular/material/dialog';
    import { DialogBodyComponent } from './dialog-body/dialog-body.component';
    import { UserMgmtWidgetComponent } from './user-mgmt-widget/user-mgmt-widget.component';
    import { UserMgmtAdminComponent } from './user-mgmt-admin/user-mgmt-admin.component';
    import {MatTableModule} from '@angular/material/table';
    import {MatFormFieldModule} from '@angular/material/form-field';
    import {MatInputModule} from '@angular/material/input';
    import {MatSelectModule} from '@angular/material/select';
    import { DialogBodyUsrComponent } from './dialog-body-usr/dialog-body-usr.component';
    import { MatPaginatorModule } from '@angular/material/paginator';
    import { CampaignIterationDetailsComponent } from './campaign-iteration-details/campaign-iteration-details.component';
    import { CampaignIterationSidebarComponent } from './campaign-iteration-sidebar/campaign-iteration-sidebar.component';
    import {MatTreeModule} from '@angular/material/tree';
    import { DialogBodyNewsComponent } from './dialog-body-news/dialog-body-news.component';
    import { QuillModule } from 'ngx-quill';
    import { LoginComponent } from './login/login.component';
    import { ToastComponent } from './toast/toast.component';
    import { ForbiddenComponent } from './forbidden/forbidden.component';
    import { ExportComponent } from './export/export.component';
    import { ExportAsModule } from 'ngx-export-as';
    import { BreadcrumbComponent } from './breadcrumb/breadcrumb.component';
    import { InvalidComponent } from './invalid/invalid.component';
    import { NgxSpinnerModule } from 'ngx-spinner';
    import { MdbModalModule } from 'mdb-angular-ui-kit/modal';
    import { DialogDelUsrComponent } from './dialog-del-usr/dialog-del-usr.component';
    import { RequestInterceptorService } from 'Services/RequestInterceptor/request-interceptor.service';
    import { HistTabComponent } from './hist-tab/hist-tab.component';
    import {MatSlideToggleModule} from '@angular/material/slide-toggle';
    import { MatTooltipModule } from '@angular/material/tooltip';
    import {MatRadioModule} from '@angular/material/radio';
    import { ValidChainAdminComponent } from './valid-chain-admin/valid-chain-admin.component';
    import { SuperChainAdminComponent } from './super-chain-admin/super-chain-admin.component';
    import { GlobalAdminComponent } from './global-admin/global-admin.component';
    import { DialogDelChainComponent } from './dialog-del-chain/dialog-del-chain.component';
    import { DialogBodyChainComponent } from './dialog-body-chain/dialog-body-chain.component';
    import { ChainManagementComponent } from './chain-management/chain-management.component';
    import { ChainAdministrationComponent } from './chain-administration/chain-administration.component';
    import { OrderByPipe } from 'pipes/orderBy/order-by.pipe';
    import { DialogScheduleChainComponent } from './dialog-schedule-chain/dialog-schedule-chain.component';
    import { AuthInterceptor } from 'Services/RequestInterceptor/auth-interceptor.service';
    import { AppLoginService } from './app-login.service';



    const appInitializerFn = (appConfig: AppConfigService, appLogin: AppLoginService) => {
    return () => {
    appLogin.loadingShow();
    return appConfig.loadAppConfig().then(() => {
    return appLogin.initializeApp().toPromise();
    }).finally(() => {
    appLogin.loadingHide(); // Hide spinner after both initializations
    }).catch(error => {
    console.error("Initialization failed", error);
    appLogin.loadingHide();
    alert("Initialization Failed");
    return Promise.resolve(false);
    })
    };
    };


    @NgModule({ declarations: [
    AppComponent,
    MainSidebarComponent,
    MainCarouselComponent,
    HomepageComponent,
    FooterComponent,
    ValidationViewComponent,
    InformationCardComponent,
    ValidationDetailsComponent,
    CampaignIterationOverviewComponent,
    SupervisionViewComponent,
    InfraViewComponent,
    UserMgmtInfoComponent,
    UserMgmtMenuComponent,
    UserMgmtChainComponent,
    DialogBodyComponent,
    UserMgmtWidgetComponent,
    UserMgmtAdminComponent,
    DialogBodyUsrComponent,
    CampaignIterationDetailsComponent,
    CampaignIterationSidebarComponent,
    DialogBodyNewsComponent,
    LoginComponent,
    ToastComponent,
    ForbiddenComponent,
    ExportComponent,
    BreadcrumbComponent,
    InvalidComponent,
    DialogDelUsrComponent,
    HistTabComponent,
    ValidChainAdminComponent,
    SuperChainAdminComponent,
    GlobalAdminComponent,
    DialogDelChainComponent,
    DialogBodyChainComponent,
    ChainManagementComponent,
    ChainAdministrationComponent,
    OrderByPipe,
    DialogScheduleChainComponent
    ],
    schemas: [CUSTOM_ELEMENTS_SCHEMA],
    bootstrap: [AppComponent], imports: [BrowserModule,
    AppRoutingModule,
    NgbModule,
    BrowserAnimationsModule,
    MatSliderModule,
    MatToolbarModule,
    MatIconModule,
    MatSidenavModule,
    MatListModule,
    MatButtonModule,
    NgbPaginationModule,
    NgbAlertModule,
    NgbNavModule,
    RouterModule,
    NgbModule,
    FormsModule,
    MatCardModule,
    MatTabsModule,
    BaseChartDirective,
    MatCheckboxModule,
    ReactiveFormsModule,
    MatDialogModule,
    MatTableModule,
    MatFormFieldModule,
    MatInputModule,
    MatSelectModule,
    MatPaginatorModule,
    MatTreeModule,
    QuillModule.forRoot(),
    ExportAsModule,
    NgxSpinnerModule,
    MdbModalModule,
    MatSlideToggleModule,
    MatRadioModule], providers: [
    AppConfigService,
    AppLoginService,
    {
    provide: APP_INITIALIZER,
    useFactory: appInitializerFn,
    multi: true,
    deps: [AppConfigService, AppLoginService]
    },
    {
    provide: HTTP_INTERCEPTORS,
    useClass: AuthInterceptor,
    multi: true
    },
    {
    provide: HTTP_INTERCEPTORS,
    useClass: RequestInterceptorService,
    multi: true
    },
    provideHttpClient(withInterceptorsFromDi()),
    provideCharts(withDefaultRegisterables())
    ] })
    export class AppModule { }


    Content of main.ts

    import { enableProdMode } from '@angular/core';
    import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

    import { AppModule } from './app/app.module';
    import { environment } from './environments/environment';

    import { Chart, registerables } from 'chart.js';
    Chart.register(...registerables);

    if (environment.production) {
    enableProdMode();
    }

    platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.error(err));


    Below are the points I have tried:

    • I have upgraded chart.js to 4.4.7 and ng2-charts to 6.0.1
    • Changed NgChartsModule to BaseChartDirective
    • Also added below configuration to app.module

    import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts';

    @NgModule({
    imports: [ BaseChartDirective ],
    providers: [provideCharts(withDefaultRegisterables())]
    })
    export class MySubModule { }


    I was expecting piechart which is shown below

    Expected Piechart

    Continue reading...

Compartilhe esta Página