1. For the need of a simple tabular Grid in your Angular JS application, one of the most basic and simple to use package is angular-ui-grid. The implementation is easy in many of the use cases, but when it comes to extend the limits of the ui-grid, life becomes tough.

    One of the tricky task is to set the Grid height as dynamic, in other words to make the grid more flexible to number of rows and the grid size would depend on it.

    Lets begin with the

    Prerequisites:

    1. Angular JS: v1.4.2
    2. ui-grid-stable: v3.0.1
    3. Dataset: https://rawgit.com/angular-ui/ui-grid.info/gh-pages/data/100.json
    the Dataset contains 100 rows

    In case you are new to ui-grid refer to the official doc: angular-ui-grid

    Refer to the complete code in this plnkr: http://plnkr.co/edit/i5zAuUKz2RdJpuq5YKud

    The Next Step-

    Setting up all the things:

    1. Create 3 file:
      1. app.js - Contains your Angular JS code.
      2. index.html - Contains the UI HTML5 code.
      3. main.css - Our styling stuff goes here.
    2. Required imports in index.html are:
      1. JS Scripts 
        1. src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular.js"
        2. src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular-touch.js"
        3. src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular-animate.js"
        4. src="http://ui-grid.info/release/ui-grid-stable.js"
      2.  CSS Styling 
        1. href="http://ui-grid.info/release/ui-grid-stable.css"

    Lets jump to the code:

    Our base controller is in app.js

    var app = angular.module('app', ['ngAnimate', 'ui.grid']);
     
    app.controller('MainCtrl', ['$scope', '$http', function ($scope, $http) {
      $scope.maxRowToShow = 1000;
      $scope.gridOptions = {
          enableColumnMenus: false,
          enableHiding: false,
          enableSorting: false
        };
      $scope.gridOptions.columnDefs= [
          { field: 'name' },
          { field: 'gender' },
          { field: 'company', enableSorting: false }
        ];
     
      $scope.getTableHeight = getTableHeight;
     
      $http.get('https://rawgit.com/angular-ui/ui-grid.info/gh-pages/data/100.json')
        .success(function(data) {
          $scope.gridOptions.data = data;
          setMinRowsToShow();
        });
     
      function setMinRowsToShow(){
        //This function is to set the rowContainer with minimum row limit to be stored 
        //in the visibleRowCache.
        //It handles and rogue cache or missed rows due to dynamically generated Table Height.
        $scope.gridOptions.minRowsToShow = Math.min($scope.gridOptions.data.length, $scope.maxRowToShow);
        $scope.gridOptions.virtualizationThreshold = $scope.gridOptions.minRowsToShow ;
      }
     
      function getTableHeight() {
        let rowHeight = 37; // row height
        let headerHeight = 48; // header height
        return {
          height: ($scope.gridOptions.data.length * rowHeight + headerHeight) + "px"
        };
      }
    }]);
     

    Dive in the Code:

    • maxRowToShow: This defines the upper limit of rows to be rendered
    • Initial Grid config: 
      • enableColumnMenus: false,
      • enableHiding: false,
      • enableSorting: false
    • Fetch and store data in scope.gridOptions.data
    • getTableHeight: Now here is where the magic happens-
      • we give the rowHeight and headerHeight as defined in our css or as per your requirement
      • Calculation of height attribute using the below formula:-
    (Number of data rows) * rowHeight + headerHeight [in px]

    • columnDefs: Contains the meta data for your grid column, like name, specific formatting etc.
    • Lastly, the one which is bit confusion is setMinRowsToShow, which we will cover once i have shown you the output
    The initial output looks like this without dynamic height:

    Now with the Dynamic Height:
    UI Grid with dynamic height, but we can see a large white gap between the last row and footer

    As you can see in the above image there is a large white gap between the last row and footer, this is because of below reason:
    1. grid.renderContainers.body.visibleRowCache does not refresh the renderedRows arry when splicing in more data. That means when the number of rows are more in conjunction with the grid height, the module is unable to refresh renderedRows and we see only 4 rows
      Here are the counts:
      1. renderedRows: 4
      2. visibleRowCache: 100
      3. visibleColumnCache: 3
      4. viewportAdjuster: 1
    2. The above issue of only 4 rows in renderedRows array is due to the fact that ui-grid does not completely support dynamic height feature.
    3. But there is this parameter which comes to our rescue - virtualisationThreshold
    4. Lets fix the above issue gracefully:
    $scope.gridOptions.minRowsToShow = Math.min($scope.gridOptions.data.length, $scope.maxRowToShow);
    $scope.gridOptions.virtualizationThreshold = $scope.gridOptions.minRowsToShow ;
    In Above code we will set gridOptions.virtualizationThreshold to the number of data rows or the max rows as configured, this was the ui-grid rendering mechanism knows that how many rows it need to check for to refresh renderedRows.

    After the above changes our issue is resolved and we see the output like below:

    The Final Output


    Hope you find this article useful, let me know the feedback or any queries below as comments.



    0

    Add a comment

  2. Hey guys, Hope you all are doing great. 

    Algorithm To Convert Post-fix Expression into Infix expression:-

    1. Scan the Post-fix String from Left to Right.
    2. If the character is an Operand, then Push it on to the deque.
    3. If the character is an Operator, then Pop left Operator 1 and Operand 2 and concatenate them using Infix notation where the Operator is in between the Two Operands.
    4. The resultant expression is then pushed on the deque.
    5. Repeat the above steps till the Post-fix string is not scanned completely.
    6. Use parentheses properly to ensure correct order for evaluating the final expression.

    Code Implementation:-


    # -*- coding: utf-8 -*-
    """
    Created on Wed Dec 22 22:58:14 2018
    @author: Kurtesy
    """
    from collections import deque
    OPERATORS = '+-/*'
    
    
    def postfix_to_infix(my_queue):
        if len(my_queue) == 1:
            return my_queue
        variable_1 = my_queue.popleft()
        """Handles left to right operation"""
        if variable_1 in OPERATORS:
            operand2 = my_queue.pop()
            operand1 = my_queue.pop()
            my_queue.append(('(%s)' % ''.join([operand1, variable_1, operand2])))
            return postfix_to_infix(my_queue)
    
        """Handles previous expression and next operand"""
        variable_2 = my_queue.popleft()
        if variable_2 in OPERATORS:
            operand1 = my_queue.pop()
            my_queue.append(('(%s)' % ''.join([operand1, variable_2, variable_1])))
            return postfix_to_infix(my_queue)
    
        """Process complete expression"""
        operation = my_queue.popleft()
        my_queue.append(('(%s)' % ''.join([variable_1, operation, variable_2])))
        return postfix_to_infix(my_queue)
    
    
    def func(x):
        return eval()
    
    
    while 1:
        expression = input()
        """Input till # is enforced"""
        if '#' in expression:
            break
        queue = deque(expression)
        postfix = postfix_to_infix(queue)
        print(postfix.pop())
    



    Please let me know your feedback, on how i can improve and make it better. Till then!! Cheers!!
    0

    Add a comment

  3. Hey guys, Hope you all are doing great.
    As the first part of this series of Python package and installation we will cover pip vs Conda

    pip vs Conda

    pip
    • Python packages only. Compiles everything from source. Installs binary, wheel, the ones which pypi supply
    • Blessed by the core Python community (i.e., Python 3.4+ includes code that automatically boostraps pip).
    conda
    Python agnostic. The main focus of existing packages are for Python, and indeed conda itself is written in Python, but you can also have conda packages for C libraries, or R packages, or really anything.
    Installs binaries. There is a tool called conda build that builds packages from source, but conda install itself installs things from already built conda packages.
    External. Conda is the package manager of Anaconda, the Python distribution provided by Continuum Analytics, but it can be used outside of Anaconda too. You can use it with an existing Python installation by pip installing it (though this is not recommended unless you have a good reason to use an existing installation).
    In both cases:
    • Written in Python
    • Open source (conda is BSD and pip is MIT)

    The Difference... 

    pip Conda
    pip uses the official PyPI package index Conda uses the anaconda repo
    pip does not install the binaries and focus more on package installation. Conda allows you to install precompiled binaries that will work on your system, such as C Compiled binaries, etc.
    pip focusses just on package management and leaves environment management to other tools Conda also functions as an environment manager
    PyPI packages are actively updated Conda's repos generally lag behind PyPI



    To Summarize...

    pip is for Python only

    Conda is only for Anaconda + other scientific packages like R dependencies etc. NOT everyone needs Anaconda that already comes with Python. Anaconda is mostly for those who do Machine learning/deep learning etc. Casual Python dev won't run Anaconda on his laptop.



    Please let me know your feedback, on how i can improve and make it better. Till then!! Cheers!!
    0

    Add a comment

Loading