0
votes

I am using an ngx-datatable to render tabular data(image below) in my Angular component. Everything works fine except the fact that I am unable to remove the sort function from the 'Action' header column. On inspecting it, I can see that it is using span class = "sort-btn" under span class = "datatable-header-cell-wrapper". Any idea on how the sort function can be removed? I have added the code below:

enter image description here

enter image description here

schedule-management.component.html:

<ol class="breadcrumb">
    <li class="breadcrumb-item"><a [routerLink]="['/home']">Home</a></li>
    <li class="breadcrumb-item"><a [routerLink]="['/cldtools']">Cloud Runner Tools</a></li>
    <li class="breadcrumb-item active">Schedule Management</li>
</ol>

<div class="row" style="margin-top:20px;">
    <div class="col-lg-12">
        <h2>All Schedules</h2>
    </div>
</div>

<div class="row" style="margin-top:20px;">
    <div class="col-lg-12">
        <div class="dropdown">
            <button class="btn btn-primary">Create New </button>
            <div class="dropdown-content">
                <a [routerLink]="['/schedulemanagement/autoStartStopVm']" [queryParams]="{dropDownListSelectedItem:'AutoStart'}">AutoStart</a>
                <a [routerLink]="['/schedulemanagement/autoStartStopVm']" [queryParams]="{dropDownListSelectedItem:'AutoShutdown'}">AutoShutdown</a>
                <!--<a href="#">Auto Scale</a>-->
            </div>
        </div>
    </div>
</div>
<div class="row">
    <div class="col-lg-12">
        <!--<div style="overflow-x:scroll; overflow-y:scroll; width: 100%">-->
        <ngx-datatable #table
                       class='datatable'
                       [sortType]="'single'"
                       [columns]="columns"
                       [columnMode]="'flex'"
                       [headerHeight]="40"
                       [footerHeight]="50"
                       [rowHeight]="'auto'"
                       [groupRowsBy]="'isCurrentDate'"
                       [limit]="10"
                       [rows]='rows'
                       [groupExpansionDefault]="true"
                       [scrollbarH]="true">

            <ngx-datatable-group-header [rowHeight]="60" #myGroupHeader>
                <ng-template let-group="group" let-expanded="expanded" ngx-datatable-group-header-template>
                    <div style="padding-left:5px;">
                        <a title="Expand/Collapse Group"
                           (click)="toggleExpandGroup(group)">
                            <b>{{group.value[0].isCurrentDate === true? 'Scheduled for Today':'Scheduled for other days'}}</b>
                        </a>
                    </div>
                </ng-template>
            </ngx-datatable-group-header>

            <ng-template #sortableColumnTemplate let-sort="sortFn" let-column="column" ngx-datatable-header-template>
                <span (click)="sort()" class="sort-fullwidth">{{column?.name}}</span>
                <input class="filter-box" placeholder='' (keyup)='updateFilter($event)' />
            </ng-template>

            <ng-template #dateColumn let-row="row" let-value="value" ngx-datatable-cell-template>
                <div>{{value | date:"short"}}</div>
            </ng-template>

            <ng-template #actionRowTemplate let-row="row" let-value="value" ngx-datatable-cell-template>
                <div style="display:block; text-align:center;">
                    <!-- <a title="copy"><i class="glyphicon glyphicon-copy"></i></a>                    -->
                    <a title="delete" (click)="deleteWarningModal.show();scheduleToDelete = value"><i class="glyphicon glyphicon-remove"></i></a>
                </div>

            </ng-template>
        </ngx-datatable>
    </div>
</div>

    <loading-spinner *ngIf="showSpinner"></loading-spinner>
    <modal #deleteWarningModal>
        <div class="app-modal-header">
            Warning
        </div>
        <div class="app-modal-body">
            Are you sure you want to delete the schedule?
        </div>
        <div class="app-modal-footer">
            <button type="button" (click)="deleteSchedule()" class="btn btn-primary">Yes</button>
            <button type="button" (click)="deleteWarningModal.hide()" class="btn btn-secondary">No</button>
        </div>
    </modal>

schedule-management.component.ts:

import { Component, Inject, OnInit, ViewChild, TemplateRef } from '@angular/core';
import { GridComponent } from '../shared/grid.component';
import { SchdedulingDetails } from '../../models/schedulingDetails';

//Services
import { ScheduleManagementService } from '../../services/schedulemanagement.service';
import { ToasterNotificationService } from '../../services/toasterNotification.service';
import { ModalComponent } from '../shared/modal.component';


@Component({
    selector: 'schedulemanagement',
    templateUrl: './schedule-management.component.html',
    styleUrls: ['./schedule-management.component.css', '../shared/grid.component.css']
})
export class ScheduleManagementComponent extends GridComponent implements OnInit {

    constructor(private _schedManagementService: ScheduleManagementService,
        private notificationsService: ToasterNotificationService) {
        super();
    }

    scheduleToDelete: string;
    showSpinner: boolean = true;
    @ViewChild('deleteWarningModal') deleteWarningModal: ModalComponent;
    @ViewChild('dateColumn') dateColumn: TemplateRef<any>;

    ngOnInit(){
        this.buildTable();
        this.populateTable();
    }



    buildTable() {
        this.columns = [
            {
                name: 'SID',
                prop: 'sapsid',
                sortable: true,
                sortString: '',
                flexGrow: 1,
                cellTemplate: this.customColumnTemplate,
                headerTemplate: this.sortableColumnTemplate
            },
            {
                name: 'CI Host',
                prop: 'ciHostName',
                sortable: true,
                sortString: '',
                flexGrow: 2,
                cellTemplate: this.customColumnTemplate,
                headerTemplate: this.sortableColumnTemplate
            },
            {
                name: 'App Host',
                prop: 'sapAppHostName',
                sortable: true,
                sortString: '',
                flexGrow: 2,
                headerTemplate: this.sortableColumnTemplate
            },
            {
                name: 'Instance#',
                prop: 'sapAppInstanceNumber',
                sortable: true,
                sortString: '',
                flexGrow: 2,
                headerTemplate: this.sortableColumnTemplate
            },
            {
                name: 'DB Host',
                prop: 'dbHostName',
                sortable: true,
                sortString: '',
                flexGrow: 2,
                headerTemplate: this.sortableColumnTemplate
            },
            {
                name: 'Starts on',
                prop: 'startDateTime',
                sortable: true,
                sortString: '',
                flexGrow: 3,
                headerTemplate: this.sortableColumnTemplate,
                cellTemplate: this.dateColumn
            },
            {
                name: 'Ends on',
                prop: 'stopDateTime',
                sortable: true,
                sortString: '',
                flexGrow: 3,
                headerTemplate: this.sortableColumnTemplate,
                cellTemplate: this.dateColumn
            },
            {
                name: 'Scheduled For',
                prop: 'actionName',
                sortable: true,
                sortString: '',
                flexGrow: 2.7,
                headerTemplate: this.sortableColumnTemplate,
            },
            {
                name: 'Frequency',
                prop: 'frequency',
                sortable: true,
                sortString: '',
                flexGrow: 2,
                headerTemplate: this.sortableColumnTemplate
            },                      
            {
                name: 'Action',
                prop: 'id',
                cellTemplate: this.actionRowTemplate,
                sortable: false,
                flexGrow: 1.3
            }            

        ];
    }

    populateTable() {
        this._schedManagementService.getSchedulingDetails().subscribe(
            response=>{
                this.showSpinner = false;
                this.updateRows(response);
            }, error => {
                this.showSpinner = false;
                this.notificationsService.notify('error', 'Error', "Unexpected error occured while retrieving Scheduling details.");
            }
        )
    }

    deleteSchedule(){
        let id = this.scheduleToDelete;
        this._schedManagementService.deleteSchedulingDetails(id).subscribe(
            result =>{
                this.rows = this.rows.filter(r=> r.id !== id);              
                this.deleteWarningModal.hide();
            },error =>{                
                this.notificationsService.notify('error', 'Error', "Unexpected error occured while deleting schedule.");
            });
    }
}
1

1 Answers

2
votes

I am probably a bit late, but for people having still this problem you could just set the css class in the component styles to:

.sort-btn { display: none; }

To hide the span with the button.

As for deactivating the sorting, when you define the columns in your .ts file set the sortable property to false for the columns that should not be sortable:

this.columns = [
        {
            name: 'SID',
            prop: 'sapsid',
            sortable: false, // THIS HERE SET TO FALSE
            sortString: '',
            flexGrow: 1,
            cellTemplate: this.customColumnTemplate,
            headerTemplate: this.sortableColumnTemplate
        }, ...

If the columns are still being sorted (which shouldn't) you can try to set the external sorting to true in the ngx-datatable:

<ngx-datatable [externalSorting]="true"> 
</ngx-datatable>