Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 383
mkHun Avatar asked Sep 03 '19 08:09

mkHun


3 Answers

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 โšกโšก

like image 176
Muhammed Albarmavi Avatar answered Nov 16 '22 04:11

Muhammed Albarmavi


Anyone who still might be interested:
For me it worked by just adding the following

:host ::ng-deep .p-datatable .p-datatable-wrapper {
    overflow-x: initial;
}

The Resizable-Fatures adds "overflow-x: auto" to the table, which hides the stick header.

like image 6
Maik Avatar answered Nov 16 '22 04:11

Maik


:host ::ng-deep .p-datatable .p-datatable-thead > tr > th {
        position: -webkit-sticky;
        position: sticky;
        background: blue;
        color: white;
        top: 0px;
        z-index: 1;
      }
      
      :host ::ng-deep .p-datatable-resizable > .p-datatable-wrapper {
        overflow-x: initial !important;
      }
      
      :host ::ng-deep .p-datatable-resizable .ui-resizable-column {
        position: sticky !important;
      }
      
      @media screen and (max-width: 64em) {
        :host ::ng-deep .p-datatable .p-datatable-thead > tr > th {
          top: 0px;
        }
      }
like image 1
Venkata AjayKumar S Avatar answered Nov 16 '22 03:11

Venkata AjayKumar S