{"id":32229663,"url":"https://github.com/lucrod1/angular-rs-datagrid","last_synced_at":"2025-12-12T04:05:23.436Z","repository":{"id":57179029,"uuid":"76275250","full_name":"lucrod1/angular-rs-datagrid","owner":"lucrod1","description":"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, input fields with mask (string, number, money, br-phone, br-cpf, br- cnpj) and unmasked.","archived":false,"fork":false,"pushed_at":"2018-09-03T20:39:12.000Z","size":335,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-22T10:59:25.121Z","etag":null,"topics":["checkbox","collumn","combobox","datagrid","datagrid-editable","datagridview","edit-grid","edit-row","grid-advanced","grid-auto-complete","mask","multi-choises-grid","pagination","popover"],"latest_commit_sha":null,"homepage":"","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lucrod1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-12T16:36:56.000Z","updated_at":"2024-11-20T21:09:59.000Z","dependencies_parsed_at":"2022-09-11T01:51:37.244Z","dependency_job_id":null,"html_url":"https://github.com/lucrod1/angular-rs-datagrid","commit_stats":null,"previous_names":["lucrod1/angular.datagrid","lucrod1/rs-datagrid"],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/lucrod1/angular-rs-datagrid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucrod1%2Fangular-rs-datagrid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucrod1%2Fangular-rs-datagrid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucrod1%2Fangular-rs-datagrid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucrod1%2Fangular-rs-datagrid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucrod1","download_url":"https://codeload.github.com/lucrod1/angular-rs-datagrid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucrod1%2Fangular-rs-datagrid/sbom","scorecard":{"id":602967,"data":{"date":"2025-08-11","repo":{"name":"github.com/lucrod1/angular-rs-datagrid","commit":"31340f011bde96aa1993aebf85fcc72a6606ac60"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":5,"reason":"Found 10/20 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 20 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-21T00:52:15.223Z","repository_id":57179029,"created_at":"2025-08-21T00:52:15.223Z","updated_at":"2025-08-21T00:52:15.223Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280424216,"owners_count":26328462,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-22T02:00:06.515Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["checkbox","collumn","combobox","datagrid","datagrid-editable","datagridview","edit-grid","edit-row","grid-advanced","grid-auto-complete","mask","multi-choises-grid","pagination","popover"],"created_at":"2025-10-22T10:59:34.998Z","updated_at":"2025-10-22T10:59:37.877Z","avatar_url":"https://github.com/lucrod1.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Directive angular-rs-datagrid\n#### Directive is under development, version beta\n\n## Installation\n\nWith Bower:\n\n```\nbower install --save angular-rs-datagrid\n```\n\nWith npm:\n\n```\nnpm install --save angular-rs-datagrid\n```\nDatagrid 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.\n\n`In this version this only implemented pagination in the backend.`\n\nThis component works with two dependencies, angular-input-mask and angular-ui-select\n\n## How to use\ninclude module into app\n\n```\nrs.datagrid\n```\n\n### HTML template\n\n```\n\u003crs-datagrid config=\"config\"\u003e\u003c/rs-datagrid\u003e\n```\n\n### Defines property config in controller\n\n```\n$scope.config =\n{\n \"classTable\": \"table table-bordered table-striped\",  // optional, default: \"table table-bordered table-striped\" ---\u003e\n \"messageLoading\": \"Loading...\",                      // optional, default: \"loading...\"\n \"messageEmpty\"  : \"No results\", \n \"sumLabel\"  : \"Total: \",                             // optional, default: \"Total: \"\n \"sort\": true,                                        // optional, default: false\n \"defaultSort\": \"id,asc\",                             // optional, default is first \"collumn.index\", asc\n \"classRow\": \"disabled\" || function(row){},           // optional, class on \u003ctr\u003e is possible used calback function(row)\n\n \"collumns\": [{                                       // required\n  \"title\": \"ID\",                                      // title of collumn\n  \"index\": \"id\",                                      // Property that will print in the column\n  \"class\": \"text-center\" || function(row){},          // optional, class od \u003cth\u003e and \u003ctd\u003e is Possible used calback function(row)\n  \"style\": {                                          // optional\n   \"width\": \"60px\"                                    // It is possible to define some properties in html\n  }\n }],\n \"data\": function(){\n   return [{\n    \"id\": 1,\n    \"name\": \"Lucas Rodrigues\"\n   }];\n}\n```\n\n## How use search\nDefines a property search inside property config\n\n```\n$scope.config =\n{\n ...\n \"search\": {\n   \"label\": \"Search: \"         //optional\n  }\n  ...\n}\n```\n\n## How configure columns show visibles\nDefines a property search inside property config\n\n```\n$scope.config =\n{\n ...\n \"setupColumns\": {\n   \"id\": \"name_of_table_with_cod_user_logged\" //id tables with id user for persist in local storage\n  }\n  ...\n}\n```\n\n## How to set a value in the search field\nUse the auxiliary method \"_setSearch\" specifying the value\n\n```\n$scope.config._setSearch(yourValue)\n```\n\n## How listener click in row\nDefines onClickRow callback function\n```\n$scope.config =\n{\n...\n\"collumns:\"[],\n\"onClickRow\": function(row){\n\n}\n...\n}\n```\n\n## How listener click in cell\n#### Atention: You can not use onClickCell along with onClickRow, choose which one is best for you.\nDefines onClickCell callback function\n```\n$scope.config =\n{\n...\n\"collumns:\"[],\n\"onClickCell\": function(row, index){\n\n}\n...\n}\n```\n\n## How override output collumn\nUse the function render to override the output\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [{                          // required\n    \"title\": \"Render\",                    // title of collumn\n    \"index\": \"name\",                      // Property that will print in the column\n    \"render\": function(row){              // callback for override the output\n      return row.id+' - '+row.name;\n    },\n  }]\n  ...\n}\n```\nIs possible render html content, for this defines property isHtml\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [{                          // required\n    \"title\": \"Render\",                    // title of collumn\n    \"index\": \"name\",                      // Property that will print in the column\n    \"isHtml\": true,\n    \"render\": function(row){              // callback for override the output\n      return \"\u003cb\u003e\"+row.id+' - '+row.name+\"\u003c/b\u003e\";\n    },\n  }]\n  ...\n}\n```\n\n## How disable sort in collumn\nDefines sort = false in collumn property\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [\n  {\n    \"title\": \"No Sort\",\n    \"index\": \"lastName\",\n    \"sort\": false\n  }]\n  ...\n}\n```\n\n## How Stylize collumn\nDefines class in collumn\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [\n  {\n    \"title\": \"Class\",\n    \"index\": \"city\",\n    \"class\": \"text-center\"\n  }]\n  ...\n}\n```\n\n## How render checkbox in collumn\nDefines a property type = 'checkbox' in collumn.action.type\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [\n  {\n    \"title\": \"\",                                      // title of collumn\n    \"index\": \"enable\",                                // Property that will print in the column\n    \"class\": \"text-center\",                           // optional, class od \u003cth\u003e and \u003ctd\u003e\n    \"sort\": false,                                    // optional default: true\n    \"action\": {\n      \"type\": \"checkbox\",                             //required\n      \"checkInHeader\": true,                          // Boolean, for render checkbox in header \u003cth\u003e\n      isDisabled: function(row){                      // callback\n        if (expression){\n          return true;\n        }else{\n          return false;\n        }\n      },\n      \"onCheckHeader\": function(checked) {            // callback when clicked in checkHeader\n        console.log('checked: ' + checked);\n      },\n      \"onCheck\": function(obj, checked) {             // callback when clicked in check row table\n        console.log('checked: ' + checked + ', obj:' + obj.id);\n      }\n  }],\n  ...\n}\n```\n\n## How render href in collumn\nDefines a property type = 'href' in collumn.action.type\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [{\n    \"title\": \"Href\",\n    \"index\": \"github\",\n    \"render\": function(obj) { // in action href, this property is required, callback(currentRow) override collumn, for label the href\n      return \"open github\";\n    },\n    \"action\": {\n      \"type\": \"href\",\n      \"onClick: function(obj) {                        // callback(currentRow) when click in href\n        window.open(row.github, \"_blank\");\n      }\n    }\n }],\n ...\n}\n```\n\n## How render input in collumn\nDefines a property type = 'input' in collumn.action.type\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [{\n    \"title\": \"Input\",\n    \"index\": \"nickName\",\n    \"action\": {\n      \"type\": \"input\",\n      \"class\": \"input-rs\",                // optional\n      \"style\": {                          // optional\n       \"width\": \"100px\"\n      },\n      \"maxlength\": 10,                    // optional\n      \"trigger\": \"blur\",                  // required, default: 'blur', avaliables Triggers  'blur', 'change'\n      \"isDisabled\": function(obj) {       // callback\n        if (obj.id === 1) {\n          return true;\n        } else {\n          return false;\n        }\n      },\n      \"onChange\": function(row) {         // callback when exec trigger\n       console.log('Row actual: '+row);\n      }\n    }\n  }],\n ...\n}\n```\n\n## How render input with mask 'Number' in collumn\nDefines a property type = 'input' and mask in collumn.action\n\n```\n$scope.config =\n{\n  ...\n  \"collumns\": [{\n    \"title\": \"Input\",\n    \"index\": \"nickName\",\n    \"action\": {\n      \"type\": \"input\",\n      \"trigger\": \"blur\",                  // required, default: 'blur', avaliables Triggers  'blur', 'change'\n      \"mask\": {\n        \"use\": \"number\",                  // avaliables uses: 'number', 'money', 'br-phone','br-cep','br-cpf','br-cpfcnpj'\n        \"decimalPlace\": 2,                // number of decimals\n        \"maxlength\": 11,\n        \"negative\": true                  // optional, default false\n      },\n      \"isDisabled\": function(obj) {       // callback\n        if (obj.id === 1) {\n          return true;\n        } else {\n          return false;\n        }\n      },\n      \"onChange\": function(row) {         // callback when exec trigger\n       console.log(\"Row actual: \"+row);\n      }\n    }\n  }],\n ...\n}\n```\n\n## Mask Money\n\n```\n$scope.config =\n{\n  ...\n  mask: {\n    use: 'money',\n    decimalPlace: 2,          // number of decimals\n    maxlength: 11\n  },\n  ...\n}\n```\n\n## Mask br-phone\n\n```\n$scope.config =\n{\n  ...\n  mask: {\n    use: 'br-phone'\n  },\n  ...\n}\n```\n\n## Mask br-cep\n\n```\n$scope.config =\n{\n  ...\n  mask: {\n    use: 'br-cep'\n  },\n  ...\n}\n```\n\n## Mask br-cpf\nCallback has two parameters, row and isValid, isValid is result validation cpf\n\n```\n$scope.config =\n{\n  ...\n  mask: {\n    use: 'br-cpf'\n  },\n  onChange: function(row, isValid) {      //callback\n    if(isValid){\n      console.log('execute action here');\n    }else{\n     console.log('CPF inválido');\n    }\n  }\n  ...\n}\n```\n\n## Mask br-cnpj\nCallback has two parameters, row and isValid, isValid is result validation cnpj\n\n```\n$scope.config =\n{\n  ...\n  mask: {\n    use: 'br-cnpj'\n  },\n  onChange: function(row, isValid) {      //callback\n    if(isValid){\n      console.log('execute action here');\n    }else{\n     console.log('CNPJ inválido');\n    }\n  }\n  ...\n}\n```\n\n## Mask br-cpfcnpj\nCallback has two parameters, row and isValid, isValid is result validation\n\n```\n$scope.config =\n{\n  ...\n  mask: {\n    use: 'br-cpfcnpj'\n  },\n  onChange: function(row, isValid) {      //callback\n    if(isValid){\n      console.log('execute action here');\n    }else{\n     console.log('Campo inválido');\n    }\n  }\n  ...\n}\n```\n\n## How render comboBox in collumn\nDefines a property type = 'combo' and mask in collumn.action\n\n```\n$scope.config =\n{\n  ...\n  collumns: [{\n    title: \"Combo\",\n    index: 'status',\n    action: {\n      type: 'combo',\n      class: '',                                     // optional\n      style: {                                    // optional\n       width: '100px'\n      },\n      avaliablesChoises: [\"ACTIVE\",\"INACTIVE\"], // required, Collection for populate combo, not use array of object for this use \"chosen\n      labelChoose: 'Select...',                      // optional, if defined, create a empty option\n      isDisabled: function(obj) {                    // optional, callback for disable the combo\n        if (obj.id === 1) {\n          return true;\n        } else {\n          return false;\n        }\n      },\n      onChange: function(obj) {\n        console.log('execute action here');\n      }\n    }\n  }],\n ...\n}\n```\n\n## How render chosen in collumn\nDefines a property type = 'chosen' and mask in collumn.action\n\n```\n$scope.config =\n{\n  ...\n  collumns: [{\n    title: 'Chosen',\n    index: 'tag',\n    action: {\n      type: 'chosen',\n      placeholder: 'Selecione um tag...',\n      class: '',                            // optional\n      style: {                           // optional\n       width: '100px'\n      },\n      theme: 'select2',\n      searchIn: ['id','nome'],              // property the object for search\n      allowClear: false,                    // [x] button clear - default is false\n      selectedRender: function(item){       // optional\n        return item.nome;\n      },\n      itemRender: function(item){\n        var ret =  '\u003csmall\u003e';\n        ret     += 'id:'+item.id+'\u003cbr/\u003e';\n        ret     += 'nome: '+item.nome+'\u003cbr/\u003e';\n        ret     += '\u003c/small\u003e';\n        return ret;                   // is possible return html content\n      },\n      isDisabled: function(obj){\n        if (obj.id == 1){\n          return true;\n        }\n        return false;\n      },\n      avaliablesChoises: [{\n        id: 1,\n        nome: 'tag 1'\n      },{\n        id: 2,\n        nome: 'tag 2'\n      }],\n      onChange: function(obj, newValue) {\n        console.log('execute action here: ' + obj.id);\n      }\n   }],\n  ...\n}\n```\n\n## How render multiChosen in collumn\nDefines a property type = 'multiChosen' and mask in collumn.action\n\n```\n$scope.config =\n{\n  ...\n  collumns: [{\n    title: 'Multi-Chosen',\n    index: 'nome',\n    action: {\n      type: 'multiChosen',\n      placeholder: 'Selecione um tag...',\n      theme: 'select2',\n      searchIn: ['id','nome'],\n      selectedsRender: function(item){\n        return item.nome;\n      },\n      itemRender: function(item){\n        return item.nome;\n      },\n      onRemove : function(row, item, model){\n        console.log(item);\n      },\n      isDisabled: function(obj){\n        if (obj.id == 1){\n          return true;\n        }\n        return false;\n      },\n      avaliablesChoises: [{\n        id: 1,\n        nome: 'tag 1'\n      },{\n        id: 2,\n        nome: 'tag 2'\n      },{\n        id: 3,\n        nome: 'tag 3'\n      },{\n        id: 4,\n        nome: 'tag 4'\n      },{\n        id: 5,\n        nome: 'tag 5'\n      },{\n        id: 6,\n        nome: 'tag 6'\n      }],\n      onSelect: function(row, item, model) {\n        console.log('execute action here: ' + item.id);\n      }\n  }],\n  ...\n}\n```\n\n## How render buttons\nThe buttons are always rendered in the last column\u003cbr/\u003e\nDefines a property buttons in config\n\n```\n$scope.config =\n{\n  ...\n  collumns: [{...}],\n  buttons: [\n    {\n      text: 'Excluir',                              //optional\n      classButton: 'btn btn-xs btn-primary',        // class ex: \u003cbutton class=\"btn btn-xs btn-primary\"\u003e\u003c/button\u003e\n      onClick: function(obj) {                      // callback when clicked\n        console.log('Execute action here obj clicked:' + obj.id);\n      }\n    },\n    {\n      text: function(row){                          //callback for condition text\n        return row.action.name;\n      }\n      ...\n    },\n    {\n      tooltip: function(row){                          //callback for condition text tooltip\n        return row.action.name;\n      }\n      ...\n    },\n    {\n      tooltip: 'Tooltip',                           //optional\n      classIcon: 'glyphicon glyphicon-remove',      // class for icon in button\n      classButton: 'btn btn-xs btn-danger',         // class ex: \u003cbutton class=\"btn btn-xs btn-danger\"\u003e\u003c/button\u003e\n      isVisible: function(obj) {                    // callback for handle when the button will be rendered according a boolean expression\n        if (obj.id == 1) {\n          return false;\n        } else {\n          return true;\n        }\n      },\n      isDisabled: function(obj) {                    // callback for handle when the button will be disabled according a boolean expression\n        if (obj.id == 1) {\n          return false;\n        } else {\n          return true;\n        }\n      },\n    }\n  ]\n  ...\n}\n```\n\n## Render popover for Row\nDefines a property popoverRow, trigger is hover in row\n\n```\n$scope.config =\n{\n  ...\n  popoverRow: {                                       // optional\n    titleRender: function (row){                      // optional, callback(currentRow) for render title in popover\n      return row.name+' '+row.lastName;\n    },\n    templateUrl: 'template-popover.html',             // required type: String \"popover-template.html\"\n    ngModel: 'popover',                               // required type: String (that presents the model in popover template)\n    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\n      return row;\n    }\n  },\n  ...\n}\n```\n\ntemplate-popover.html\n\n```\n\u003cdiv\u003e\n  \u003cp\u003eNick Name: `{{this.popover.nickName}}\u003c/p\u003e\n  \u003cp\u003eCity: `{{this.popover.city.name}}`\u003c/p\u003e\n\u003c/div\u003e\n```\n\n## How force refresh datagrid\nCall broadcast\n\n```\n$scope.$broadcast(\"rsDatagrid:refresh\");\n```\n\n## How use pagination in component\nThis version only implements pagination in backend\u003cbr/\u003e\nDefines property pagination in config\n\n```\n$scope.config =\n{\n  ...\n  pagination: {                                       // optional\n    labelSize: 'Registros por página: ',              // optional, default \"Page size: \"\"\n    defaultSize: 10,                                  // optional, default first item in avaliableSizes\n    avaliableSizes: [10, 25, 50, 100, 500],           // optional, default [10,25,50,100]\n    positionBottom: true                              // optional, default is true, position over top\n  },\n  ...\n}\n```\n\nWhen using paging, you must implement a lazyData function within the configuration, this function is responsive to update or components automatically, page sorts and other\n\n```\n$scope.config =\n{\n  ...\n  lazyData: function(page, size, sort, search) {\n    var params = {\n      page: page,\n      size: size,\n      sort: sort,\n      search: search\n      };\n      return $http({\n        url: \"http://localhost:8080/acoes\",\n        method: 'GET',\n        params: params,\n      }).then(function(result) {\n        return result.data;\n      });\n  },\n  ...\n};\n```\n\n\u003cb\u003eThen JSON RESPONSE for pagination in back-end, this example the implementation in spring data.\u003c/b\u003e\n\n```\n{\n  \"content\": [{\n    ...\n    ...\n  }],\n  \"totalElements\": 10,\n  \"last\": false,\n  \"totalPages\": 1,\n  \"first\": true,\n  \"sort\": [{\n    \"direction\": \"ASC\",\n    \"property\": \"id\"\n  }],\n  \"numberOfElements\": 10,\n  \"size\": 10,\n  \"number\": 0\n}\n```\n\n## How to set the current page\nUse the auxiliary method \"_setCurrentPage\" specifying the value\n\n```\n$scope.config._setCurrentPage(yourValue)\n```\n\n### License\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucrod1%2Fangular-rs-datagrid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucrod1%2Fangular-rs-datagrid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucrod1%2Fangular-rs-datagrid/lists"}