diff --git a/demo/angular.json b/demo/angular.json
index 2330dc66..1e8883ab 100644
--- a/demo/angular.json
+++ b/demo/angular.json
@@ -58,7 +58,8 @@
"node_modules/prismjs/components/prism-bash.min.js",
"node_modules/prismjs/plugins/toolbar/prism-toolbar.min.js",
"node_modules/clipboard/dist/clipboard.min.js",
- "node_modules/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"
+ "node_modules/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js",
+ "node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js"
],
"vendorChunk": true,
"extractLicenses": false,
@@ -123,7 +124,8 @@
"node_modules/datatables.net-buttons/js/buttons.print.js",
"node_modules/datatables.net-colreorder/js/dataTables.colReorder.js",
"node_modules/datatables.net-responsive/js/dataTables.responsive.js",
- "node_modules/datatables.net-select/js/dataTables.select.js"
+ "node_modules/datatables.net-select/js/dataTables.select.js",
+ "node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js"
],
"styles": [
"node_modules/datatables.net-dt/css/jquery.dataTables.css",
diff --git a/demo/package-lock.json b/demo/package-lock.json
index 691a247e..d6b156a8 100644
--- a/demo/package-lock.json
+++ b/demo/package-lock.json
@@ -20,13 +20,15 @@
"@types/marked": "^4.3.0",
"angular-datatables": "^16.0.0",
"clipboard": "^2.0.8",
- "core-js": "^3.19.1",
+ "core-js": "^3.23.3",
"datatables.net": "^1.11.3",
"datatables.net-buttons": "^2.0.1",
"datatables.net-buttons-dt": "^2.0.1",
"datatables.net-colreorder": "^1.5.5",
"datatables.net-colreorder-dt": "^1.5.5",
"datatables.net-dt": "^1.11.3",
+ "datatables.net-fixedcolumns": "^4.3.0",
+ "datatables.net-fixedcolumns-bs4": "^4.3.0",
"datatables.net-responsive": "^2.2.9",
"datatables.net-responsive-dt": "^2.2.9",
"datatables.net-scroller": "^2.0.5",
@@ -6271,9 +6273,9 @@
}
},
"node_modules/datatables.net": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.4.tgz",
- "integrity": "sha512-yzhArTOB6tPO2QFKm1z3hA4vabtt2hRvgw8XLsT1xqEirinfGYqWDiWXlkTPTaJv2e7gG+Kf985sXkzBFlGrGQ==",
+ "version": "1.13.8",
+ "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.8.tgz",
+ "integrity": "sha512-2pDamr+GUwPTby2OgriVB9dR9ftFKD2AQyiuCXzZIiG4d9KkKFQ7gqPfNmG7uj9Tc5kDf+rGj86do4LAb/V71g==",
"dependencies": {
"jquery": ">=1.7"
}
@@ -6325,6 +6327,25 @@
"jquery": ">=1.7"
}
},
+ "node_modules/datatables.net-fixedcolumns": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/datatables.net-fixedcolumns/-/datatables.net-fixedcolumns-4.3.0.tgz",
+ "integrity": "sha512-H2otCswJDHufI4A8k7HUDj25HCB3a44KFnBlYEwYFWdrJayLcYB3I79kBjS8rSCu4rFEp0I9nVLKvWgKlZZgCQ==",
+ "dependencies": {
+ "datatables.net": ">=1.13.4",
+ "jquery": ">=1.7"
+ }
+ },
+ "node_modules/datatables.net-fixedcolumns-bs4": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/datatables.net-fixedcolumns-bs4/-/datatables.net-fixedcolumns-bs4-4.3.0.tgz",
+ "integrity": "sha512-iQqN0+/qekGRP/zFxTNSYxnc1Sj65ps+rWRQIRSQLbCt6tndXkjCp1pwT17QmsEELJjnZwArZqxq2zdKTEaHIQ==",
+ "dependencies": {
+ "datatables.net-bs4": ">=1.13.4",
+ "datatables.net-fixedcolumns": ">=4.2.2",
+ "jquery": ">=1.7"
+ }
+ },
"node_modules/datatables.net-responsive": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/datatables.net-responsive/-/datatables.net-responsive-2.4.1.tgz",
diff --git a/demo/package.json b/demo/package.json
index 185de568..898acba5 100644
--- a/demo/package.json
+++ b/demo/package.json
@@ -31,6 +31,7 @@
"datatables.net-colreorder": "^1.5.5",
"datatables.net-colreorder-dt": "^1.5.5",
"datatables.net-dt": "^1.11.3",
+ "datatables.net-fixedcolumns": "^4.3.0",
"datatables.net-responsive": "^2.2.9",
"datatables.net-responsive-dt": "^2.2.9",
"datatables.net-scroller": "^2.0.5",
diff --git a/demo/src/app/app.component.html b/demo/src/app/app.component.html
index 489dd576..0ecd0c5a 100644
--- a/demo/src/app/app.component.html
+++ b/demo/src/app/app.component.html
@@ -110,6 +110,9 @@
Select extension
+
+ Fixed Columns extension
+
diff --git a/demo/src/app/app.module.ts b/demo/src/app/app.module.ts
index 44a3bfc4..8d5e4905 100644
--- a/demo/src/app/app.module.ts
+++ b/demo/src/app/app.module.ts
@@ -32,6 +32,7 @@ import { RouterLinkComponent } from './advanced/router-link.component';
// Using extension examples
import { ButtonsExtensionComponent } from './extensions/buttons-extension.component';
import { ColreorderExtensionComponent } from './extensions/colreorder-extension.component';
+import { FixedColumnsExtensionComponent } from './extensions/fixed-columns-extension.component';
import { ResponsiveExtensionComponent } from './extensions/responsive-extension.component';
import { SelectExtensionComponent } from './extensions/select-extension.component';
import { UsingNgPipeComponent } from './advanced/using-ng-pipe.component';
@@ -73,6 +74,7 @@ import { NewServerSideComponent } from './basic/new-server-side/new-server-side.
ButtonsExtensionComponent,
ColreorderExtensionComponent,
+ FixedColumnsExtensionComponent,
ResponsiveExtensionComponent,
SelectExtensionComponent,
UsingNgPipeComponent,
diff --git a/demo/src/app/app.routing.ts b/demo/src/app/app.routing.ts
index 50dd31b8..54b07e4b 100644
--- a/demo/src/app/app.routing.ts
+++ b/demo/src/app/app.routing.ts
@@ -30,6 +30,7 @@ import { UsingNgTemplateRefComponent } from './advanced/using-ng-template-ref.co
import { MoreHelpComponent } from './more-help/more-help.component';
import { WithAjaxCallbackComponent } from './basic/with-ajax-callback/with-ajax-callback.component';
import { NewServerSideComponent } from './basic/new-server-side/new-server-side.component';
+import { FixedColumnsExtensionComponent } from './extensions/fixed-columns-extension.component';
const routes: Routes = [
{
@@ -129,6 +130,10 @@ const routes: Routes = [
path: 'extensions/colreorder',
component: ColreorderExtensionComponent
},
+ {
+ path: 'extensions/fixed-columns',
+ component: FixedColumnsExtensionComponent
+ },
{
path: 'extensions/responsive',
component: ResponsiveExtensionComponent
diff --git a/demo/src/app/extensions/fixed-columns-extension.component.html b/demo/src/app/extensions/fixed-columns-extension.component.html
new file mode 100644
index 00000000..4d9fa9ad
--- /dev/null
+++ b/demo/src/app/extensions/fixed-columns-extension.component.html
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/demo/src/app/extensions/fixed-columns-extension.component.ts b/demo/src/app/extensions/fixed-columns-extension.component.ts
new file mode 100644
index 00000000..ba111412
--- /dev/null
+++ b/demo/src/app/extensions/fixed-columns-extension.component.ts
@@ -0,0 +1,97 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-fixed-columns-extension',
+ templateUrl: 'fixed-columns-extension.component.html'
+})
+export class FixedColumnsExtensionComponent implements OnInit {
+
+ pageTitle = 'DataTables Fixed Columns extension';
+ mdIntro = 'assets/docs/extensions/fixedcolumns/intro.md';
+ mdInstall = 'assets/docs/extensions/fixedcolumns/installation.md';
+ mdHTML = 'assets/docs/extensions/fixedcolumns/source-html.md';
+ mdTS = 'assets/docs/extensions/fixedcolumns/source-ts.md';
+
+ // Must be declared as "any", not as "DataTables.Settings"
+ dtOptions: any = {};
+
+ ngOnInit(): void {
+ this.dtOptions = {
+ ajax: 'data/data.json',
+ columns: [{
+ title: 'ID',
+ data: 'id'
+ }, {
+ title: 'First name',
+ data: 'firstName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ }
+
+ ],
+ // Make sure that scrollX is set to true for this to work!
+ scrollX: true,
+ fixedColumns: {
+ left: 3,
+ right: 0
+ },
+ };
+ }
+}
diff --git a/demo/src/assets/docs/extensions/fixedcolumns/installation.md b/demo/src/assets/docs/extensions/fixedcolumns/installation.md
new file mode 100644
index 00000000..e6d75477
--- /dev/null
+++ b/demo/src/assets/docs/extensions/fixedcolumns/installation.md
@@ -0,0 +1,70 @@
+##### NPM
+
+You need to install its dependencies:
+
+```bash
+# JS file
+npm install datatables.net-fixedcolumns --save
+```
+
+##### angular.json
+
+Add the dependencies in the scripts and styles attributes:
+
+```json
+{
+ "projects": {
+ "your-app-name": {
+ "architect": {
+ "build": {
+ "options": {
+ "styles": [
+ ...
+ ],
+ "scripts": [
+ ...
+ "node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js"
+ ],
+ ...
+}
+```
+
+#### Update CSS
+
+Update your global style ( genreally styles.css ) as
+
+ ```css
+ /** Fixed columns css
+
+ These classes are injected by fixed columns extensions
+ and can be tweaked here to match the colors of headers and body
+ to hide the scrolling element behind the fixed header.
+
+ */
+
+ table.dataTable thead tr > .dtfc-fixed-left,
+ table.dataTable thead tr > .dtfc-fixed-right,
+ table.dataTable tfoot tr > .dtfc-fixed-left,
+ table.dataTable tfoot tr > .dtfc-fixed-right {
+ top: 0;
+ bottom: 0;
+ z-index: 3;
+ background-color: white;
+ }
+
+ table.dataTable tbody tr > .dtfc-fixed-left,
+ table.dataTable tbody tr > .dtfc-fixed-right {
+ z-index: 1;
+ background-color: white;
+ }
+
+ div.dtfc-left-top-blocker,
+ div.dtfc-right-top-blocker {
+ background-color: white;
+ }
+ ```
+ Alternative to writing css to global file, you can also install a supported css file for this extension from npm library and update it inside ``styles`` property in angular.json.
+
+```bash
+npm install datatables.net-fixedcolumns-bs4 --save
+```
diff --git a/demo/src/assets/docs/extensions/fixedcolumns/intro.md b/demo/src/assets/docs/extensions/fixedcolumns/intro.md
new file mode 100644
index 00000000..4471a41d
--- /dev/null
+++ b/demo/src/assets/docs/extensions/fixedcolumns/intro.md
@@ -0,0 +1,3 @@
+You can use the [Fixed Columns Extension](https://datatables.net/extensions/fixedcolumns/) with angular-datatables.
+This extension comes handy when you have a large number of columns and want to freeze
+certain columns on either side while scrolling along X axis.
diff --git a/demo/src/assets/docs/extensions/fixedcolumns/source-html.md b/demo/src/assets/docs/extensions/fixedcolumns/source-html.md
new file mode 100644
index 00000000..5c0933e6
--- /dev/null
+++ b/demo/src/assets/docs/extensions/fixedcolumns/source-html.md
@@ -0,0 +1,3 @@
+```html
+
+```
diff --git a/demo/src/assets/docs/extensions/fixedcolumns/source-ts.md b/demo/src/assets/docs/extensions/fixedcolumns/source-ts.md
new file mode 100644
index 00000000..f02a2787
--- /dev/null
+++ b/demo/src/assets/docs/extensions/fixedcolumns/source-ts.md
@@ -0,0 +1,93 @@
+```typescript
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-select-extension',
+ templateUrl: 'select-extension.component.html'
+})
+export class SelectExtensionComponent implements OnInit {
+
+ // Must be declared as "any", not as "DataTables.Settings"
+ dtOptions: any = {};
+
+ ngOnInit(): void {
+ this.dtOptions = {
+ ajax: 'data/data.json',
+ columns: [{
+ title: 'ID',
+ data: 'id'
+ }, {
+ title: 'First name',
+ data: 'firstName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ },
+ {
+ title: 'Last name',
+ data: 'lastName'
+ }, {
+ title: 'Last name',
+ data: 'lastName'
+ }
+
+ ],
+ // Make sure that scrollX is set to true for this to work!
+ scrollX: true,
+ fixedColumns: {
+ left: 3,
+ right: 0
+ },
+ };
+ }
+}
+```
diff --git a/demo/src/styles.css b/demo/src/styles.css
index f89ab27a..0323fb7d 100644
--- a/demo/src/styles.css
+++ b/demo/src/styles.css
@@ -154,3 +154,34 @@ div.code-toolbar > .toolbar button {
markdown h5:not(markdown.faqMarkdown) {
color: #2196f3;
}
+
+
+/** Fixed columns css
+
+These classes are injected by fixed columns extensions
+and can be tweaked here to match the colors of headers and body
+to hide the scrolling element behind the fixed header.
+
+*/
+
+
+table.dataTable thead tr > .dtfc-fixed-left,
+table.dataTable thead tr > .dtfc-fixed-right,
+table.dataTable tfoot tr > .dtfc-fixed-left,
+table.dataTable tfoot tr > .dtfc-fixed-right {
+ top: 0;
+ bottom: 0;
+ z-index: 3;
+ background-color: white;
+}
+
+table.dataTable tbody tr > .dtfc-fixed-left,
+table.dataTable tbody tr > .dtfc-fixed-right {
+ z-index: 1;
+ background-color: white;
+}
+
+div.dtfc-left-top-blocker,
+div.dtfc-right-top-blocker {
+ background-color: white;
+}
\ No newline at end of file