htmlcssangularprimengprimeng-datatable

Sticky header not working with resizable column in Primeng.?


I am trying to implement both column resize and stick header. But sticky header works fine if I won't use the column resize. If I implement both, column resize is working but sticky header is not working.

I used the following css from primeng for the sticky header.

  :host ::ng-deep .ui-table .ui-table-thead > tr > th {
        position: -webkit-sticky;
        position: sticky;
        top: 70px;
    }

    @media screen and (max-width: 64em) {
        :host ::ng-deep .ui-table .ui-table-thead > tr > th {
            top: 100px;
        }
    }

and for the colum resize I used the below code, [resizableColumns]="true", pResizableColumn

  <p-table [columns]="cols" [value]="cars1" [resizableColumns]="true">
    ...
     <th *ngFor="let col of columns" pResizableColumn>

If I remove the resizbleColumns and pResizableColumn sticky header works fine. How can I make it works both things.? Here is the stackblitz and Demo


Solution

  • when you set the p-table columns to be resizable the add a class ui-table-resizable this will reset some css property one of its the position of th to relative so you will lose sticky future

    this should fix the problem

    :host ::ng-deep .ui-table .ui-table-thead > tr > th {
      position: -webkit-sticky;
      position: sticky;
      background: blue;
      color: white;
      top: 0px;
      z-index: 1;
    }
    
    :host ::ng-deep .ui-table-resizable > .ui-table-wrapper {
      overflow-x: initial !important;
    }
    
    :host ::ng-deep .ui-table-resizable .ui-resizable-column {
      position: sticky !important;
    }
    
    @media screen and (max-width: 64em) {
      :host ::ng-deep .ui-table .ui-table-thead > tr > th {
        top: 0px;
      }
    }
    

    demo

    Updated!

    add the style in the component decorator is not reusable ,base of primeng theme recommendation of creating custom style we can do like this

    style.scss

    .sticky-table {
    
          &.ui-table .ui-table-thead > tr > th {
            position: -webkit-sticky;
            position: sticky !important;
            background: blue;
            color: white;
            top: 0px;
            z-index: 1;
          }
    
         &.ui-table-resizable > .ui-table-wrapper {
            overflow-x: initial !important;
          }
    
          &.ui-table-resizable .ui-resizable-column {
            position: sticky !important;
          }
    
          @media screen and (max-width: 64em) {
            .ui-table .ui-table-thead > tr > th {
              top: 0px;
            }
          }
          
    }
    

    template

    <p-table styleClass="sticky-table" [columns]="cols" [value]="cars [resizableColumns]="true">
    ....
    </p-table>
    

    demo