<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anjan Kumar</title>
    <description>The latest articles on DEV Community by Anjan Kumar (@anjnkmr).</description>
    <link>https://dev.to/anjnkmr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F412297%2F030a1a96-9fca-4917-9d03-664311bf3688.jpeg</url>
      <title>DEV Community: Anjan Kumar</title>
      <link>https://dev.to/anjnkmr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anjnkmr"/>
    <language>en</language>
    <item>
      <title>Binary Clock JS</title>
      <dc:creator>Anjan Kumar</dc:creator>
      <pubDate>Tue, 13 Jul 2021 19:31:29 +0000</pubDate>
      <link>https://dev.to/anjnkmr/binary-clock-js-3ok6</link>
      <guid>https://dev.to/anjnkmr/binary-clock-js-3ok6</guid>
      <description>&lt;p&gt;I have developed a library for generating binary clock on a &lt;code&gt;canvas&lt;/code&gt; tag as well as on a &lt;code&gt;terminal&lt;/code&gt; window&lt;/p&gt;

&lt;p&gt;checkout and let me know your ideas&lt;/p&gt;

&lt;p&gt;&lt;a href="https://npmjs.com/package/binary-clock-js"&gt;Package Link&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anjnkmr.github.io/binary-clock-js/web/"&gt;Demo Link&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Screenshots
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r8PNTSmJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/opg0aibsfbemqq38nrbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r8PNTSmJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/opg0aibsfbemqq38nrbf.png" alt="Screenshot 1"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SSO6A4KX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yve8ff8eghmnbm7qkavy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SSO6A4KX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yve8ff8eghmnbm7qkavy.png" alt="Screenshot 2"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uX_SDUfd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nctjc3gd9sroa4eo0mwl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uX_SDUfd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nctjc3gd9sroa4eo0mwl.gif" alt="Screenshot 3"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8UyuTu5n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mgpf6ji9s6bkhknjnowk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8UyuTu5n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mgpf6ji9s6bkhknjnowk.png" alt="Screenshot 4"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>canvas</category>
      <category>binaryclock</category>
    </item>
    <item>
      <title>Keycloak Integration in Angular Application</title>
      <dc:creator>Anjan Kumar</dc:creator>
      <pubDate>Thu, 25 Jun 2020 05:54:06 +0000</pubDate>
      <link>https://dev.to/anjnkmr/keycloak-integration-in-angular-application-5a43</link>
      <guid>https://dev.to/anjnkmr/keycloak-integration-in-angular-application-5a43</guid>
      <description>&lt;h3&gt;
  
  
  What is &lt;a href="https://www.keycloak.org/"&gt;Keycloak&lt;/a&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An Open Source Identity and Access Management for Modern Applications and Services. &lt;/li&gt;
&lt;li&gt;One of the opensource implementation of &lt;a href="https://openid.net/"&gt;OpenID&lt;/a&gt; protocol.&lt;/li&gt;
&lt;li&gt;Simple Identity Layer on top of &lt;a href="https://oauth.net/2/"&gt;OAuth2.0&lt;/a&gt; protocol&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why do we need Keycloak in Angular?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;To secure our application from unauthorized access&lt;/li&gt;
&lt;li&gt;To identify who is the user of the application, to show the relevant content &amp;amp; authorized content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Angular 6/+ Application&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Steps to Integrate Keycloak in Angular Application
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install Keycloak JS package

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm i --save keycloak-js&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Install Keycloak Angular package

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm i --save keycloak-angular&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Keycloak Server Configuration

&lt;ol&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UCjMyBkL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/drvk2d85t4lhn53pinl5.PNG" alt="environment.ts"&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Keycloak Initialization

&lt;ol&gt;
&lt;li&gt;Create a file AppInit.ts in the project src directory
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5AF-WqX2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zpwwx6gwfti0qns30jzx.PNG" alt="AppInit.ts"&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Integrating into AppModule (Refer the image below these points)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import &lt;code&gt;KeycloakAngularModule&lt;/code&gt; in &lt;code&gt;AppModule&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Register Provider &lt;code&gt;KeyloackService&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Register Provider of type &lt;code&gt;APP_INITIALIZER&lt;/code&gt; with &lt;code&gt;initializer&lt;/code&gt; we defined in &lt;code&gt;AppInit.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Register Provider &lt;code&gt;AuthService&lt;/code&gt; (You can find the &lt;code&gt;AuthService&lt;/code&gt; implementation below)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AuthService&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XDyJtA8N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3k6brdbvjw7imw8ljmf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XDyJtA8N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3k6brdbvjw7imw8ljmf2.png" alt="auth.service.ts"&gt;&lt;/a&gt;&lt;br&gt;
 AppModule&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5yxxcmBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zg2gs6gqzzkjd3uh8t5n.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5yxxcmBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zg2gs6gqzzkjd3uh8t5n.PNG" alt="app-module.ts"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Guard configuration&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Guard &lt;code&gt;ng new g auth&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change the definition of the class as below, notice the &lt;code&gt;extends&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--29WBk3Gr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/epeq44hfy22vzjesfhmf.PNG" alt="auth.guard.ts"&gt;
&lt;/li&gt;
&lt;li&gt;Routing Module Configuration, 
Use the &lt;code&gt;AuthGuard&lt;/code&gt; for routes that you want to restrict access, 
Assign required roles for each route in &lt;code&gt;data&lt;/code&gt; attribute, &lt;code&gt;roles&lt;/code&gt; parameter as an array.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zIa_yVMC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qgxw9pvxdybyhvclmmv4.PNG" alt="app-routing.module.ts"&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the application &lt;code&gt;ng s&lt;/code&gt;, then you will have the login screen provided by the Keycloak, log in with the correct user to access your application who has the roles that are assigned in the routing configuration&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lUmMfSo_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1n0zvgoadgssgvuazvkt.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lUmMfSo_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1n0zvgoadgssgvuazvkt.PNG" alt="Keycloak Login Screen"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>keycloak</category>
      <category>angular</category>
      <category>webdev</category>
      <category>openid</category>
    </item>
    <item>
      <title>SSH Connection Shortcut in Windows</title>
      <dc:creator>Anjan Kumar</dc:creator>
      <pubDate>Tue, 23 Jun 2020 10:27:35 +0000</pubDate>
      <link>https://dev.to/anjnkmr/ssh-connection-shortcut-in-windows-13la</link>
      <guid>https://dev.to/anjnkmr/ssh-connection-shortcut-in-windows-13la</guid>
      <description>&lt;p&gt;In general, I use Ubuntu/ other Linux variants for the development machine. I recently switched to Windows 10 to do some documentation&lt;br&gt;
In Windows 10 there are a lot more improvements than earlier, we can directly use &lt;code&gt;ssh&lt;/code&gt; command in Command Prompt to connect server.&lt;br&gt;
I frequently used to connect servers so many times a day, it is very difficult to run the same command again and again as the command history doesn't persist between sessions. So I found a simple way to create a shortcut for &lt;code&gt;SSH Connection&lt;/code&gt; without any software installation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Right Click on Desktop New =&amp;gt; Shortcut&lt;/li&gt;
&lt;li&gt;Popup Dialog will be displayed asking for the location of the file

&lt;ul&gt;
&lt;li&gt;Enter &lt;code&gt;C:\Windows\System32\cmd.exe /k ssh -i path\to\key.pem username@ipaddress&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save it with a name&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>windows</category>
      <category>ssh</category>
      <category>batch</category>
      <category>shortcut</category>
    </item>
    <item>
      <title>Angular Tree Table</title>
      <dc:creator>Anjan Kumar</dc:creator>
      <pubDate>Mon, 22 Jun 2020 11:58:53 +0000</pubDate>
      <link>https://dev.to/anjnkmr/angular-tree-table-10jm</link>
      <guid>https://dev.to/anjnkmr/angular-tree-table-10jm</guid>
      <description>&lt;p&gt;An angular plugin that will help you to display the hierarchical table data in a expand/ collapsible manner with a lot of other options&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodei.co/npm/angular-tree-table/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SwvV4HpP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nodei.co/npm/angular-tree-table.png" alt="NPM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Node JS&lt;/code&gt; &amp;gt;= 9&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Angular&lt;/code&gt; &amp;gt;= 8&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i jquery&lt;/code&gt; — Dependency for Bootstrap&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i popper.js&lt;/code&gt; —To show the Column Visibility popover&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i bootstrap&lt;/code&gt; — To show the Column Visibility popover and design&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i file-saver&lt;/code&gt; —To store the API exported or generated file&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i xlsx&lt;/code&gt; —To generate Excel while not using server-side processing&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i moment&lt;/code&gt; —To sort date columns while not using server side processing&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm i jquery popper.js bootstrap file-saver xlsx moment angular-tree-table --save&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Updating &lt;code&gt;angular.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Adding jQuery, Popper JS, Bootstrap CSS, and JS -&lt;br&gt;
Add the following lines in scripts array under build section&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"node_modules/jquery/dist/jquery.min.js",
"node_modules/popper.js/dist/umd/popper.min.js",
"node_modules/bootstrap/dist/js/bootstrap.min.js"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Add the following lines in styles array under build section&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node_modules/bootstrap/dist/css/bootstrap.min.css&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Integrating into Angular Application
&lt;/h2&gt;

&lt;p&gt;import &lt;code&gt;AngularTreeTableModule&lt;/code&gt; in &lt;code&gt;app.module.ts&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration in Component
&lt;/h2&gt;

&lt;p&gt;Declare the below variables for table initialization&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tableData: TreeTableData = null; //Table Data Holder
tableConfig = new TreeTableDataConfig(); //Table Configuration
tableHeaders: TreeTableHeaderObject[] = []; //Table Headers and Property Binding
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Declare the below methods to populate dummy data into the table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;populateDummyData() {
    const data = [];
    for (let i = 0; i &amp;lt; 120; i++) {
      const row = new TreeTableRow(i + '', { sno: i+1, name: 'John '+(i+1), age: i+1. address: {dno: '1-23'}}, false, null);
      data.push(row);
    }
    this.tableData = new TreeTableData(this.tableConfig);
    this.populateHeaders();
    this.tableData.data = data;
  }
  populateHeaders() {
    this.tableHeaders.splice(0, this.tableHeaders.length);
    this.tableHeaders.push(new TreeTableHeaderObject('Sno', 'sno', null, true));
    this.tableHeaders.push(new TreeTableHeaderObject('Name', 'name', null, true));
    this.tableHeaders.push(new TreeTableHeaderObject('Age', 'age', null, true));
    this.tableHeaders.push(new TreeTableHeaderObject('User Details', '=CONCAT(Name: |||name|||&amp;lt;br/&amp;gt;|||Age: |||age)', null, true));
    this.tableHeaders.push(new TreeTableHeaderObject('D.no', 'address.dno', null, true));
    this.tableData.headers = this.tableHeaders;
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Adding View Element in Component View
&lt;/h2&gt;

&lt;p&gt;Add the below tag in Component HTML View&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;angular-tree-table [tableData]=”tableData”&amp;gt;&amp;lt;/angular-tree-table&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With this, you will get the view of basic Table with given data&lt;/p&gt;

&lt;p&gt;Basic Tree Table Screenshot&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RtC7rFGR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ArF21qkfblc4QlutrC8Lomw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RtC7rFGR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ArF21qkfblc4QlutrC8Lomw.png" alt="Basic Tree Table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expandable Table View
&lt;/h2&gt;

&lt;p&gt;To configure the row as an expandable, we need to configure the table as below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tableConfig = {
  showExpandArrows: true, // Showing Arrows each possible row
  showExpandAllArrows: true // Expand all button
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update the &lt;strong&gt;populateDummyData&lt;/strong&gt; method as below to add Children to row&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**populateDummyData**() {
    const data = [];
    for (let i = 0; i &amp;lt; 120; i++) {
      const row = new TreeTableRow(i + '', { sno: i+1, name: 'John '+(i+1), age: i+1}, false, null);
      if (i % 10 !== 0) {
        row.expandable = true;
        const subTableData = new TreeTableData(this.tableConfig); //We can add new config object if required
        const subData = [];
        for (let j = 0; j &amp;lt; (10 - i % 10); j++) {
          const subRow = new TreeTableRow(j + '', { sno: j + 1, name: 'Paul ' + (j + 1), age: j + 1}, false, null);
          subData.push(subRow);
        }
        subTableData.headers = this.tableHeaders; //Using the same headers as parent table, we can use separate if required
        subTableData.data = subData;
        row.children = subTableData;
      }
      data.push(row);
    }
    this.tableData = new TreeTableData(this.tableConfig);
    this.populateHeaders();
    this.tableData.data = data;
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Expandable Table Screenshot&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5pQ6LrUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Ap5u3dTcECs_2ibmDmtkUOQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5pQ6LrUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Ap5u3dTcECs_2ibmDmtkUOQ.png" alt="Expandable Table View"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Column Visibility Options
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;columnVisibility: true, // To show columns visibility options on table
columnVisibilityDropDown: true // To show columns visibility options on table as a popover
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Column Visibility Options Demo — Popover and Buttons&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7GTwpnIp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AA3fdEYmcA2zFHNcIProwzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7GTwpnIp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AA3fdEYmcA2zFHNcIProwzw.png" alt="Column Visibility"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Configuration Options
&lt;/h2&gt;

&lt;p&gt;There are so many options, most of them are self-explanatory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tableConfig = {
      context: null, // Context for click actions
      extraInfos: [], // Show data above the table
      showTableHeaders: true, // To show/ hide headers
      columnVisibility: false, // To show columns visibility options on table
      columnVisibilityDropDown: false, // To show columns visibility options on table as popover
      visibleColumnFiltersVisibility: false,
      visibleColumnFilters: {},
      showExpandArrows: false,
      fullClassName: 'stacktable table-bordered large-only table table-sm',
      sortAscClassName: 'col-sort col-sort-asc',
      sortDescClassName: 'col-sort col-sort-desc',
      sortNothingClassName: 'col-sort col-sort-nothing',
      customClassName: null,
      showExpandAllArrows: false,
      showExpandAllEmptyChildren: false,
      sortedColumn: {},
      showPageLengthDropdown: true,
      pageSizes: [10, 25, 50, 100],
      level: 0,
      columnFilters: {},
      rowClickablesContext: null,
      rowClickables: {},
      commonSearch: true,
      excelExportButton: false,
      excelExportFileName: 'ExportFile',
      excelExportButtonText: 'Excel Export',
      excelExportAllChildren: true,
      excelExportOnlyExpanded: false,
      events: {
          shouldRowExpand: null,
          rowExpanded: null,
          shouldRowCollapse: null,
          rowCollapsed: null
      }
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;DEMO:&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  AngularTreeTable Sample
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://anjnkmr.github.io/angular-tree-table"&gt;https://anjnkmr.github.io/angular-tree-table&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CODE:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/anjnkmr/angular-tree-table"&gt;https://github.com/anjnkmr/angular-tree-table&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Medium Link&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/@anjnkmr/angular-tree-table-bb9312c9720"&gt;https://medium.com/@anjnkmr/angular-tree-table-bb9312c9720&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>html</category>
    </item>
  </channel>
</rss>
