npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

angular-rs-datagrid

v1.0.78

Published

Angular directive for dataGrid with pagination in back-end and input, input-mask, chosen, combo, checkbox, multiChosen and others

Downloads

25

Readme

Directive angular-rs-datagrid

Directive is under development, version beta

Installation

With Bower:

bower install --save angular-rs-datagrid

With npm:

npm install --save angular-rs-datagrid

Datagrid component that supports several types of value editing. It is possible to set up columns of type, checkbox, href, html content, combobox, chosen, multi-chosen, popover, input fields with mask (string, number, money, br-phone, br-cpf, br- cnpj) and unmasked.

In this version this only implemented pagination in the backend.

This component works with two dependencies, angular-input-mask and angular-ui-select

How to use

include module into app

rs.datagrid

HTML template

<rs-datagrid config="config"></rs-datagrid>

Defines property config in controller

$scope.config =
{
 "classTable": "table table-bordered table-striped",  // optional, default: "table table-bordered table-striped" --->
 "messageLoading": "Loading...",                      // optional, default: "loading..."
 "messageEmpty"  : "No results", 
 "sumLabel"  : "Total: ",                             // optional, default: "Total: "
 "sort": true,                                        // optional, default: false
 "defaultSort": "id,asc",                             // optional, default is first "collumn.index", asc

 "collumns": [{                                       // required
  "title": "ID",                                      // title of collumn
  "index": "id",                                      // Property that will print in the column
  "class": "text-center" || function(row){},                             // optional, class od <th> and <td> is Possible used calback function(row)
  "style": {                                          // optional
   "width": "60px"                                    // It is possible to define some properties in html
  }
 }],
 "data": function(){
   return [{
    "id": 1,
    "name": "Lucas Rodrigues"
   }];
}

How use search

Defines a property search inside property config

$scope.config =
{
 ...
 "search": {
   "label": "Search: "         //optional
  }
  ...
}

How to set a value in the search field

Use the auxiliary method "_setSearch" specifying the value

$scope.config._setSearch(yourValue)

How listener click in row

Defines onClickRow callback function

$scope.config =
{
...
"collumns:"[],
"onClickRow": function(row){

}
...
}

How listener click in cell

Atention: You can not use onClickCell along with onClickRow, choose which one is best for you.

Defines onClickCell callback function

$scope.config =
{
...
"collumns:"[],
"onClickCell": function(row, index){

}
...
}

How override output collumn

Use the function render to override the output

$scope.config =
{
  ...
  "collumns": [{                          // required
    "title": "Render",                    // title of collumn
    "index": "name",                      // Property that will print in the column
    "render": function(row){              // callback for override the output
      return row.id+' - '+row.name;
    },
  }]
  ...
}

Is possible render html content, for this defines property isHtml

$scope.config =
{
  ...
  "collumns": [{                          // required
    "title": "Render",                    // title of collumn
    "index": "name",                      // Property that will print in the column
    "isHtml": true,
    "render": function(row){              // callback for override the output
      return "<b>"+row.id+' - '+row.name+"</b>";
    },
  }]
  ...
}

How disable sort in collumn

Defines sort = false in collumn property

$scope.config =
{
  ...
  "collumns": [
  {
    "title": "No Sort",
    "index": "lastName",
    "sort": false
  }]
  ...
}

How Stylize collumn

Defines class in collumn

$scope.config =
{
  ...
  "collumns": [
  {
    "title": "Class",
    "index": "city",
    "class": "text-center"
  }]
  ...
}

How render checkbox in collumn

Defines a property type = 'checkbox' in collumn.action.type

$scope.config =
{
  ...
  "collumns": [
  {
    "title": "",                                      // title of collumn
    "index": "enable",                                // Property that will print in the column
    "class": "text-center",                           // optional, class od <th> and <td>
    "sort": false,                                    // optional default: true
    "action": {
      "type": "checkbox",                             //required
      "checkInHeader": true,                          // Boolean, for render checkbox in header <th>
      isDisabled: function(row){                      // callback
        if (expression){
          return true;
        }else{
          return false;
        }
      },
      "onCheckHeader": function(checked) {            // callback when clicked in checkHeader
        console.log('checked: ' + checked);
      },
      "onCheck": function(obj, checked) {             // callback when clicked in check row table
        console.log('checked: ' + checked + ', obj:' + obj.id);
      }
  }],
  ...
}

How render href in collumn

Defines a property type = 'href' in collumn.action.type

$scope.config =
{
  ...
  "collumns": [{
    "title": "Href",
    "index": "github",
    "render": function(obj) { // in action href, this property is required, callback(currentRow) override collumn, for label the href
      return "open github";
    },
    "action": {
      "type": "href",
      "onClick: function(obj) {                        // callback(currentRow) when click in href
        window.open(row.github, "_blank");
      }
    }
 }],
 ...
}

How render input in collumn

Defines a property type = 'input' in collumn.action.type

$scope.config =
{
  ...
  "collumns": [{
    "title": "Input",
    "index": "nickName",
    "action": {
      "type": "input",
      "class": "input-rs",                // optional
      "style": {                          // optional
       "width": "100px"
      },
      "maxlength": 10,                    // optional
      "trigger": "blur",                  // required, default: 'blur', avaliables Triggers  'blur', 'change'
      "isDisabled": function(obj) {       // callback
        if (obj.id === 1) {
          return true;
        } else {
          return false;
        }
      },
      "onChange": function(row) {         // callback when exec trigger
       console.log('Row actual: '+row);
      }
    }
  }],
 ...
}

How render input with mask 'Number' in collumn

Defines a property type = 'input' and mask in collumn.action

$scope.config =
{
  ...
  "collumns": [{
    "title": "Input",
    "index": "nickName",
    "action": {
      "type": "input",
      "trigger": "blur",                  // required, default: 'blur', avaliables Triggers  'blur', 'change'
      "mask": {
        "use": "number",                  // avaliables uses: 'number', 'money', 'br-phone','br-cep','br-cpf','br-cpfcnpj'
        "decimalPlace": 2,                // number of decimals
        "maxlength": 11,
        "negative": true                  // optional, default false
      },
      "isDisabled": function(obj) {       // callback
        if (obj.id === 1) {
          return true;
        } else {
          return false;
        }
      },
      "onChange": function(row) {         // callback when exec trigger
       console.log("Row actual: "+row);
      }
    }
  }],
 ...
}

Mask Money

$scope.config =
{
  ...
  mask: {
    use: 'money',
    decimalPlace: 2,          // number of decimals
    maxlength: 11
  },
  ...
}

Mask br-phone

$scope.config =
{
  ...
  mask: {
    use: 'br-phone'
  },
  ...
}

Mask br-cep

$scope.config =
{
  ...
  mask: {
    use: 'br-cep'
  },
  ...
}

Mask br-cpf

Callback has two parameters, row and isValid, isValid is result validation cpf

$scope.config =
{
  ...
  mask: {
    use: 'br-cpf'
  },
  onChange: function(row, isValid) {      //callback
    if(isValid){
      console.log('execute action here');
    }else{
     console.log('CPF inválido');
    }
  }
  ...
}

Mask br-cnpj

Callback has two parameters, row and isValid, isValid is result validation cnpj

$scope.config =
{
  ...
  mask: {
    use: 'br-cnpj'
  },
  onChange: function(row, isValid) {      //callback
    if(isValid){
      console.log('execute action here');
    }else{
     console.log('CNPJ inválido');
    }
  }
  ...
}

Mask br-cpfcnpj

Callback has two parameters, row and isValid, isValid is result validation

$scope.config =
{
  ...
  mask: {
    use: 'br-cpfcnpj'
  },
  onChange: function(row, isValid) {      //callback
    if(isValid){
      console.log('execute action here');
    }else{
     console.log('Campo inválido');
    }
  }
  ...
}

How render comboBox in collumn

Defines a property type = 'combo' and mask in collumn.action

$scope.config =
{
  ...
  collumns: [{
    title: "Combo",
    index: 'status',
    action: {
      type: 'combo',
      class: '',                                     // optional
      style: {                                    // optional
       width: '100px'
      },
      avaliablesChoises: ["ACTIVE","INACTIVE"], // required, Collection for populate combo, not use array of object for this use "chosen
      labelChoose: 'Select...',                      // optional, if defined, create a empty option
      isDisabled: function(obj) {                    // optional, callback for disable the combo
        if (obj.id === 1) {
          return true;
        } else {
          return false;
        }
      },
      onChange: function(obj) {
        console.log('execute action here');
      }
    }
  }],
 ...
}

How render chosen in collumn

Defines a property type = 'chosen' and mask in collumn.action

$scope.config =
{
  ...
  collumns: [{
    title: 'Chosen',
    index: 'tag',
    action: {
      type: 'chosen',
      placeholder: 'Selecione um tag...',
      class: '',                            // optional
      style: {                           // optional
       width: '100px'
      },
      theme: 'select2',
      searchIn: ['id','nome'],              // property the object for search
      allowClear: false,                    // [x] button clear - default is false
      selectedRender: function(item){       // optional
        return item.nome;
      },
      itemRender: function(item){
        var ret =  '<small>';
        ret     += 'id:'+item.id+'<br/>';
        ret     += 'nome: '+item.nome+'<br/>';
        ret     += '</small>';
        return ret;                   // is possible return html content
      },
      isDisabled: function(obj){
        if (obj.id == 1){
          return true;
        }
        return false;
      },
      avaliablesChoises: [{
        id: 1,
        nome: 'tag 1'
      },{
        id: 2,
        nome: 'tag 2'
      }],
      onChange: function(obj, newValue) {
        console.log('execute action here: ' + obj.id);
      }
   }],
  ...
}

How render multiChosen in collumn

Defines a property type = 'multiChosen' and mask in collumn.action

$scope.config =
{
  ...
  collumns: [{
    title: 'Multi-Chosen',
    index: 'nome',
    action: {
      type: 'multiChosen',
      placeholder: 'Selecione um tag...',
      theme: 'select2',
      searchIn: ['id','nome'],
      selectedsRender: function(item){
        return item.nome;
      },
      itemRender: function(item){
        return item.nome;
      },
      onRemove : function(row, item, model){
        console.log(item);
      },
      isDisabled: function(obj){
        if (obj.id == 1){
          return true;
        }
        return false;
      },
      avaliablesChoises: [{
        id: 1,
        nome: 'tag 1'
      },{
        id: 2,
        nome: 'tag 2'
      },{
        id: 3,
        nome: 'tag 3'
      },{
        id: 4,
        nome: 'tag 4'
      },{
        id: 5,
        nome: 'tag 5'
      },{
        id: 6,
        nome: 'tag 6'
      }],
      onSelect: function(row, item, model) {
        console.log('execute action here: ' + item.id);
      }
  }],
  ...
}

How render buttons

The buttons are always rendered in the last column Defines a property buttons in config

$scope.config =
{
  ...
  collumns: [{...}],
  buttons: [
    {
      text: 'Excluir',                              //optional
      classButton: 'btn btn-xs btn-primary',        // class ex: <button class="btn btn-xs btn-primary"></button>
      onClick: function(obj) {                      // callback when clicked
        console.log('Execute action here obj clicked:' + obj.id);
      }
    },
    {
      text: function(row){                          //callback for condition text
        return row.action.name;
      }
      ...
    },
    {
      tooltip: function(row){                          //callback for condition text tooltip
        return row.action.name;
      }
      ...
    },
    {
      tooltip: 'Tooltip',                           //optional
      classIcon: 'glyphicon glyphicon-remove',      // class for icon in button
      classButton: 'btn btn-xs btn-danger',         // class ex: <button class="btn btn-xs btn-danger"></button>
      isVisible: function(obj) {                    // callback for handle when the button will be rendered according a boolean expression
        if (obj.id == 1) {
          return false;
        } else {
          return true;
        }
      },
      isDisabled: function(obj) {                    // callback for handle when the button will be disabled according a boolean expression
        if (obj.id == 1) {
          return false;
        } else {
          return true;
        }
      },
    }
  ]
  ...
}

Render popover for Row

Defines a property popoverRow, trigger is hover in row

$scope.config =
{
  ...
  popoverRow: {                                       // optional
    titleRender: function (row){                      // optional, callback(currentRow) for render title in popover
      return row.name+' '+row.lastName;
    },
    templateUrl: 'template-popover.html',             // required type: String "popover-template.html"
    ngModel: 'popover',                               // required type: String (that presents the model in popover template)
    getModel: function(row){                          // Callback must return an object, this object will be sent to the popover template, if it is not defined a callback will be sent the object of row
      return row;
    }
  },
  ...
}

template-popover.html

<div>
  <p>Nick Name: `{{this.popover.nickName}}</p>
  <p>City: `{{this.popover.city.name}}`</p>
</div>

How force refresh datagrid

Call broadcast

$scope.$broadcast("rsDatagrid:refresh");

How use pagination in component

This version only implements pagination in backend Defines property pagination in config

$scope.config =
{
  ...
  pagination: {                                       // optional
    labelSize: 'Registros por página: ',              // optional, default "Page size: ""
    defaultSize: 10,                                  // optional, default first item in avaliableSizes
    avaliableSizes: [10, 25, 50, 100, 500],           // optional, default [10,25,50,100]
    positionBottom: true                              // optional, default is true, position over top
  },
  ...
}

When using paging, you must implement a lazyData function within the configuration, this function is responsive to update or components automatically, page sorts and other

$scope.config =
{
  ...
  lazyData: function(page, size, sort, search) {
    var params = {
      page: page,
      size: size,
      sort: sort,
      search: search
      };
      return $http({
        url: "http://localhost:8080/acoes",
        method: 'GET',
        params: params,
      }).then(function(result) {
        return result.data;
      });
  },
  ...
};

Then JSON RESPONSE for pagination in back-end, this example the implementation in spring data.

{
  "content": [{
    ...
    ...
  }],
  "totalElements": 10,
  "last": false,
  "totalPages": 1,
  "first": true,
  "sort": [{
    "direction": "ASC",
    "property": "id"
  }],
  "numberOfElements": 10,
  "size": 10,
  "number": 0
}

How to set the current page

Use the auxiliary method "_setCurrentPage" specifying the value

$scope.config._setCurrentPage(yourValue)

License

MIT