{"id":16621168,"url":"https://github.com/malexion/aurelia-table","last_synced_at":"2025-07-19T18:06:40.463Z","repository":{"id":57186943,"uuid":"68056446","full_name":"Malexion/aurelia-table","owner":"Malexion","description":"Bare bones bootstrap table/panel setup created as an aurelia element.","archived":false,"fork":false,"pushed_at":"2018-01-05T02:07:03.000Z","size":142,"stargazers_count":12,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-02T08:10:48.459Z","etag":null,"topics":["aurelia","aurelia-element","aurelia-plugins","aurelia-table","bootstrap","sort-direction"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Malexion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-12T23:29:36.000Z","updated_at":"2020-03-19T05:09:12.000Z","dependencies_parsed_at":"2022-08-28T11:11:21.017Z","dependency_job_id":null,"html_url":"https://github.com/Malexion/aurelia-table","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Malexion/aurelia-table","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Malexion%2Faurelia-table","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Malexion%2Faurelia-table/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Malexion%2Faurelia-table/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Malexion%2Faurelia-table/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Malexion","download_url":"https://codeload.github.com/Malexion/aurelia-table/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Malexion%2Faurelia-table/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265982641,"owners_count":23859571,"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","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":["aurelia","aurelia-element","aurelia-plugins","aurelia-table","bootstrap","sort-direction"],"created_at":"2024-10-12T02:46:27.523Z","updated_at":"2025-07-19T18:06:40.439Z","avatar_url":"https://github.com/Malexion.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# aurelia-table\n\n## News\n\nLatest:\n- Unhooked column width(the style component) from the column object(you still set width with column.size).\n   - This allows the same set of columns to be shared with multiple tables, previously they would get get column width issues since they would both attempt to recalculate their width to correct the other.\n   - Note changing sort, header, hidden, etc will affect all tables with that column set.\n- Added slightly easier access to common events, see event delegations below.\n- Ability to override scrollbar width used in column width calculations, see bindables below.\n- Ability to set auto scroll page down ratio, usually 0 to 1 indicating when the auto scroll page down will occur default is 90% (0.9) of the way down the scroll, see bindables below.\n\nLast Time:\n- Various column width/resize fixes\n  - Note: Still doesn't properly handle fixed widths that go beyond the body width, need a means of dealing with that yet.\n- Row View Value converter was discontinued and the row filtering just runs off of the two computed properties for now.\n  - `filtered` All rows filtered down.\n  - `viewable` Filtered rows plus page limitations.\n- Beginnings of column specific filtering has been built in, only simple text evaluate is included for now with plans for:\n  - Date (Equals/Greater Than/Less Than/Between) - I'd have to put together a decent datepicker for this using Moment.js probably\n  - Number (Equals/Greater Than/Less Than/Between)\n  - Checklist (Strings/Numbers/Dates)\n- Column filter mode for Evaluate has access to:\n  - `x` / `value` current row value.\n  - `i` / `rowidx` current row index.\n  - `row` current row.\n  - `column` current column.\n\n![Alt text](https://i.imgur.com/dWt0hWi.png)\n\n## About\n\nSemi-Bare bones bootstrap table/panel setup created as an aurelia element with fixed header/summary options, sortable columns/multisort with shift, resizable columns, title as the panel-heading and replaceable parts for header/row renders and more. \n\nNOTE: check-box, search-box, progress-bar, scale-bar, range elements, etc are not included. Reserved names are a custom element 'aurelia-table', 'aurelia-table-filter', 'aurelia-table-eval'\n\nGif including the in dev column-menu and other glitchy things like the progress bars.\n(Live example pending IRL complications)\n![Alt text](https://i.imgur.com/hkjqioT.gif \"Grid Animation\")\n\nFull suite of controls/components is in the works for semantic-ui including a semantic-ui specific variation of the table.\n\n## Installation\n\nInstall package with NPM and add it to your development dependencies:\n\n`npm install --save aurelia-table`\n\n```javascript\nexport async function configure(aurelia) {\n    aurelia.use\n        .standardConfiguration()\n        .developmentLogging()\n        .plugin(PLATFORM.moduleName('aurelia-table')); \n\n    await aurelia.start();\n    await aurelia.setRoot(PLATFORM.moduleName('app'));\n}\n```\n\n### Webpack\n\nIf you have webpack then currently you'll probably have to add the `ModuleDependenciesPlugin` to your webpack.config.js\n```javascript\nconst { AureliaPlugin, ModuleDependenciesPlugin } = require('aurelia-webpack-plugin');\n\n....\n\nplugins: [\n   ....\n   new ModuleDependenciesPlugin({\n      \"aurelia-table\": [ './aurelia-table-filter', './aurelia-table' ]\n   }),\n   ....\n]\n```\n\n## Dependencies\n\n- Bootstrap (css)\n- Font-Awesome Icons 4.6.3 (sort icons)\n- iterate-js a (~25kb) library of my own making that assists with the column resizing/row templating/sorting and will help with searching/filtering and more in the future.\n\n## Usage\n\n### Minimum Setup View\n```html\n\u003ctemplate\u003e\n    \u003cdiv class=\"row\"\u003e\n        \u003cdiv class=\"col-md-12\"\u003e\n            \u003caurelia-table header.bind=\"header\" columns.bind=\"columns\" rows.bind=\"rows\"\u003e\u003c/aurelia-table\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n\u003c/template\u003e\n```\n\n### Minimum Setup View Model\n```javascript\nexport class TablePage {\n\n    constructor() {\n         this.header = 'Basic Grid';\n         this.columns = [\n            { field: 'value', header: 'Value' }\n         ];\n         // generate 1000 rows\n         // NOTE that infinite scroll is turned on by default and loads in blocks of 50 rows at a time\n         this.rows = __.map(1000, x =\u003e ({ value: __.gen.number(1000000) })); \n    }\n\n}\n```\n\n## Bindables\n```javascript\n@bindable() header = '';\n@bindable() height = 300;\n@bindable() loading = false;\n@bindable() tableClasses = 'table-hover table-condensed';\n@bindable() showSummary = true;\n@bindable() showColHeaders = true;\n@bindable() showFixedHeaders = true;\n@bindable() showRows = true;\n@bindable() autoScrollRatio = 0.9; // New\n@bindable() scrollWidth = null; // New\n@bindable({ defaultBindingMode: bindingMode.twoWay }) colfilters = null;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) filter = null;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) sort = null;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) map = null;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) startPage = 0;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) endPage = 1;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) pageSize = 50;\n@bindable({ defaultBindingMode: bindingMode.twoWay }) pageMode = 'scroll'; // paginate, set to null to disable infinite scroll/pagination\n@bindable({ defaultBindingMode: bindingMode.twoWay }) summary = [];\n@bindable({ defaultBindingMode: bindingMode.twoWay }) headers = [];\n@bindable({ defaultBindingMode: bindingMode.twoWay }) rows = [];\n@bindable({ defaultBindingMode: bindingMode.twoWay }) columns = [];\n```\n\n## Event Delegations\n```javascript\n@bindable() cleanEvent = () =\u003e { };\n@bindable() resizeStartEvent = () =\u003e { };\n@bindable() resizeDragEvent = () =\u003e { };\n@bindable() resizeEndEvent = () =\u003e { };\n@bindable() columnResizeEvent = () =\u003e { };\n@bindable() columnFilterEvent = () =\u003e { };\n@bindable() updateEvent = () =\u003e { };\n@bindable() scrollEvent = () =\u003e { };\n@bindable() sortEvent = () =\u003e { };\n@bindable() sortClickEvent = () =\u003e { };\n@bindable() rowClickEvent = () =\u003e { };\n```\n\n### How to Use\n```html\n\u003caurelia-table row-click-event.call=\"someHandler1(after, data)\"\u003e\u003c/aurelia-table\u003e\n\u003caurelia-table row-click-event.bind=\"someHandler2\"\u003e\u003c/aurelia-table\u003e\n```\n```javascript\nsomeHandler1(after, data) { // if you don't want to cancel\n   if(after) {\n      console.log(data.row);\n   }\n}\nsomeHandler2(event) { // full functionality \n   var row = event.data.row;\n   //event.isCancelled = true; // to prevent most default event executions\n   if(event.before) {\n      // before default execution\n   }\n   if(event.after) {\n      // after default execution\n   }\n}\n```\n\n## Row View\nRows are rendered via computed properties.\n```javascript\n@computedFrom('rows', 'columns', 'colfilters', 'filter', 'sort', 'map', 'pageMode')\nget filtered() {\n   var temp = this.rows.slice();\n   if(this.pageMode)\n      temp = __.filter(temp, x =\u003e !x.hidden);\n   if(__.is.set(this.colfilters)) {\n      var flag;\n      temp = __.filter(temp, (row, rowidx) =\u003e {\n            flag = true;\n            __.all(this.colfilters, (column, i, e) =\u003e {\n               if(!column.condition(row[column.field], row, column, rowidx)) {\n                  flag = false;\n                  e.stop = true;\n               }\n            });\n            return flag;\n      });\n   }\n   if(__.is.set(this.filter))\n      temp = __.filter(temp, this.filter);\n   if(__.is.set(this.sort))\n      temp = __.sort(temp, this.sort);\n   if(__.is.set(this.map))\n      temp = __.map(temp, this.map);\n   return temp;\n}\n\n@computedFrom('filtered', 'startPage', 'pageSize', 'endpage', 'pageMode')\nget viewable() {\n   var array = this.filtered;\n   if(__.is.array(this.rows) \u0026\u0026 this.pageMode \u0026\u0026 __.is.set(this.startPage) \u0026\u0026 __.is.set(this.endPage) \u0026\u0026 __.is.set(this.pageSize))\n      return array.slice(this.startPage * this.pageSize, this.endPage * this.pageSize);\n   return array;\n}\n```\n\n## Current viewable/filtered rows\nYou can bind to your grids current viewable rows which includes pagination/scroll limits and filter/sort/map or you can bind to filtered rows which only use the filter/sort/map functions.\n```html\n\u003caurelia-table view-model.ref=\"myTable\"\u003e\u003c/aurelia-table\u003e\n\n\u003cdiv repeat.for=\"row of myTable.viewable\"\u003e\u003c/div\u003e\n\u003cdiv repeat.for=\"row of myTable.filtered\"\u003e\u003c/div\u003e\n```\n\n## Colfilters/Filter/Sort/Map\nThese four bindables can shape your rows how you like. \n- `colfilters` is primarily handled by the column definitions\n  - `filter` string that sets the type of filter for the column only option at the moment is `'eval'`\n  - `condition` function set by the internal filter component and must return true/false `(value, row, column, rowidx) =\u003e true`\n- `filter` expects a function passed (value, key) of the row item, key being the array index and must return true if it is to be included, null means the filter is ignored.\n- `sort` is primarily handled by the column definitions, all are optional `{...sortable: true, dir: 'desc', defaultDir: 'asc', key: x =\u003e x.value, sortOrder: 2 }`\n  - `sortable` Enables sorting for that column\n  - `dir` Current direction of the sort on the column, defaults to `asc` if not set, responds to being changed and will update the grid\n  - `defaultDir` Default direction the column will be sorted on when first clicked with no current sort, defaults to `asc` if not set\n  - `key` Path to the row value sorted upon, defaults to `row =\u003e row[column.field]`, allows you to modify what you are sorting upon for example if you wanted to do numeric sort on a string value `x =\u003e parseFloat(x.value)`\n  - `sortOrder` Numeric order of sorting used with multi sort lower the number the higher the priority, usually starts with 1, so two columns with two sortOrder props defined will sort in that order\n- `map` allows you to transform the array before use for example `row =\u003e ({ id: x.someId, label: x.name })`\n\n## Row Property Keywords\nAll are optional\n- `.class`      `[string]`    Set classes on each of the body rows.\n- `.style`      `[string]`    Set styles on each of the body rows.\n- `.active`     `[bool]`      Adds active styling over the row, bootstrap sets the styles.\n- `.hidden`     `[bool]`      Sets hide/show for the row undefined or false results in being shown.\n\n## Column Property Keywords\nI highly recommend setting field though it isn't required\n- `.field`        `[string]`    For your own use to help you locate the property for that column.\n- `.header`       `[string]`    For your own use to help display the column header for that column.\n- `.size`         `[string]`    Sets the column width, must be `px` or `%`. Default is set to `100%`.\n- `.class`        `[string]`    Set classes on each of the columns.\n- `.style`        `[string]`    Set styles on each of the columns, avoid setting width here set in `column.size` instead.\n- `.hidden`       `[bool]`      Sets hide/show for the column undefined or false results in being shown.\n- `.render`       `[string]`    For your own use to help display the column renders if you have differing ones, default value is null.\n- `.fitler`       `[string]`    Sets the filter type for the column default is null.\n- `.condition`    `[function]`  Filter evaluation for the column `(value, row, column, rowidx) =\u003e true` defaults to null.\n- `.sortable`     `[bool]`      Enables sorting interaction on column.\n- `.resizable`    `[bool]`      Enables the manual resizing of the column.\n- `.configurable` `[bool]`      Enables the column-menu element configuration of an column.\n- `.key`          `[function]`  Path to sortable variable for that column default is `row =\u003e row[column.field]`.\n- `.dir`          `[string]`    Sort direction for column. Null turns off sort on the column.\n- `.defaultDir`   `[string]`    Default sort direction set when the user first clicks on a column.\n- `.sortOrder`    `[number]`    Numeric order used for multi sort, sorts in ascending numeric order so 1, 2, 3\n\n## Replaceable Parts Include\n- Header Areas\n  - `header`\n  - `right-controls` Right Aligned controls placed on the top panel heading.\n  - `left-controls` Left Aligned controls placed on the top panel heading following the header.\n```html\n\u003cdiv class=\"at-title panel-heading table-base-header\" show.bind=\"header != ''\"\u003e\n   \u003ctemplate replaceable part=\"header\"\u003e\n         \u003ch3 class=\"panel-header\"\u003e${header}\u003c/h3\u003e\n   \u003c/template\u003e\n   \u003ctemplate replaceable part=\"left-controls\"\u003e\u003c/template\u003e\n   \u003cdiv class=\"pull-right\"\u003e\n         \u003ctemplate replaceable part=\"right-controls\"\u003e\u003c/template\u003e\n   \u003c/div\u003e\n\u003c/div\u003e\n```\n\n- Render Blocks (replace entire render blocks)\n   - `column-render` Column headers, comes with sort icon look at the template before you replace this piece\n   - `row-render` Row body, look at the template before you replace this piece\n\n- Simple Replaceables\n   - `column-header` Basic area for the column header display\n```html\n\u003cdiv style=\"display: inline-block;\"\u003e\n   \u003ctemplate replaceable part=\"column-header\"\u003e\n      \u003cspan\u003e${column.header}\u003c/span\u003e\n   \u003c/template\u003e\n\u003c/div\u003e\n```\n  - `static-header` Basic area for static header renders\n```html\n\u003ctemplate replaceable part=\"static-header\"\u003e\u003c/template\u003e\n```\n  - `cell` Basic body area renders\n```html\n\u003ctemplate replaceable part=\"cell\"\u003e\n   \u003cspan\u003e${row[column.field]}\u003c/span\u003e\n\u003c/template\u003e\n```\n  - `static-summary` Basic summary area renders\n```html\n\u003ctemplate replaceable part=\"static-summary\"\u003e\u003c/template\u003e\n```\n\n## Helpful ViewModel Functions\n\n- `table.columnRefresh()` Debounced method to signal force columns to update.\n- `table.rowRefresh()` Debounced method to signal force rows to update.\n- `table.sortRows()` Debounced method to force a row sort based on current column state.\n- `table.resizeColumns()` Debounced method to force a recalculation of column widths.\n- `table.pageDown()` Decrements the end page. In `'paginate'` mode it decreases the start page too.\n- `table.pageUp()` Increments the end page, used by auto scroll when you hit the bottom. In `'paginate'` mode it increases the start page too.\n- `table.pageReset()` Resets the start page to 0 and the end page to 1 and scrolls the body of the table to the top of the page.\n\n## Future Plans\n- column specific filtering - more types\n- table menu element for full user customization?\n- trim down css needed from bootstrap, icons needed from font-awesome icons and minimize iterate-js to a small lib of the required functions\n- included elements (maybe) (search-box, progress-bar, scale-bar, range, date-time, check-box)\n- ui virtualization (if it ever works with stacked repeat.for attributes)\n\n## Advanced Setup (what the top picture uses)\n\n### Setup View\n```html\n\u003ctemplate\u003e\n    \u003cdiv class=\"row\"\u003e\n        \u003cdiv class=\"col-md-12\"\u003e\n            \u003caurelia-table view-model.ref=\"myTable\"\u003e\n                \u003ctemplate replace-part=\"header\"\u003e\n                    \u003ch3 class=\"panel-header\"\u003e${header} (${rows.length})\u003c/h3\u003e\n                \u003c/template\u003e\n                \u003ctemplate replace-part=\"right-controls\"\u003e\n                    \u003cdiv style=\"width: 400px; display: inline-block;\"\u003e\n                        \u003csearch-box textchange.bind=\"handleSearch\" placeholder=\"Search me...\"\u003e\u003c/search-box\u003e\n                    \u003c/div\u003e\n                    \u003cdiv style=\"display: inline-block; vertical-align: top; margin: 2px;\"\u003e\n                        \u003cdiv class=\"dropdown\" openlisten.two-way=\"column_menu\"\u003e\n                            \u003cspan class=\"click\" toggle.two-way=\"column_menu\"\u003e\n                                \u003ci class=\"fa fa-2x fa-gear\"\u003e\u003c/i\u003e\n                            \u003c/span\u003e\n                            \u003cdiv class=\"dropdown-menu dropdown-menu-right\" style=\"padding: 0; width: 300px;\"\u003e\n                                \u003ccolumn-menu table.bind=\"myTable\"\u003e\u003c/column-menu\u003e\n                            \u003c/div\u003e\n                        \u003c/div\u003e\n                    \u003c/div\u003e\n                \u003c/template\u003e\n                \u003ctemplate replace-part=\"column-header\"\u003e\n                    ${column.header}\n                \u003c/template\u003e\n                \u003ctemplate replace-part=\"static-header\"\u003e\n                    \u003cdiv if.bind=\"column.render == 'range'\"\u003eStatic Header Rows\u003c/div\u003e\n                \u003c/template\u003e\n                \u003ctemplate replace-part=\"cell\"\u003e\n                    \u003ccheck-box if.bind=\"column.render == 'checkbox'\" check.bind=\"row[column.field]\"\u003e\u003c/check-box\u003e\n                    \u003cprogress-bar if.bind=\"column.render == 'bar'\" progress.bind=\"row[column.field]\" max.bind=\"myTable.barMax\"\u003e\n                        \u003ctemplate replace-part=\"text\"\u003e${row[column.field] | numeral:column.format}\u003c/template\u003e\n                    \u003c/progress-bar\u003e\n                    \u003crange if.bind=\"column.render == 'range'\" min.bind=\"row[column.field].min\" max.bind=\"row[column.field].max\" update.bind=\"row[column.field].update\"\u003e\u003c/range\u003e\n                    \u003cspan if.bind=\"!column.render\"\u003e${row[column.field]}\u003c/span\u003e\n                \u003c/template\u003e\n                \u003ctemplate replace-part=\"static-summary\"\u003e\n                    \u003cscale-bar if.bind=\"column.render == 'bar'\" format.bind=\"column.format\" watch.bind=\"rows\" path.bind=\"column.field\" max.bind=\"myTable.barMax\" force-min=\"0\"\u003e\u003c/scale-bar\u003e\n                    \u003cdiv if.bind=\"column.render == 'range'\"\u003eStatic Summary Rows\u003c/div\u003e\n                    \u003cdiv if.bind=\"!column.render\"\u003eTotal: ${filtered | total:'value1' \u0026 signal:'row-totals'}\u003c/div\u003e\n                \u003c/template\u003e\n            \u003c/aurelia-table\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n\u003c/template\u003e\n```\n\n### Setup View Model\n```javascript\nimport { inject } from 'aurelia-framework';\nimport { BindingSignaler } from 'aurelia-templating-resources';\n\nimport __ from 'iterate-js';\n\n@inject(BindingSignaler)\nexport class TablePage {\n\n    constructor(signaler) {\n        var self = this;\n        self.signaler = signaler;\n\n        self.searchtext = '';\n\n        // Debounced to prevent input spam\n        self.refresh = __.debounce(() =\u003e {\n            if(self.myTable) {\n                self.myTable.filter = row =\u003e (\n                    row.value1.toString().contains(self.searchtext, true) ||\n                    row.value2.toString().contains(self.searchtext, true)\n                );\n            }\n        }, 50);\n\n        self.handleSearch = (event) =\u003e {\n            self.searchtext = event.value;\n            self.refresh();\n        };\n    }\n\n    attached() {\n        var self = this,\n            updateSummary = () =\u003e {\n                self.signaler.signal('row-totals');\n            };\n\n        // Generate 1000 rows\n        var rows = __.map(1000, () =\u003e {\n            var x = { value1: __.gen.number(50), value2: __.gen.number(2000000), value3: { max: __.gen.number(100, 51), min: 0 }, value4: {} };\n            // fixing range minimum value to value1\n            x.value3.min = x.value1;\n            x.value3.update = (min, max, limitMin, limitMax) =\u003e {\n                // fixing range minimum value to value1\n                x.value1 = min;\n                updateSummary();\n            };\n            return x;\n        });\n\n        // Table setup all of these can be bound in the html\n        self.myTable.update({\n            header: 'My Grid',\n            columns: [\n                { field: 'active', header: 'Select', size: '100px', render: 'checkbox', sortable: true, key: x =\u003e Boolean(x.active).toString() },\n                { field: 'value1', header: 'Column 1', size: '100px', resizable: true, sortable: true, dir: 'asc', key: x =\u003e x.value1, sortOrder: 2 },\n                { field: 'value2', header: 'Progress Bar', render: 'bar', format: '$0[.]00a', sortable: true, dir: 'desc', defaultDir: 'desc', sortOrder: 1 },\n                { field: 'value3', header: 'Range Slider', render: 'range' }\n            ],\n            rows: rows,\n            headers: [{}],\n            summary: [{}]\n        });\n\n        // Size responds to change\n        //setTimeout(() =\u003e { self.myTable.columns[2].size = '300px'; }, 1000);\n    }\n\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmalexion%2Faurelia-table","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmalexion%2Faurelia-table","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmalexion%2Faurelia-table/lists"}