Topic: Nested Property Tablesort Not Working

MHarmony pro asked 5 years ago


Expected behavior

Table sort should work on nested properties.

Actual behavior

Table sort works on non-nested properties but does not for nested properties. So for the data provided below, sort works on the last column "due_date", but not the others.

Resources (screenshots, code snippets etc.)

Here is the code for my table:

<table mdbTable stickyHeader="true" hover="true" class="z-depth-1 btn-table">
    <thead class="sticky-top">
        <tr>
            <th [mdbTableSort]="tableData" sortBy="employee.last_name">
                Last Name <i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th [mdbTableSort]="tableData" sortBy="employee.first_name">
                First Name <i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th [mdbTableSort]="tableData" sortBy="employee.start_date">
                Start Date <i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th [mdbTableSort]="tableData" sortBy="employee.labor_category.category_name">
                LCAT <i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th [mdbTableSort]="tableData" sortBy="employee.track.track_name">
                Track <i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th [mdbTableSort]="tableData" sortBy="employee.contract.contract_name">
                Contract <i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th [mdbTableSort]="tableData" sortBy="due_date">
                Due Date<i class="fa fa-sort cursor-pointer"></i>
            </th>

            <th scope="col"></th>
        </tr>
    </thead>

    <tbody #tablerow>
        <tr mdbTableCol *ngFor="let row of tableData; let i = index;">
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex" scope="row">{{row.last_name}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex">{{row.first_name}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex">{{row.start_date | date:'M/d/yy'}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex">{{row.labor_category?.category_name}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex">{{row.track?.track_name}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex">{{row.contract?.contract_name}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex">{{row.due_date}}</td>
            <td *ngIf="i+1 >= firstItemIndex && i < lastItemIndex" align="right" style="width: 64px;">
                <div>
                    <a mdbBtn floating="true" [routerLink]="['/profile', row.employee_id]" type="button"
                        gradient="blue" size="sm" class="waves-light mb-1 mr-2" style="display: inline-block;"
                        mdbTooltip="View" placement="top" mdbWavesEffect>
                        <i class="fa fa-eye"></i>
                    </a>
                </div>
            </td>
        </tr>
    </tbody>

    <tfoot class="grey lighten-5 w-100">
        <tr>
            <td colspan="8">
                <mdb-table-pagination searchPagination="true" [searchDataSource]="tableData"
                    (nextPageClick)="onNextPageClick($event)" (previousPageClick)="onPreviousPageClick($event)">
                </mdb-table-pagination>
            </td>
        </tr>
    </tfoot>
</table>

And here's a row of the data source:

{
    completed_date: null
    due_date: "2019-11-30"
    employee: {
        first_name: "John"
        last_name: "Doe"
        start_date: "2019-11-01"
        labor_category: {
            category_name: "Senior Associate"
        }
        track: {
            track_name: "Technical"
        }
        contract: {
            contract_name: "CONTRACT"
        }
    }
    last_modified_date: "2019-03-22T17:14:52.593Z"
}

Damian Gemza staff answered 5 years ago


Dear MHarmony,

I thought, that you've got a problem with your table construction.

You're iterating with *ngFor (let row of tableData), and then in td elements you're interpolating strings {{row.last_name}}.

But row element haven't got last_name property on the first level (you have to add an employee to use this property).

Please take a look at my table - there's no pagination and I have removed the *ngIf from td elements:

.html:

<div class="row">
  <div class="col-md-6 mx-auto my-5">
    <table mdbTable stickyHeader="true" hover="true" class="z-depth-1 btn-table">
      <thead class="sticky-top">
      <tr>
        <th [mdbTableSort]="tableData" sortBy="employee.last_name">
          Last Name <i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th [mdbTableSort]="tableData" sortBy="employee.first_name">
          First Name <i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th [mdbTableSort]="tableData" sortBy="employee.start_date">
          Start Date <i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th [mdbTableSort]="tableData" sortBy="employee.labor_category.category_name">
          LCAT <i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th [mdbTableSort]="tableData" sortBy="employee.track.track_name">
          Track <i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th [mdbTableSort]="tableData" sortBy="employee.contract.contract_name">
          Contract <i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th [mdbTableSort]="tableData" sortBy="due_date">
          Due Date<i class="fa fa-sort cursor-pointer"></i>
        </th>

        <th scope="col"></th>
      </tr>
      </thead>

      <tbody #tablerow>
      <tr mdbTableCol *ngFor="let row of tableData; let i = index;">
        <td scope="row">{{row.employee.last_name}}</td>
        <td >{{row.employee.first_name}}</td>
        <td >{{row.employee.start_date | date:'M/d/yy'}}</td>
        <td >{{row.employee.labor_category?.category_name}}</td>
        <td >{{row.employee.track?.track_name}}</td>
        <td >{{row.employee.contract?.contract_name}}</td>
        <td >{{row.employee.due_date}}</td>
        <td  align="right" style="width: 64px;">
          <div>
            <a mdbBtn floating="true"  type="button"
               gradient="blue" size="sm" class="waves-light mb-1 mr-2" style="display: inline-block;"
               mdbTooltip="View" placement="top" mdbWavesEffect>
              <i class="fa fa-eye"></i>
            </a>
          </div>
        </td>
      </tr>
      </tbody>

      <!--<tfoot class="grey lighten-5 w-100">-->
      <!--<tr>-->
        <!--<td colspan="8">-->
          <!--<mdb-table-pagination searchPagination="true" [searchDataSource]="tableData"-->
                                <!--(nextPageClick)="onNextPageClick($event)" (previousPageClick)="onPreviousPageClick($event)">-->
          <!--</mdb-table-pagination>-->
        <!--</td>-->
      <!--</tr>-->
      <!--</tfoot>-->
    </table>
  </div>
</div>

.ts:

tableData = [{
    completed_date: null,
    due_date: "2019-11-30",
    employee: {
      first_name: "John",
      last_name: "Doe",
      start_date: "2019-11-01",
      labor_category: {
        category_name: "Senior Associate"
      },
      track: {
        track_name: "Technical"
      },
      contract: {
        contract_name: "CONTRACT"
      }
    },
    last_modified_date: "2019-03-22T17:14:52.593Z"
  },
    {
      completed_date: null,
      due_date: "2019-11-30",
      employee: {
        first_name: "John 2",
        last_name: "Doe 2",
        start_date: "2019-11-12",
        labor_category: {
          category_name: "Senior Associate 2"
        },
        track: {
          track_name: "Technical 2"
        },
        contract: {
          contract_name: "CONTRACT 2"
        }
      },
      last_modified_date: "2019-03-26T17:14:52.593Z"
    }]

The above code works fine on my end - I'm able to sort over every property from the table.

Best Regards,

Damian



Please insert min. 20 characters.

FREE CONSULTATION

Hire our experts to build a dedicated project. We'll analyze your business requirements, for free.

Status

Resolved

Specification of the issue

  • ForumUser: Pro
  • Premium support: No
  • Technology: MDB Angular
  • MDB Version: 7.4.3
  • Device: PC
  • Browser: Chrome
  • OS: Windows 10
  • Provided sample code: No
  • Provided link: No