├── .browserslistrc ├── .circleci └── config.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── deploy.sh ├── docs ├── .vuepress │ ├── components │ │ ├── BasicFiltering.vue │ │ ├── CustomFiltering.vue │ │ ├── InputSpinner.vue │ │ ├── Pagination.vue │ │ ├── Selection.vue │ │ ├── SelectionApi.vue │ │ ├── Sorting.vue │ │ ├── SortingFA.vue │ │ ├── TheBasics.vue │ │ └── data.json │ └── config.js ├── README.md ├── filtering │ └── README.md ├── pagination │ └── README.md ├── selection │ └── README.md ├── sorting │ └── README.md └── the-basics │ └── README.md ├── package.json ├── postcss.config.js ├── src ├── SmartPagination.vue ├── VTable.vue ├── VTh.vue ├── VTr.vue ├── main.js ├── store.js └── table-utils.js ├── tests └── unit │ ├── .eslintrc.js │ └── table-utils.spec.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | jobs: 3 | build: 4 | docker: 5 | - image: circleci/node 6 | steps: 7 | - checkout 8 | - run: yarn install 9 | - run: yarn test:unit 10 | - store_test_results: 11 | path: tests/results 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,ts,tsx,vue}] 2 | indent_style = space 3 | indent_size = 2 4 | trim_trailing_whitespace = true 5 | insert_final_newline = true 6 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | '@vue/standard' 9 | ], 10 | rules: { 11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 13 | }, 14 | parserOptions: { 15 | parser: 'babel-eslint' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | dist 4 | 5 | tests/results 6 | 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | 11 | # Log files 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw* 24 | 25 | docs/.vuepress/dist 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Hector Romero 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | :fire::fire::fire: Vue 3 support is comming :fire::fire::fire: 2 | 3 | Vue 3 support is already in beta in the `next` branch, the next version also supports Vue 2, you can take a look in the [new documentation site](https://vue-smart-table.netlify.app/). 4 | 5 | # VueJs Smart Table 6 | 7 | Vue Smart Table was created out of the need for a simple highly customizable data table plugin 8 | that could take advantage of Vue's slots. It has no dependencies but Vue and because it 9 | renders as a standard HTML table it is compatible with CSS Frameworks such as Bootstrap and Foundation. 10 | 11 | Out of the box you will get filtering, column sorting, client side pagination and row selection. 12 | 13 | ## Full Documentation 14 | Please read the [documentation](https://tochoromero.github.io/vuejs-smart-table/) to learn how to use it. 15 | 16 | ## Installation 17 | To install simply run 18 | ``` 19 | npm add vuejs-smart-table 20 | ``` 21 | or 22 | ``` 23 | yarn add vuejs-smart-table 24 | ``` 25 | 26 | Then in your `main.js` 27 | ```js 28 | import SmartTable from 'vuejs-smart-table' 29 | 30 | Vue.use(SmartTable) 31 | ``` 32 | This will globally register four Components: `v-table`, `v-th`, `v-tr` and `smart-pagination` 33 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | set -e 4 | 5 | npm run docs:build 6 | cd docs/.vuepress/dist 7 | 8 | git init 9 | git add -A 10 | git commit -m 'deploy' 11 | 12 | git push -f git@github.com:tochoromero/vuejs-smart-table.git master:gh-pages 13 | 14 | cd - 15 | -------------------------------------------------------------------------------- /docs/.vuepress/components/BasicFiltering.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 45 | 46 | 49 | -------------------------------------------------------------------------------- /docs/.vuepress/components/CustomFiltering.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 71 | 72 | 76 | -------------------------------------------------------------------------------- /docs/.vuepress/components/InputSpinner.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 167 | 168 | 174 | -------------------------------------------------------------------------------- /docs/.vuepress/components/Pagination.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 49 | 50 | 53 | -------------------------------------------------------------------------------- /docs/.vuepress/components/Selection.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 57 | 58 | 61 | -------------------------------------------------------------------------------- /docs/.vuepress/components/SelectionApi.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 80 | 81 | 84 | -------------------------------------------------------------------------------- /docs/.vuepress/components/Sorting.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 50 | 51 | 54 | -------------------------------------------------------------------------------- /docs/.vuepress/components/SortingFA.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 38 | 39 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /docs/.vuepress/components/TheBasics.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 34 | -------------------------------------------------------------------------------- /docs/.vuepress/components/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "_id": "57ef9cd8e22df324d77c4f07", 4 | "index": 0, 5 | "guid": "9bc8e89d-658c-47cf-acc3-b0e225ddb549", 6 | "isActive": false, 7 | "balance": "$1,029.59", 8 | "picture": "http://placehold.it/32x32", 9 | "age": 25, 10 | "eyeColor": "green", 11 | "name": "Deana Lindsay", 12 | "gender": "female", 13 | "company": "TERRAGO", 14 | "email": "deanalindsay@terrago.com", 15 | "phone": "+1 (858) 506-2166", 16 | "address": { 17 | "street": "268 Garnet Street", 18 | "city": "Chicopee", 19 | "state": "Pennsylvania" 20 | }, 21 | "registered": "2015-10-30", 22 | "tags": [ 23 | "reprehenderit", 24 | "duis", 25 | "mollit", 26 | "eiusmod", 27 | "incididunt", 28 | "nisi", 29 | "sunt" 30 | ] 31 | }, 32 | { 33 | "_id": "57ef9cd8392af802937a0974", 34 | "index": 1, 35 | "guid": "1436aae5-4540-474a-8bad-4ca6b9c903ac", 36 | "isActive": true, 37 | "balance": "$1,302.22", 38 | "picture": "http://placehold.it/32x32", 39 | "age": 39, 40 | "eyeColor": "blue", 41 | "name": "Wyatt Kline", 42 | "gender": "male", 43 | "company": "MEDMEX", 44 | "email": "wyattkline@medmex.com", 45 | "phone": "+1 (827) 579-2502", 46 | "address": { 47 | "street": "234 Irwin Street", 48 | "city": "Irwin", 49 | "state": "Maine" 50 | }, 51 | "registered": "2014-06-17", 52 | "tags": [ 53 | "aute", 54 | "laboris", 55 | "sit", 56 | "voluptate", 57 | "magna", 58 | "voluptate", 59 | "occaecat" 60 | ] 61 | }, 62 | { 63 | "_id": "57ef9cd865c7f5203dc5e126", 64 | "index": 2, 65 | "guid": "2bc5aad6-2172-4041-a949-b31729290f25", 66 | "isActive": true, 67 | "balance": "$3,066.01", 68 | "picture": "http://placehold.it/32x32", 69 | "age": 29, 70 | "eyeColor": "green", 71 | "name": "Harmon Huber", 72 | "gender": "male", 73 | "company": "SNIPS", 74 | "email": "harmonhuber@snips.com", 75 | "phone": "+1 (931) 482-3018", 76 | "address": { 77 | "street": "913 Gerritsen Avenue", 78 | "city": "Nash", 79 | "state": "American Samoa" 80 | }, 81 | "registered": "2016-01-25", 82 | "tags": [ 83 | "do", 84 | "voluptate", 85 | "id", 86 | "do", 87 | "occaecat", 88 | "minim", 89 | "tempor" 90 | ] 91 | }, 92 | { 93 | "_id": "57ef9cd8594cc4bc18a121f7", 94 | "index": 3, 95 | "guid": "5d48aae2-9e3c-434e-a835-3abdab56e240", 96 | "isActive": false, 97 | "balance": "$3,574.33", 98 | "picture": "http://placehold.it/32x32", 99 | "age": 29, 100 | "eyeColor": "green", 101 | "name": "Penny Maddox", 102 | "gender": "female", 103 | "company": "BALUBA", 104 | "email": "pennymaddox@baluba.com", 105 | "phone": "+1 (873) 552-2338", 106 | "address": { 107 | "street": "218 Agate Court", 108 | "city": "Sandston", 109 | "state": "Oregon" 110 | }, 111 | "registered": "2016-01-08", 112 | "tags": [ 113 | "anim", 114 | "aliqua", 115 | "consequat", 116 | "tempor", 117 | "excepteur", 118 | "est", 119 | "enim" 120 | ] 121 | }, 122 | { 123 | "_id": "57ef9cd846b7cd74053c10c9", 124 | "index": 4, 125 | "guid": "3c4a0399-68c9-4741-8c77-0e7e0dd9ed00", 126 | "isActive": true, 127 | "balance": "$1,363.39", 128 | "picture": "http://placehold.it/32x32", 129 | "age": 39, 130 | "eyeColor": "brown", 131 | "name": "Morgan Gomez", 132 | "gender": "male", 133 | "company": "AFFLUEX", 134 | "email": "morgangomez@affluex.com", 135 | "phone": "+1 (976) 466-3779", 136 | "address": { 137 | "street": "632 Highland Avenue", 138 | "city": "Tuttle", 139 | "state": "Connecticut" 140 | }, 141 | "registered": "2014-04-10", 142 | "tags": [ 143 | "duis", 144 | "deserunt", 145 | "id", 146 | "nostrud", 147 | "mollit", 148 | "consequat", 149 | "ea" 150 | ] 151 | }, 152 | { 153 | "_id": "57ef9cd8d429bf34a0c2dc36", 154 | "index": 5, 155 | "guid": "d321b26f-f8ce-461e-9673-5b9497aacea7", 156 | "isActive": false, 157 | "balance": "$1,469.54", 158 | "picture": "http://placehold.it/32x32", 159 | "age": 35, 160 | "eyeColor": "green", 161 | "name": "Beck Mckay", 162 | "gender": "male", 163 | "company": "GEOLOGIX", 164 | "email": "beckmckay@geologix.com", 165 | "phone": "+1 (879) 477-3341", 166 | "address": { 167 | "street": "936 Woodpoint Road", 168 | "city": "Wakulla", 169 | "state": "Mississippi" 170 | }, 171 | "registered": "2016-05-06", 172 | "tags": [ 173 | "non", 174 | "cillum", 175 | "culpa", 176 | "irure", 177 | "nulla", 178 | "non", 179 | "occaecat" 180 | ] 181 | }, 182 | { 183 | "_id": "57ef9cd86866468dc1c20447", 184 | "index": 6, 185 | "guid": "c097a185-98ee-4bdd-a6ec-a3e5e40801be", 186 | "isActive": true, 187 | "balance": "$3,125.22", 188 | "picture": "http://placehold.it/32x32", 189 | "age": 39, 190 | "eyeColor": "blue", 191 | "name": "Massey Carlson", 192 | "gender": "male", 193 | "company": "EARTHWAX", 194 | "email": "masseycarlson@earthwax.com", 195 | "phone": "+1 (871) 471-2647", 196 | "address": { 197 | "street": "278 Chapel Street", 198 | "city": "Taycheedah", 199 | "state": "Hawaii" 200 | }, 201 | "registered": "2014-10-22", 202 | "tags": [ 203 | "ullamco", 204 | "fugiat", 205 | "consequat", 206 | "nostrud", 207 | "aliqua", 208 | "consequat", 209 | "fugiat" 210 | ] 211 | }, 212 | { 213 | "_id": "57ef9cd83f55c1d078fc6cfd", 214 | "index": 7, 215 | "guid": "29e53cbb-6353-44a3-a2c8-e7b3176d00af", 216 | "isActive": false, 217 | "balance": "$3,663.46", 218 | "picture": "http://placehold.it/32x32", 219 | "age": 33, 220 | "eyeColor": "blue", 221 | "name": "Hill Hale", 222 | "gender": "male", 223 | "company": "CALCU", 224 | "email": "hillhale@calcu.com", 225 | "phone": "+1 (877) 598-2610", 226 | "address": { 227 | "street": "618 Newport Street", 228 | "city": "Deercroft", 229 | "state": "Colorado" 230 | }, 231 | "registered": "2016-04-18", 232 | "tags": [ 233 | "nostrud", 234 | "duis", 235 | "Lorem", 236 | "ex", 237 | "elit", 238 | "labore", 239 | "in" 240 | ] 241 | }, 242 | { 243 | "_id": "57ef9cd8f8863a277e1c2055", 244 | "index": 8, 245 | "guid": "955a6cd5-b73c-4a6c-9280-76cbc4e232b2", 246 | "isActive": false, 247 | "balance": "$2,451.20", 248 | "picture": "http://placehold.it/32x32", 249 | "age": 26, 250 | "eyeColor": "blue", 251 | "name": "Stokes Hurst", 252 | "gender": "male", 253 | "company": "DATAGEN", 254 | "email": "stokeshurst@datagen.com", 255 | "phone": "+1 (897) 537-2718", 256 | "address": { 257 | "street": "146 Conover Street", 258 | "city": "Dahlen", 259 | "state": "North Dakota" 260 | }, 261 | "registered": "2016-01-30", 262 | "tags": [ 263 | "est", 264 | "eu", 265 | "anim", 266 | "eiusmod", 267 | "exercitation", 268 | "commodo", 269 | "nulla" 270 | ] 271 | }, 272 | { 273 | "_id": "57ef9cd86b62971bb96f7603", 274 | "index": 9, 275 | "guid": "239a3301-1dae-4ef8-ae30-7e92a84c78a2", 276 | "isActive": false, 277 | "balance": "$1,753.67", 278 | "picture": "http://placehold.it/32x32", 279 | "age": 20, 280 | "eyeColor": "green", 281 | "name": "Cain Knapp", 282 | "gender": "male", 283 | "company": "NAMEBOX", 284 | "email": "cainknapp@namebox.com", 285 | "phone": "+1 (873) 435-3377", 286 | "address": { 287 | "street": "460 Bridgewater Street", 288 | "city": "Manchester", 289 | "state": "Michigan" 290 | }, 291 | "registered": "2016-01-04", 292 | "tags": [ 293 | "fugiat", 294 | "non", 295 | "adipisicing", 296 | "id", 297 | "incididunt", 298 | "do", 299 | "enim" 300 | ] 301 | }, 302 | { 303 | "_id": "57ef9cd8431bccda13eea218", 304 | "index": 10, 305 | "guid": "b5671cc8-2776-4180-9cab-2f26fd38c720", 306 | "isActive": false, 307 | "balance": "$1,619.16", 308 | "picture": "http://placehold.it/32x32", 309 | "age": 22, 310 | "eyeColor": "brown", 311 | "name": "Ramirez Valdez", 312 | "gender": "male", 313 | "company": "SOLAREN", 314 | "email": "ramirezvaldez@solaren.com", 315 | "phone": "+1 (820) 465-2360", 316 | "address": { 317 | "street": "932 Battery Avenue", 318 | "city": "Iola", 319 | "state": "Virginia" 320 | }, 321 | "registered": "2014-01-27", 322 | "tags": [ 323 | "minim", 324 | "aliqua", 325 | "culpa", 326 | "dolore", 327 | "excepteur", 328 | "minim", 329 | "sit" 330 | ] 331 | }, 332 | { 333 | "_id": "57ef9cd8e7379045d04a0540", 334 | "index": 11, 335 | "guid": "19b39b01-74e1-495c-b7a6-a88d66420fba", 336 | "isActive": false, 337 | "balance": "$1,638.78", 338 | "picture": "http://placehold.it/32x32", 339 | "age": 39, 340 | "eyeColor": "brown", 341 | "name": "Alisha Michael", 342 | "gender": "female", 343 | "company": "STUCCO", 344 | "email": "alishamichael@stucco.com", 345 | "phone": "+1 (800) 497-2778", 346 | "address": { 347 | "street": "184 Coffey Street", 348 | "city": "Trucksville", 349 | "state": "New York" 350 | }, 351 | "registered": "2015-03-31", 352 | "tags": [ 353 | "irure", 354 | "dolore", 355 | "minim", 356 | "excepteur", 357 | "aliquip", 358 | "officia", 359 | "fugiat" 360 | ] 361 | }, 362 | { 363 | "_id": "57ef9cd8059fd44b460b7c38", 364 | "index": 12, 365 | "guid": "2a3054d0-a2ea-4ee2-a2f5-f5d1d0573b11", 366 | "isActive": true, 367 | "balance": "$1,156.43", 368 | "picture": "http://placehold.it/32x32", 369 | "age": 21, 370 | "eyeColor": "brown", 371 | "name": "Shepard Russo", 372 | "gender": "male", 373 | "company": "MAXIMIND", 374 | "email": "shepardrusso@maximind.com", 375 | "phone": "+1 (810) 417-3060", 376 | "address": { 377 | "street": "450 Stryker Court", 378 | "city": "Eagleville", 379 | "state": "South Dakota" 380 | }, 381 | "registered": "2014-12-17", 382 | "tags": [ 383 | "qui", 384 | "irure", 385 | "pariatur", 386 | "eiusmod", 387 | "tempor", 388 | "ullamco", 389 | "aliquip" 390 | ] 391 | }, 392 | { 393 | "_id": "57ef9cd8afc877c47ac02b6a", 394 | "index": 13, 395 | "guid": "7ad0c0a8-59ca-457f-9b41-fd1ae83b4f60", 396 | "isActive": false, 397 | "balance": "$2,376.34", 398 | "picture": "http://placehold.it/32x32", 399 | "age": 39, 400 | "eyeColor": "blue", 401 | "name": "Joyner Cohen", 402 | "gender": "male", 403 | "company": "LYRIA", 404 | "email": "joynercohen@lyria.com", 405 | "phone": "+1 (962) 595-2903", 406 | "address": { 407 | "street": "304 Calder Place", 408 | "city": "Choctaw", 409 | "state": "Louisiana" 410 | }, 411 | "registered": "2016-04-30", 412 | "tags": [ 413 | "in", 414 | "sunt", 415 | "cupidatat", 416 | "nostrud", 417 | "laboris", 418 | "culpa", 419 | "consequat" 420 | ] 421 | }, 422 | { 423 | "_id": "57ef9cd8aa516857d091b670", 424 | "index": 14, 425 | "guid": "47be1205-5fde-4a1b-ba80-5ab56e659c32", 426 | "isActive": false, 427 | "balance": "$1,837.95", 428 | "picture": "http://placehold.it/32x32", 429 | "age": 32, 430 | "eyeColor": "blue", 431 | "name": "Doreen Vincent", 432 | "gender": "female", 433 | "company": "VANTAGE", 434 | "email": "doreenvincent@vantage.com", 435 | "phone": "+1 (972) 484-2153", 436 | "address": { 437 | "street": "520 Greenpoint Avenue", 438 | "city": "Chapin", 439 | "state": "Rhode Island" 440 | }, 441 | "registered": "2015-12-11", 442 | "tags": [ 443 | "cillum", 444 | "aute", 445 | "Lorem", 446 | "occaecat", 447 | "eu", 448 | "voluptate", 449 | "ea" 450 | ] 451 | }, 452 | { 453 | "_id": "57ef9cd8778023bd5ebc71df", 454 | "index": 15, 455 | "guid": "3efedc36-6bcd-4f78-b64e-11f6c3374ff0", 456 | "isActive": true, 457 | "balance": "$3,412.92", 458 | "picture": "http://placehold.it/32x32", 459 | "age": 34, 460 | "eyeColor": "green", 461 | "name": "Felicia Osborne", 462 | "gender": "female", 463 | "company": "XELEGYL", 464 | "email": "feliciaosborne@xelegyl.com", 465 | "phone": "+1 (884) 448-3923", 466 | "address": { 467 | "street": "895 Luquer Street", 468 | "city": "Bluffview", 469 | "state": "Alabama" 470 | }, 471 | "registered": "2015-04-11", 472 | "tags": [ 473 | "elit", 474 | "veniam", 475 | "consectetur", 476 | "sunt", 477 | "ipsum", 478 | "incididunt", 479 | "adipisicing" 480 | ] 481 | }, 482 | { 483 | "_id": "57ef9cd862a19b82a2b57c2a", 484 | "index": 16, 485 | "guid": "2a08992f-b1ca-4a75-9b4c-df4ba052f3b2", 486 | "isActive": false, 487 | "balance": "$2,053.01", 488 | "picture": "http://placehold.it/32x32", 489 | "age": 35, 490 | "eyeColor": "green", 491 | "name": "Dillon Schmidt", 492 | "gender": "male", 493 | "company": "KEEG", 494 | "email": "dillonschmidt@keeg.com", 495 | "phone": "+1 (869) 554-3796", 496 | "address": { 497 | "street": "344 Sullivan Place", 498 | "city": "Bawcomville", 499 | "state": "Palau" 500 | }, 501 | "registered": "2016-07-04", 502 | "tags": [ 503 | "mollit", 504 | "duis", 505 | "pariatur", 506 | "velit", 507 | "Lorem", 508 | "Lorem", 509 | "anim" 510 | ] 511 | }, 512 | { 513 | "_id": "57ef9cd8b2b36698294cfb64", 514 | "index": 17, 515 | "guid": "9644a804-0216-49c7-8625-d15a3bfb31c5", 516 | "isActive": false, 517 | "balance": "$2,507.00", 518 | "picture": "http://placehold.it/32x32", 519 | "age": 40, 520 | "eyeColor": "blue", 521 | "name": "Melody Miranda", 522 | "gender": "female", 523 | "company": "ENTHAZE", 524 | "email": "melodymiranda@enthaze.com", 525 | "phone": "+1 (849) 464-3618", 526 | "address": { 527 | "street": "418 Whitney Avenue", 528 | "city": "Sanders", 529 | "state": "Indiana" 530 | }, 531 | "registered": "2014-04-22", 532 | "tags": [ 533 | "consequat", 534 | "commodo", 535 | "magna", 536 | "aute", 537 | "occaecat", 538 | "ea", 539 | "minim" 540 | ] 541 | }, 542 | { 543 | "_id": "57ef9cd8410de3de4768210a", 544 | "index": 18, 545 | "guid": "3859f0d4-cc87-4d6b-b101-e867b8e5c0cc", 546 | "isActive": false, 547 | "balance": "$2,737.68", 548 | "picture": "http://placehold.it/32x32", 549 | "age": 36, 550 | "eyeColor": "green", 551 | "name": "Wilkerson Melendez", 552 | "gender": "male", 553 | "company": "TECHMANIA", 554 | "email": "wilkersonmelendez@techmania.com", 555 | "phone": "+1 (952) 481-3063", 556 | "address": { 557 | "street": "818 Ocean Parkway", 558 | "city": "Kerby", 559 | "state": "Iowa" 560 | }, 561 | "registered": "2014-11-14", 562 | "tags": [ 563 | "sit", 564 | "cupidatat", 565 | "aliqua", 566 | "in", 567 | "officia", 568 | "pariatur", 569 | "ex" 570 | ] 571 | }, 572 | { 573 | "_id": "57ef9cd8bda3e38af810f58a", 574 | "index": 19, 575 | "guid": "90af70fd-1241-4d07-b3f0-727f7987a60c", 576 | "isActive": true, 577 | "balance": "$1,028.57", 578 | "picture": "http://placehold.it/32x32", 579 | "age": 37, 580 | "eyeColor": "blue", 581 | "name": "Rivera Velazquez", 582 | "gender": "male", 583 | "company": "GLEAMINK", 584 | "email": "riveravelazquez@gleamink.com", 585 | "phone": "+1 (973) 597-3283", 586 | "address": { 587 | "street": "330 Monaco Place", 588 | "city": "Grahamtown", 589 | "state": "Northern Mariana Islands" 590 | }, 591 | "registered": "2016-01-10", 592 | "tags": [ 593 | "excepteur", 594 | "est", 595 | "occaecat", 596 | "nulla", 597 | "nostrud", 598 | "eu", 599 | "ipsum" 600 | ] 601 | }, 602 | { 603 | "_id": "57ef9cd8351d9509288c8469", 604 | "index": 20, 605 | "guid": "c9f0b7e4-f7ec-44b5-ba6b-d9991bb3404b", 606 | "isActive": true, 607 | "balance": "$2,456.41", 608 | "picture": "http://placehold.it/32x32", 609 | "age": 35, 610 | "eyeColor": "blue", 611 | "name": "Reese Velez", 612 | "gender": "male", 613 | "company": "POLARIA", 614 | "email": "reesevelez@polaria.com", 615 | "phone": "+1 (950) 549-3805", 616 | "address": { 617 | "street": "571 Wilson Avenue", 618 | "city": "Hannasville", 619 | "state": "Tennessee" 620 | }, 621 | "registered": "2016-07-24", 622 | "tags": [ 623 | "veniam", 624 | "occaecat", 625 | "irure", 626 | "consequat", 627 | "labore", 628 | "laboris", 629 | "Lorem" 630 | ] 631 | }, 632 | { 633 | "_id": "57ef9cd8014e14851bee0084", 634 | "index": 21, 635 | "guid": "6691378e-7cb9-4bff-ac93-a79fadfa49d1", 636 | "isActive": false, 637 | "balance": "$3,892.36", 638 | "picture": "http://placehold.it/32x32", 639 | "age": 33, 640 | "eyeColor": "blue", 641 | "name": "Kayla Morgan", 642 | "gender": "female", 643 | "company": "VIDTO", 644 | "email": "kaylamorgan@vidto.com", 645 | "phone": "+1 (976) 499-2436", 646 | "address": { 647 | "street": "188 Lancaster Avenue", 648 | "city": "Bowden", 649 | "state": "District Of Columbia" 650 | }, 651 | "registered": "2015-12-16", 652 | "tags": [ 653 | "minim", 654 | "proident", 655 | "sunt", 656 | "nostrud", 657 | "adipisicing", 658 | "cupidatat", 659 | "veniam" 660 | ] 661 | }, 662 | { 663 | "_id": "57ef9cd810b76a3d60fb0b9b", 664 | "index": 22, 665 | "guid": "26e927c7-63c5-4e82-bdc0-7832cb890156", 666 | "isActive": false, 667 | "balance": "$3,668.66", 668 | "picture": "http://placehold.it/32x32", 669 | "age": 20, 670 | "eyeColor": "brown", 671 | "name": "Benson Snyder", 672 | "gender": "male", 673 | "company": "ZOSIS", 674 | "email": "bensonsnyder@zosis.com", 675 | "phone": "+1 (923) 595-3264", 676 | "address": { 677 | "street": "294 Douglass Street", 678 | "city": "Hiseville", 679 | "state": "Marshall Islands" 680 | }, 681 | "registered": "2016-07-02", 682 | "tags": [ 683 | "sint", 684 | "amet", 685 | "cillum", 686 | "exercitation", 687 | "Lorem", 688 | "amet", 689 | "ad" 690 | ] 691 | }, 692 | { 693 | "_id": "57ef9cd8d6e3b40316003054", 694 | "index": 23, 695 | "guid": "248e3d33-6827-461b-a92e-408a4927d5dc", 696 | "isActive": true, 697 | "balance": "$2,253.39", 698 | "picture": "http://placehold.it/32x32", 699 | "age": 32, 700 | "eyeColor": "green", 701 | "name": "Strickland Andrews", 702 | "gender": "male", 703 | "company": "COMBOT", 704 | "email": "stricklandandrews@combot.com", 705 | "phone": "+1 (969) 560-2376", 706 | "address": { 707 | "street": "677 Albemarle Road", 708 | "city": "Thornport", 709 | "state": "Florida" 710 | }, 711 | "registered": "2015-06-15", 712 | "tags": [ 713 | "culpa", 714 | "nulla", 715 | "excepteur", 716 | "incididunt", 717 | "nulla", 718 | "mollit", 719 | "occaecat" 720 | ] 721 | }, 722 | { 723 | "_id": "57ef9cd8bbf66c3b7757b773", 724 | "index": 24, 725 | "guid": "303c36fd-14e0-49f7-b6de-01c6cf866313", 726 | "isActive": false, 727 | "balance": "$1,248.11", 728 | "picture": "http://placehold.it/32x32", 729 | "age": 21, 730 | "eyeColor": "blue", 731 | "name": "Castro Hanson", 732 | "gender": "male", 733 | "company": "FURNITECH", 734 | "email": "castrohanson@furnitech.com", 735 | "phone": "+1 (901) 512-2724", 736 | "address": { 737 | "street": "932 Herkimer Court", 738 | "city": "Cavalero", 739 | "state": "Texas" 740 | }, 741 | "registered": "2014-12-07", 742 | "tags": [ 743 | "est", 744 | "aliqua", 745 | "enim", 746 | "ex", 747 | "Lorem", 748 | "nostrud", 749 | "eiusmod" 750 | ] 751 | }, 752 | { 753 | "_id": "57ef9cd8aa22d92e5c82b2f6", 754 | "index": 25, 755 | "guid": "fd997458-836f-4d24-bbab-a0aa26e68c2d", 756 | "isActive": false, 757 | "balance": "$1,264.43", 758 | "picture": "http://placehold.it/32x32", 759 | "age": 21, 760 | "eyeColor": "blue", 761 | "name": "Iris Nielsen", 762 | "gender": "female", 763 | "company": "ROUGHIES", 764 | "email": "irisnielsen@roughies.com", 765 | "phone": "+1 (916) 468-3250", 766 | "address": { 767 | "street": "824 Doscher Street", 768 | "city": "Goodville", 769 | "state": "South Carolina" 770 | }, 771 | "registered": "2015-08-01", 772 | "tags": [ 773 | "sint", 774 | "voluptate", 775 | "adipisicing", 776 | "id", 777 | "eiusmod", 778 | "veniam", 779 | "excepteur" 780 | ] 781 | }, 782 | { 783 | "_id": "57ef9cd8e00712c4924d6413", 784 | "index": 26, 785 | "guid": "f6b3c048-e563-4fa6-a28f-d358c5b4f74c", 786 | "isActive": true, 787 | "balance": "$1,462.23", 788 | "picture": "http://placehold.it/32x32", 789 | "age": 23, 790 | "eyeColor": "blue", 791 | "name": "Dionne Boyer", 792 | "gender": "female", 793 | "company": "PETIGEMS", 794 | "email": "dionneboyer@petigems.com", 795 | "phone": "+1 (826) 510-3961", 796 | "address": { 797 | "street": "483 Prospect Avenue", 798 | "city": "Forestburg", 799 | "state": "Nevada" 800 | }, 801 | "registered": "2016-09-09", 802 | "tags": [ 803 | "ipsum", 804 | "id", 805 | "eiusmod", 806 | "laboris", 807 | "incididunt", 808 | "deserunt", 809 | "anim" 810 | ] 811 | }, 812 | { 813 | "_id": "57ef9cd8a25729d7ccb55e01", 814 | "index": 27, 815 | "guid": "376807be-1fdc-4d6a-961c-84b313b81f70", 816 | "isActive": true, 817 | "balance": "$1,384.08", 818 | "picture": "http://placehold.it/32x32", 819 | "age": 33, 820 | "eyeColor": "green", 821 | "name": "Cooke Alford", 822 | "gender": "male", 823 | "company": "PROXSOFT", 824 | "email": "cookealford@proxsoft.com", 825 | "phone": "+1 (850) 486-2468", 826 | "address": { 827 | "street": "870 High Street", 828 | "city": "Reinerton", 829 | "state": "Delaware" 830 | }, 831 | "registered": "2016-03-25", 832 | "tags": [ 833 | "id", 834 | "amet", 835 | "irure", 836 | "eiusmod", 837 | "excepteur", 838 | "nostrud", 839 | "qui" 840 | ] 841 | }, 842 | { 843 | "_id": "57ef9cd8998c6d6498836a72", 844 | "index": 28, 845 | "guid": "fe5ad1f3-c898-4635-bbd8-6c3185e9415f", 846 | "isActive": false, 847 | "balance": "$1,658.18", 848 | "picture": "http://placehold.it/32x32", 849 | "age": 24, 850 | "eyeColor": "brown", 851 | "name": "Goff Lamb", 852 | "gender": "male", 853 | "company": "GLOBOIL", 854 | "email": "gofflamb@globoil.com", 855 | "phone": "+1 (996) 400-2491", 856 | "address": { 857 | "street": "361 Interborough Parkway", 858 | "city": "Dodge", 859 | "state": "Kansas" 860 | }, 861 | "registered": "2016-09-12", 862 | "tags": [ 863 | "nisi", 864 | "cupidatat", 865 | "aliquip", 866 | "non", 867 | "et", 868 | "sint", 869 | "enim" 870 | ] 871 | }, 872 | { 873 | "_id": "57ef9cd82e0778dff1ee3579", 874 | "index": 29, 875 | "guid": "ea213edd-47dd-4fd5-be36-27e34fa7fba1", 876 | "isActive": false, 877 | "balance": "$2,355.96", 878 | "picture": "http://placehold.it/32x32", 879 | "age": 21, 880 | "eyeColor": "brown", 881 | "name": "Barry Ramsey", 882 | "gender": "male", 883 | "company": "ACCUPHARM", 884 | "email": "barryramsey@accupharm.com", 885 | "phone": "+1 (841) 406-3771", 886 | "address": { 887 | "street": "220 Henderson Walk", 888 | "city": "Gerber", 889 | "state": "California" 890 | }, 891 | "registered": "2014-11-15", 892 | "tags": [ 893 | "cillum", 894 | "esse", 895 | "aliqua", 896 | "do", 897 | "irure", 898 | "eu", 899 | "eu" 900 | ] 901 | }, 902 | { 903 | "_id": "57ef9cd8b7a3f7141cd6787a", 904 | "index": 30, 905 | "guid": "05148b5f-e9b2-4697-a25c-b9de7473f4bc", 906 | "isActive": true, 907 | "balance": "$1,262.77", 908 | "picture": "http://placehold.it/32x32", 909 | "age": 31, 910 | "eyeColor": "brown", 911 | "name": "Aguilar Koch", 912 | "gender": "male", 913 | "company": "EMERGENT", 914 | "email": "aguilarkoch@emergent.com", 915 | "phone": "+1 (829) 518-3177", 916 | "address": { 917 | "street": "929 Himrod Street", 918 | "city": "Leeper", 919 | "state": "New Jersey" 920 | }, 921 | "registered": "2015-07-12", 922 | "tags": [ 923 | "ipsum", 924 | "eu", 925 | "cillum", 926 | "aute", 927 | "labore", 928 | "ea", 929 | "eiusmod" 930 | ] 931 | }, 932 | { 933 | "_id": "57ef9cd83f6b95641c5e3c75", 934 | "index": 31, 935 | "guid": "27304437-1b44-4ad8-81e8-710b4b8345ff", 936 | "isActive": false, 937 | "balance": "$3,601.82", 938 | "picture": "http://placehold.it/32x32", 939 | "age": 24, 940 | "eyeColor": "brown", 941 | "name": "Oconnor Hopper", 942 | "gender": "male", 943 | "company": "FUELWORKS", 944 | "email": "oconnorhopper@fuelworks.com", 945 | "phone": "+1 (891) 493-3016", 946 | "address": { 947 | "street": "426 Montieth Street", 948 | "city": "Hegins", 949 | "state": "Wyoming" 950 | }, 951 | "registered": "2015-07-24", 952 | "tags": [ 953 | "minim", 954 | "voluptate", 955 | "elit", 956 | "incididunt", 957 | "ut", 958 | "fugiat", 959 | "occaecat" 960 | ] 961 | }, 962 | { 963 | "_id": "57ef9cd8369d6e4b835f3fcd", 964 | "index": 32, 965 | "guid": "721a77b7-b011-47f4-a810-e7f29e7006c9", 966 | "isActive": true, 967 | "balance": "$1,915.04", 968 | "picture": "http://placehold.it/32x32", 969 | "age": 20, 970 | "eyeColor": "green", 971 | "name": "Daugherty White", 972 | "gender": "male", 973 | "company": "BOLAX", 974 | "email": "daughertywhite@bolax.com", 975 | "phone": "+1 (826) 594-2129", 976 | "address": { 977 | "street": "449 Lester Court", 978 | "city": "Joes", 979 | "state": "Massachusetts" 980 | }, 981 | "registered": "2014-10-13", 982 | "tags": [ 983 | "Lorem", 984 | "enim", 985 | "nostrud", 986 | "nisi", 987 | "consequat", 988 | "ullamco", 989 | "laborum" 990 | ] 991 | }, 992 | { 993 | "_id": "57ef9cd86305c595658af48b", 994 | "index": 33, 995 | "guid": "1cfc8de2-d36c-4ef1-9e40-f088cf75eb82", 996 | "isActive": true, 997 | "balance": "$2,866.63", 998 | "picture": "http://placehold.it/32x32", 999 | "age": 40, 1000 | "eyeColor": "blue", 1001 | "name": "Kane Mclaughlin", 1002 | "gender": "male", 1003 | "company": "BUZZNESS", 1004 | "email": "kanemclaughlin@buzzness.com", 1005 | "phone": "+1 (832) 531-3366", 1006 | "address": { 1007 | "street": "661 Apollo Street", 1008 | "city": "Crayne", 1009 | "state": "Kentucky" 1010 | }, 1011 | "registered": "2014-07-08", 1012 | "tags": [ 1013 | "laboris", 1014 | "quis", 1015 | "enim", 1016 | "ea", 1017 | "cupidatat", 1018 | "nisi", 1019 | "ipsum" 1020 | ] 1021 | }, 1022 | { 1023 | "_id": "57ef9cd8306a49b3a4173669", 1024 | "index": 34, 1025 | "guid": "0bf330e0-c370-466d-9a5e-4506272fd132", 1026 | "isActive": false, 1027 | "balance": "$1,185.64", 1028 | "picture": "http://placehold.it/32x32", 1029 | "age": 40, 1030 | "eyeColor": "brown", 1031 | "name": "Berry Moore", 1032 | "gender": "male", 1033 | "company": "MOBILDATA", 1034 | "email": "berrymoore@mobildata.com", 1035 | "phone": "+1 (868) 455-2610", 1036 | "address": { 1037 | "street": "655 Eldert Street", 1038 | "city": "Camino", 1039 | "state": "Arizona" 1040 | }, 1041 | "registered": "2015-10-08", 1042 | "tags": [ 1043 | "labore", 1044 | "dolore", 1045 | "labore", 1046 | "proident", 1047 | "aute", 1048 | "amet", 1049 | "quis" 1050 | ] 1051 | }, 1052 | { 1053 | "_id": "57ef9cd80ae90356bd04b760", 1054 | "index": 35, 1055 | "guid": "2be39caa-9fcc-4616-a7b5-f72e3d3cbdaf", 1056 | "isActive": true, 1057 | "balance": "$1,185.60", 1058 | "picture": "http://placehold.it/32x32", 1059 | "age": 26, 1060 | "eyeColor": "blue", 1061 | "name": "Gwendolyn Hunt", 1062 | "gender": "female", 1063 | "company": "DIGIAL", 1064 | "email": "gwendolynhunt@digial.com", 1065 | "phone": "+1 (853) 562-3237", 1066 | "address": { 1067 | "street": "597 Hart Street", 1068 | "city": "Kenmar", 1069 | "state": "Maryland" 1070 | }, 1071 | "registered": "2015-10-27", 1072 | "tags": [ 1073 | "Lorem", 1074 | "officia", 1075 | "adipisicing", 1076 | "velit", 1077 | "tempor", 1078 | "eiusmod", 1079 | "labore" 1080 | ] 1081 | }, 1082 | { 1083 | "_id": "57ef9cd884359a9538967098", 1084 | "index": 36, 1085 | "guid": "63ab3d9c-8138-4f09-baf9-6d76c5ba573a", 1086 | "isActive": true, 1087 | "balance": "$2,469.48", 1088 | "picture": "http://placehold.it/32x32", 1089 | "age": 23, 1090 | "eyeColor": "green", 1091 | "name": "Willie Garrett", 1092 | "gender": "female", 1093 | "company": "BALOOBA", 1094 | "email": "williegarrett@balooba.com", 1095 | "phone": "+1 (843) 425-3145", 1096 | "address": { 1097 | "street": "456 Maple Avenue", 1098 | "city": "Hackneyville", 1099 | "state": "Illinois" 1100 | }, 1101 | "registered": "2014-02-09", 1102 | "tags": [ 1103 | "est", 1104 | "aliqua", 1105 | "in", 1106 | "excepteur", 1107 | "ut", 1108 | "eu", 1109 | "fugiat" 1110 | ] 1111 | }, 1112 | { 1113 | "_id": "57ef9cd8db282c5f4f1448d4", 1114 | "index": 37, 1115 | "guid": "bc8ce4f1-6cc4-4925-9046-3a5e91f858bc", 1116 | "isActive": true, 1117 | "balance": "$1,067.32", 1118 | "picture": "http://placehold.it/32x32", 1119 | "age": 29, 1120 | "eyeColor": "green", 1121 | "name": "Christina Good", 1122 | "gender": "female", 1123 | "company": "APPLIDECK", 1124 | "email": "christinagood@applideck.com", 1125 | "phone": "+1 (851) 462-3278", 1126 | "address": { 1127 | "street": "650 Arlington Place", 1128 | "city": "Wheaton", 1129 | "state": "West Virginia" 1130 | }, 1131 | "registered": "2015-01-28", 1132 | "tags": [ 1133 | "cupidatat", 1134 | "ad", 1135 | "consequat", 1136 | "proident", 1137 | "ex", 1138 | "officia", 1139 | "adipisicing" 1140 | ] 1141 | }, 1142 | { 1143 | "_id": "57ef9cd88452ab36aa70f054", 1144 | "index": 38, 1145 | "guid": "4db3de26-08ae-40a0-9dc6-cd9aad7bdc25", 1146 | "isActive": false, 1147 | "balance": "$3,016.01", 1148 | "picture": "http://placehold.it/32x32", 1149 | "age": 35, 1150 | "eyeColor": "brown", 1151 | "name": "Hooper Blair", 1152 | "gender": "male", 1153 | "company": "ANARCO", 1154 | "email": "hooperblair@anarco.com", 1155 | "phone": "+1 (877) 468-2384", 1156 | "address": { 1157 | "street": "535 Bancroft Place", 1158 | "city": "National", 1159 | "state": "Alaska" 1160 | }, 1161 | "registered": "2015-02-24", 1162 | "tags": [ 1163 | "non", 1164 | "laboris", 1165 | "aliqua", 1166 | "velit", 1167 | "officia", 1168 | "aliqua", 1169 | "in" 1170 | ] 1171 | }, 1172 | { 1173 | "_id": "57ef9cd8fd30953315b376ce", 1174 | "index": 39, 1175 | "guid": "2537139a-70e6-438b-980f-a43ee251db50", 1176 | "isActive": true, 1177 | "balance": "$1,259.80", 1178 | "picture": "http://placehold.it/32x32", 1179 | "age": 26, 1180 | "eyeColor": "brown", 1181 | "name": "Wilson Whitley", 1182 | "gender": "male", 1183 | "company": "BUNGA", 1184 | "email": "wilsonwhitley@bunga.com", 1185 | "phone": "+1 (881) 545-2408", 1186 | "address": { 1187 | "street": "536 Delevan Street", 1188 | "city": "Clara", 1189 | "state": "Oklahoma" 1190 | }, 1191 | "registered": "2015-05-15", 1192 | "tags": [ 1193 | "sunt", 1194 | "officia", 1195 | "officia", 1196 | "est", 1197 | "Lorem", 1198 | "elit", 1199 | "exercitation" 1200 | ] 1201 | }, 1202 | { 1203 | "_id": "57ef9cd88d9237233ce5a603", 1204 | "index": 40, 1205 | "guid": "407cc2cb-7eb0-4614-97d8-85a2b0ca2c55", 1206 | "isActive": false, 1207 | "balance": "$1,954.73", 1208 | "picture": "http://placehold.it/32x32", 1209 | "age": 28, 1210 | "eyeColor": "blue", 1211 | "name": "Hilda Osborn", 1212 | "gender": "female", 1213 | "company": "SLOGANAUT", 1214 | "email": "hildaosborn@sloganaut.com", 1215 | "phone": "+1 (975) 466-3813", 1216 | "address": { 1217 | "street": "412 Tudor Terrace", 1218 | "city": "Brecon", 1219 | "state": "Federated States Of Micronesia" 1220 | }, 1221 | "registered": "2016-06-23", 1222 | "tags": [ 1223 | "anim", 1224 | "culpa", 1225 | "fugiat", 1226 | "minim", 1227 | "occaecat", 1228 | "sit", 1229 | "excepteur" 1230 | ] 1231 | }, 1232 | { 1233 | "_id": "57ef9cd839131d7d2e092514", 1234 | "index": 41, 1235 | "guid": "0eb0fb97-2de9-4815-a533-7ac084b94863", 1236 | "isActive": false, 1237 | "balance": "$2,347.37", 1238 | "picture": "http://placehold.it/32x32", 1239 | "age": 29, 1240 | "eyeColor": "blue", 1241 | "name": "Denise Griffin", 1242 | "gender": "female", 1243 | "company": "ATOMICA", 1244 | "email": "denisegriffin@atomica.com", 1245 | "phone": "+1 (858) 538-2320", 1246 | "address": { 1247 | "street": "415 Catherine Street", 1248 | "city": "Onton", 1249 | "state": "Vermont" 1250 | }, 1251 | "registered": "2014-06-17", 1252 | "tags": [ 1253 | "qui", 1254 | "sunt", 1255 | "commodo", 1256 | "tempor", 1257 | "exercitation", 1258 | "nisi", 1259 | "exercitation" 1260 | ] 1261 | }, 1262 | { 1263 | "_id": "57ef9cd89974d5066113c5eb", 1264 | "index": 42, 1265 | "guid": "03ba8cb5-6ad5-47f9-a0f1-28939ade5983", 1266 | "isActive": true, 1267 | "balance": "$3,867.30", 1268 | "picture": "http://placehold.it/32x32", 1269 | "age": 26, 1270 | "eyeColor": "green", 1271 | "name": "Neal Castro", 1272 | "gender": "male", 1273 | "company": "OVATION", 1274 | "email": "nealcastro@ovation.com", 1275 | "phone": "+1 (967) 436-2454", 1276 | "address": { 1277 | "street": "119 Harrison Avenue", 1278 | "city": "Volta", 1279 | "state": "Idaho" 1280 | }, 1281 | "registered": "2014-06-22", 1282 | "tags": [ 1283 | "Lorem", 1284 | "cupidatat", 1285 | "et", 1286 | "quis", 1287 | "voluptate", 1288 | "incididunt", 1289 | "dolore" 1290 | ] 1291 | }, 1292 | { 1293 | "_id": "57ef9cd88d860c6070fafef1", 1294 | "index": 43, 1295 | "guid": "e14b2f74-0aaa-4218-940d-5f7fb2551151", 1296 | "isActive": true, 1297 | "balance": "$3,011.45", 1298 | "picture": "http://placehold.it/32x32", 1299 | "age": 22, 1300 | "eyeColor": "blue", 1301 | "name": "Rich Montoya", 1302 | "gender": "male", 1303 | "company": "ORBAXTER", 1304 | "email": "richmontoya@orbaxter.com", 1305 | "phone": "+1 (866) 530-3039", 1306 | "address": { 1307 | "street": "134 Blake Court", 1308 | "city": "Kaka", 1309 | "state": "Arkansas" 1310 | }, 1311 | "registered": "2016-06-21", 1312 | "tags": [ 1313 | "sunt", 1314 | "cillum", 1315 | "enim", 1316 | "occaecat", 1317 | "minim", 1318 | "reprehenderit", 1319 | "nulla" 1320 | ] 1321 | }, 1322 | { 1323 | "_id": "57ef9cd8e093c420b70f6787", 1324 | "index": 44, 1325 | "guid": "1cabe364-180d-4147-88c7-2154241c22f2", 1326 | "isActive": false, 1327 | "balance": "$2,413.74", 1328 | "picture": "http://placehold.it/32x32", 1329 | "age": 37, 1330 | "eyeColor": "brown", 1331 | "name": "Galloway Wilcox", 1332 | "gender": "male", 1333 | "company": "KENEGY", 1334 | "email": "gallowaywilcox@kenegy.com", 1335 | "phone": "+1 (806) 596-3339", 1336 | "address": { 1337 | "street": "131 Kay Court", 1338 | "city": "Bannock", 1339 | "state": "Ohio" 1340 | }, 1341 | "registered": "2014-12-04", 1342 | "tags": [ 1343 | "consequat", 1344 | "elit", 1345 | "in", 1346 | "mollit", 1347 | "nostrud", 1348 | "amet", 1349 | "irure" 1350 | ] 1351 | }, 1352 | { 1353 | "_id": "57ef9cd8a07f64e3585adaa4", 1354 | "index": 45, 1355 | "guid": "9a0ba82c-3a59-4b8c-a735-16f57c4e5b7b", 1356 | "isActive": true, 1357 | "balance": "$1,419.98", 1358 | "picture": "http://placehold.it/32x32", 1359 | "age": 25, 1360 | "eyeColor": "green", 1361 | "name": "Estela Johnson", 1362 | "gender": "female", 1363 | "company": "LUNCHPOD", 1364 | "email": "estelajohnson@lunchpod.com", 1365 | "phone": "+1 (857) 457-3968", 1366 | "address": { 1367 | "street": "909 Cheever Place", 1368 | "city": "Clarence", 1369 | "state": "Missouri" 1370 | }, 1371 | "registered": "2015-06-19", 1372 | "tags": [ 1373 | "sint", 1374 | "velit", 1375 | "ut", 1376 | "minim", 1377 | "ad", 1378 | "proident", 1379 | "labore" 1380 | ] 1381 | }, 1382 | { 1383 | "_id": "57ef9cd863d1b1a4acb74988", 1384 | "index": 46, 1385 | "guid": "8154d3fc-2b77-4107-ab34-42bb23f470e6", 1386 | "isActive": false, 1387 | "balance": "$2,049.10", 1388 | "picture": "http://placehold.it/32x32", 1389 | "age": 27, 1390 | "eyeColor": "green", 1391 | "name": "Lorrie Huffman", 1392 | "gender": "female", 1393 | "company": "SPHERIX", 1394 | "email": "lorriehuffman@spherix.com", 1395 | "phone": "+1 (855) 535-2317", 1396 | "address": { 1397 | "street": "221 Essex Street", 1398 | "city": "Tedrow", 1399 | "state": "Washington" 1400 | }, 1401 | "registered": "2016-09-27", 1402 | "tags": [ 1403 | "consequat", 1404 | "excepteur", 1405 | "ipsum", 1406 | "ipsum", 1407 | "esse", 1408 | "cillum", 1409 | "qui" 1410 | ] 1411 | }, 1412 | { 1413 | "_id": "57ef9cd8e0a6bad7cf9ec1dc", 1414 | "index": 47, 1415 | "guid": "d44f213d-7164-4aba-b5e1-5e8646853e41", 1416 | "isActive": true, 1417 | "balance": "$1,958.21", 1418 | "picture": "http://placehold.it/32x32", 1419 | "age": 37, 1420 | "eyeColor": "brown", 1421 | "name": "Celia Burnett", 1422 | "gender": "female", 1423 | "company": "ENORMO", 1424 | "email": "celiaburnett@enormo.com", 1425 | "phone": "+1 (834) 438-2214", 1426 | "address": { 1427 | "street": "315 Louisiana Avenue", 1428 | "city": "Wauhillau", 1429 | "state": "New Hampshire" 1430 | }, 1431 | "registered": "2014-02-21", 1432 | "tags": [ 1433 | "officia", 1434 | "cupidatat", 1435 | "ullamco", 1436 | "velit", 1437 | "ad", 1438 | "ea", 1439 | "nostrud" 1440 | ] 1441 | }, 1442 | { 1443 | "_id": "57ef9cd8e0617ebaf2a76998", 1444 | "index": 48, 1445 | "guid": "9d09a10a-6b16-44c5-bd72-20ee3188432c", 1446 | "isActive": false, 1447 | "balance": "$3,027.42", 1448 | "picture": "http://placehold.it/32x32", 1449 | "age": 31, 1450 | "eyeColor": "brown", 1451 | "name": "Delaney Hamilton", 1452 | "gender": "male", 1453 | "company": "ACCUSAGE", 1454 | "email": "delaneyhamilton@accusage.com", 1455 | "phone": "+1 (862) 425-3630", 1456 | "address": { 1457 | "street": "407 Oceanview Avenue", 1458 | "city": "Waikele", 1459 | "state": "New Mexico" 1460 | }, 1461 | "registered": "2014-07-06", 1462 | "tags": [ 1463 | "aliquip", 1464 | "fugiat", 1465 | "cillum", 1466 | "id", 1467 | "excepteur", 1468 | "ad", 1469 | "non" 1470 | ] 1471 | }, 1472 | { 1473 | "_id": "57ef9cd831ecdff3ea6aba9e", 1474 | "index": 49, 1475 | "guid": "f5212db5-dfe2-426e-a4e0-83331831bbe8", 1476 | "isActive": false, 1477 | "balance": "$2,970.07", 1478 | "picture": "http://placehold.it/32x32", 1479 | "age": 39, 1480 | "eyeColor": "green", 1481 | "name": "Elma Baldwin", 1482 | "gender": "female", 1483 | "company": "XANIDE", 1484 | "email": "elmabaldwin@xanide.com", 1485 | "phone": "+1 (991) 445-3729", 1486 | "address": { 1487 | "street": "817 Loring Avenue", 1488 | "city": "Jenkinsville", 1489 | "state": "Virgin Islands" 1490 | }, 1491 | "registered": "2015-03-13", 1492 | "tags": [ 1493 | "aute", 1494 | "nisi", 1495 | "laborum", 1496 | "incididunt", 1497 | "non", 1498 | "eiusmod", 1499 | "ad" 1500 | ] 1501 | }, 1502 | { 1503 | "_id": "57ef9cd86e789f3db59cc997", 1504 | "index": 50, 1505 | "guid": "c24777cb-e9c6-451a-b70b-9ffeefb35ee0", 1506 | "isActive": false, 1507 | "balance": "$1,072.96", 1508 | "picture": "http://placehold.it/32x32", 1509 | "age": 24, 1510 | "eyeColor": "green", 1511 | "name": "Roxie Butler", 1512 | "gender": "female", 1513 | "company": "ISOLOGICA", 1514 | "email": "roxiebutler@isologica.com", 1515 | "phone": "+1 (919) 442-2920", 1516 | "address": { 1517 | "street": "512 Dewey Place", 1518 | "city": "Lacomb", 1519 | "state": "Montana" 1520 | }, 1521 | "registered": "2015-05-26", 1522 | "tags": [ 1523 | "qui", 1524 | "labore", 1525 | "non", 1526 | "quis", 1527 | "id", 1528 | "quis", 1529 | "anim" 1530 | ] 1531 | }, 1532 | { 1533 | "_id": "57ef9cd882f83000536be05a", 1534 | "index": 51, 1535 | "guid": "2798139e-b8ec-409e-aa87-613149059143", 1536 | "isActive": false, 1537 | "balance": "$3,771.00", 1538 | "picture": "http://placehold.it/32x32", 1539 | "age": 38, 1540 | "eyeColor": "blue", 1541 | "name": "Margie Davenport", 1542 | "gender": "female", 1543 | "company": "MALATHION", 1544 | "email": "margiedavenport@malathion.com", 1545 | "phone": "+1 (976) 567-3933", 1546 | "address": { 1547 | "street": "241 Lloyd Court", 1548 | "city": "Stockwell", 1549 | "state": "Puerto Rico" 1550 | }, 1551 | "registered": "2016-04-05", 1552 | "tags": [ 1553 | "et", 1554 | "reprehenderit", 1555 | "dolor", 1556 | "consequat", 1557 | "sit", 1558 | "qui", 1559 | "mollit" 1560 | ] 1561 | }, 1562 | { 1563 | "_id": "57ef9cd8199466c0f80eaef0", 1564 | "index": 52, 1565 | "guid": "0d8ea36b-df98-4b07-952a-4cbac7c92c64", 1566 | "isActive": false, 1567 | "balance": "$2,047.61", 1568 | "picture": "http://placehold.it/32x32", 1569 | "age": 31, 1570 | "eyeColor": "brown", 1571 | "name": "Zelma Macias", 1572 | "gender": "female", 1573 | "company": "ECLIPSENT", 1574 | "email": "zelmamacias@eclipsent.com", 1575 | "phone": "+1 (893) 522-3991", 1576 | "address": { 1577 | "street": "812 Morgan Avenue", 1578 | "city": "Moquino", 1579 | "state": "Minnesota" 1580 | }, 1581 | "registered": "2014-03-14", 1582 | "tags": [ 1583 | "quis", 1584 | "aliquip", 1585 | "occaecat", 1586 | "ut", 1587 | "duis", 1588 | "est", 1589 | "Lorem" 1590 | ] 1591 | }, 1592 | { 1593 | "_id": "57ef9cd8e332fa4683ed0ef2", 1594 | "index": 53, 1595 | "guid": "992c8935-6934-4b46-be34-bb81f596d0cc", 1596 | "isActive": true, 1597 | "balance": "$3,363.81", 1598 | "picture": "http://placehold.it/32x32", 1599 | "age": 32, 1600 | "eyeColor": "blue", 1601 | "name": "Dominique Best", 1602 | "gender": "female", 1603 | "company": "SNOWPOKE", 1604 | "email": "dominiquebest@snowpoke.com", 1605 | "phone": "+1 (941) 596-2718", 1606 | "address": { 1607 | "street": "851 Turnbull Avenue", 1608 | "city": "Ruffin", 1609 | "state": "Wisconsin" 1610 | }, 1611 | "registered": "2016-03-04", 1612 | "tags": [ 1613 | "magna", 1614 | "velit", 1615 | "Lorem", 1616 | "culpa", 1617 | "mollit", 1618 | "adipisicing", 1619 | "eu" 1620 | ] 1621 | }, 1622 | { 1623 | "_id": "57ef9cd8b65cc853f277c21a", 1624 | "index": 54, 1625 | "guid": "8f690f7b-cdc8-4c84-b928-44fe3e7bc4b4", 1626 | "isActive": false, 1627 | "balance": "$3,463.40", 1628 | "picture": "http://placehold.it/32x32", 1629 | "age": 39, 1630 | "eyeColor": "blue", 1631 | "name": "Meyers Navarro", 1632 | "gender": "male", 1633 | "company": "VALREDA", 1634 | "email": "meyersnavarro@valreda.com", 1635 | "phone": "+1 (969) 596-2487", 1636 | "address": { 1637 | "street": "692 Lake Street", 1638 | "city": "Marienthal", 1639 | "state": "Guam" 1640 | }, 1641 | "registered": "2015-06-22", 1642 | "tags": [ 1643 | "mollit", 1644 | "laboris", 1645 | "deserunt", 1646 | "sit", 1647 | "excepteur", 1648 | "ut", 1649 | "ut" 1650 | ] 1651 | }, 1652 | { 1653 | "_id": "57ef9cd88d03578a7c15a598", 1654 | "index": 55, 1655 | "guid": "46cd7eac-1353-4bd2-99cc-2a9b5264a966", 1656 | "isActive": false, 1657 | "balance": "$1,911.65", 1658 | "picture": "http://placehold.it/32x32", 1659 | "age": 24, 1660 | "eyeColor": "green", 1661 | "name": "Holland Hess", 1662 | "gender": "male", 1663 | "company": "IDEALIS", 1664 | "email": "hollandhess@idealis.com", 1665 | "phone": "+1 (867) 599-2608", 1666 | "address": { 1667 | "street": "934 Stoddard Place", 1668 | "city": "Frizzleburg", 1669 | "state": "Nebraska" 1670 | }, 1671 | "registered": "2015-02-19", 1672 | "tags": [ 1673 | "dolor", 1674 | "sint", 1675 | "ipsum", 1676 | "ex", 1677 | "et", 1678 | "aute", 1679 | "elit" 1680 | ] 1681 | }, 1682 | { 1683 | "_id": "57ef9cd8a1f6180aec4821e5", 1684 | "index": 56, 1685 | "guid": "eb23120a-a47d-499d-a3a5-9a5cc0d40233", 1686 | "isActive": true, 1687 | "balance": "$3,547.64", 1688 | "picture": "http://placehold.it/32x32", 1689 | "age": 25, 1690 | "eyeColor": "brown", 1691 | "name": "Mckay Fields", 1692 | "gender": "male", 1693 | "company": "SLAX", 1694 | "email": "mckayfields@slax.com", 1695 | "phone": "+1 (802) 483-2694", 1696 | "address": { 1697 | "street": "595 Jerome Street", 1698 | "city": "Oneida", 1699 | "state": "Utah" 1700 | }, 1701 | "registered": "2014-11-18", 1702 | "tags": [ 1703 | "reprehenderit", 1704 | "pariatur", 1705 | "aliquip", 1706 | "ullamco", 1707 | "veniam", 1708 | "labore", 1709 | "velit" 1710 | ] 1711 | }, 1712 | { 1713 | "_id": "57ef9cd8c473ecd605a3b6ca", 1714 | "index": 57, 1715 | "guid": "84c4fe9c-6917-49ce-a7a4-71ba9a7cba69", 1716 | "isActive": true, 1717 | "balance": "$1,731.31", 1718 | "picture": "http://placehold.it/32x32", 1719 | "age": 39, 1720 | "eyeColor": "blue", 1721 | "name": "Melanie Austin", 1722 | "gender": "female", 1723 | "company": "ANDRYX", 1724 | "email": "melanieaustin@andryx.com", 1725 | "phone": "+1 (994) 412-2994", 1726 | "address": { 1727 | "street": "533 Saratoga Avenue", 1728 | "city": "Bangor", 1729 | "state": "Georgia" 1730 | }, 1731 | "registered": "2014-03-09", 1732 | "tags": [ 1733 | "mollit", 1734 | "minim", 1735 | "in", 1736 | "in", 1737 | "Lorem", 1738 | "magna", 1739 | "non" 1740 | ] 1741 | }, 1742 | { 1743 | "_id": "57ef9cd891a61ccfd176aeef", 1744 | "index": 58, 1745 | "guid": "80295d78-5ce6-4dfe-b945-50e2ce602b44", 1746 | "isActive": true, 1747 | "balance": "$2,992.55", 1748 | "picture": "http://placehold.it/32x32", 1749 | "age": 25, 1750 | "eyeColor": "blue", 1751 | "name": "Peck Schneider", 1752 | "gender": "male", 1753 | "company": "COFINE", 1754 | "email": "peckschneider@cofine.com", 1755 | "phone": "+1 (913) 428-3201", 1756 | "address": { 1757 | "street": "441 Harbor Lane", 1758 | "city": "Tolu", 1759 | "state": "Pennsylvania" 1760 | }, 1761 | "registered": "2016-05-29", 1762 | "tags": [ 1763 | "Lorem", 1764 | "voluptate", 1765 | "ipsum", 1766 | "dolore", 1767 | "aliquip", 1768 | "ad", 1769 | "consequat" 1770 | ] 1771 | }, 1772 | { 1773 | "_id": "57ef9cd8e58b17c583b460a7", 1774 | "index": 59, 1775 | "guid": "0b18fc0c-f18f-46e3-845a-cd7b15c55865", 1776 | "isActive": false, 1777 | "balance": "$1,502.40", 1778 | "picture": "http://placehold.it/32x32", 1779 | "age": 23, 1780 | "eyeColor": "green", 1781 | "name": "Mcclain Rhodes", 1782 | "gender": "male", 1783 | "company": "RODEOCEAN", 1784 | "email": "mcclainrhodes@rodeocean.com", 1785 | "phone": "+1 (842) 446-2464", 1786 | "address": { 1787 | "street": "374 Amersfort Place", 1788 | "city": "Romeville", 1789 | "state": "Maine" 1790 | }, 1791 | "registered": "2014-03-19", 1792 | "tags": [ 1793 | "dolor", 1794 | "eiusmod", 1795 | "ad", 1796 | "voluptate", 1797 | "ea", 1798 | "deserunt", 1799 | "et" 1800 | ] 1801 | }, 1802 | { 1803 | "_id": "57ef9cd8724c03c5ad8e4a8e", 1804 | "index": 60, 1805 | "guid": "326dce0c-4b47-499b-9489-36acd6dadff8", 1806 | "isActive": true, 1807 | "balance": "$1,747.38", 1808 | "picture": "http://placehold.it/32x32", 1809 | "age": 25, 1810 | "eyeColor": "blue", 1811 | "name": "Cervantes Bright", 1812 | "gender": "male", 1813 | "company": "VALPREAL", 1814 | "email": "cervantesbright@valpreal.com", 1815 | "phone": "+1 (873) 587-2025", 1816 | "address": { 1817 | "street": "132 Bliss Terrace", 1818 | "city": "Winesburg", 1819 | "state": "American Samoa" 1820 | }, 1821 | "registered": "2016-03-18", 1822 | "tags": [ 1823 | "magna", 1824 | "dolore", 1825 | "veniam", 1826 | "veniam", 1827 | "sint", 1828 | "quis", 1829 | "id" 1830 | ] 1831 | }, 1832 | { 1833 | "_id": "57ef9cd8b398ed2934e4a722", 1834 | "index": 61, 1835 | "guid": "4b744dd7-3c86-4bce-a3c8-9eb4359ceed5", 1836 | "isActive": false, 1837 | "balance": "$3,697.92", 1838 | "picture": "http://placehold.it/32x32", 1839 | "age": 34, 1840 | "eyeColor": "blue", 1841 | "name": "Hardin Pittman", 1842 | "gender": "male", 1843 | "company": "SKINSERVE", 1844 | "email": "hardinpittman@skinserve.com", 1845 | "phone": "+1 (887) 454-3837", 1846 | "address": { 1847 | "street": "617 Robert Street", 1848 | "city": "Stevens", 1849 | "state": "Oregon" 1850 | }, 1851 | "registered": "2015-04-25", 1852 | "tags": [ 1853 | "sit", 1854 | "anim", 1855 | "proident", 1856 | "minim", 1857 | "adipisicing", 1858 | "duis", 1859 | "cillum" 1860 | ] 1861 | }, 1862 | { 1863 | "_id": "57ef9cd89a9aa77a634b1a47", 1864 | "index": 62, 1865 | "guid": "971cfb58-9d8e-4a06-ab1c-c6bc120c1865", 1866 | "isActive": false, 1867 | "balance": "$1,121.41", 1868 | "picture": "http://placehold.it/32x32", 1869 | "age": 35, 1870 | "eyeColor": "blue", 1871 | "name": "Anna Ortega", 1872 | "gender": "female", 1873 | "company": "PHUEL", 1874 | "email": "annaortega@phuel.com", 1875 | "phone": "+1 (887) 422-3308", 1876 | "address": { 1877 | "street": "809 Vandervoort Place", 1878 | "city": "Gibsonia", 1879 | "state": "Connecticut" 1880 | }, 1881 | "registered": "2016-06-11", 1882 | "tags": [ 1883 | "veniam", 1884 | "commodo", 1885 | "incididunt", 1886 | "commodo", 1887 | "ut", 1888 | "irure", 1889 | "aliqua" 1890 | ] 1891 | }, 1892 | { 1893 | "_id": "57ef9cd8d4ea52c7b0fce734", 1894 | "index": 63, 1895 | "guid": "3e62c184-2c7d-4620-be08-4a10ac9f1bce", 1896 | "isActive": true, 1897 | "balance": "$3,080.98", 1898 | "picture": "http://placehold.it/32x32", 1899 | "age": 37, 1900 | "eyeColor": "brown", 1901 | "name": "Juliana Rios", 1902 | "gender": "female", 1903 | "company": "FIREWAX", 1904 | "email": "julianarios@firewax.com", 1905 | "phone": "+1 (978) 409-2654", 1906 | "address": { 1907 | "street": "893 Heyward Street", 1908 | "city": "Fedora", 1909 | "state": "Mississippi" 1910 | }, 1911 | "registered": "2015-07-21", 1912 | "tags": [ 1913 | "sit", 1914 | "sint", 1915 | "eu", 1916 | "quis", 1917 | "do", 1918 | "mollit", 1919 | "magna" 1920 | ] 1921 | }, 1922 | { 1923 | "_id": "57ef9cd8faa17dc8818830e9", 1924 | "index": 64, 1925 | "guid": "d3de53e8-6012-43ea-8c6b-1546739f9455", 1926 | "isActive": true, 1927 | "balance": "$3,162.09", 1928 | "picture": "http://placehold.it/32x32", 1929 | "age": 24, 1930 | "eyeColor": "green", 1931 | "name": "Allison Collier", 1932 | "gender": "male", 1933 | "company": "ISOLOGICS", 1934 | "email": "allisoncollier@isologics.com", 1935 | "phone": "+1 (961) 458-2654", 1936 | "address": { 1937 | "street": "987 Story Street", 1938 | "city": "Fairview", 1939 | "state": "Hawaii" 1940 | }, 1941 | "registered": "2014-04-11", 1942 | "tags": [ 1943 | "nulla", 1944 | "labore", 1945 | "anim", 1946 | "tempor", 1947 | "enim", 1948 | "aliqua", 1949 | "culpa" 1950 | ] 1951 | }, 1952 | { 1953 | "_id": "57ef9cd8414f04a3dafce7ef", 1954 | "index": 65, 1955 | "guid": "d45fc8d9-2f09-42cf-918c-5d9c9b9049fb", 1956 | "isActive": false, 1957 | "balance": "$2,228.33", 1958 | "picture": "http://placehold.it/32x32", 1959 | "age": 33, 1960 | "eyeColor": "brown", 1961 | "name": "Laurel Raymond", 1962 | "gender": "female", 1963 | "company": "FREAKIN", 1964 | "email": "laurelraymond@freakin.com", 1965 | "phone": "+1 (845) 411-2269", 1966 | "address": { 1967 | "street": "270 Alice Court", 1968 | "city": "Bynum", 1969 | "state": "Colorado" 1970 | }, 1971 | "registered": "2014-09-18", 1972 | "tags": [ 1973 | "sit", 1974 | "dolore", 1975 | "eiusmod", 1976 | "dolor", 1977 | "aliquip", 1978 | "est", 1979 | "reprehenderit" 1980 | ] 1981 | }, 1982 | { 1983 | "_id": "57ef9cd8e744f8d49ef6d406", 1984 | "index": 66, 1985 | "guid": "8fd91938-f5a5-409d-8a97-bf4e683d76a1", 1986 | "isActive": true, 1987 | "balance": "$3,892.91", 1988 | "picture": "http://placehold.it/32x32", 1989 | "age": 38, 1990 | "eyeColor": "brown", 1991 | "name": "Althea Horn", 1992 | "gender": "female", 1993 | "company": "FILODYNE", 1994 | "email": "altheahorn@filodyne.com", 1995 | "phone": "+1 (950) 526-2536", 1996 | "address": { 1997 | "street": "666 Taylor Street", 1998 | "city": "Driftwood", 1999 | "state": "North Dakota" 2000 | }, 2001 | "registered": "2016-01-13", 2002 | "tags": [ 2003 | "cillum", 2004 | "fugiat", 2005 | "incididunt", 2006 | "sunt", 2007 | "proident", 2008 | "et", 2009 | "amet" 2010 | ] 2011 | }, 2012 | { 2013 | "_id": "57ef9cd80d3bd026a5b14c3d", 2014 | "index": 67, 2015 | "guid": "4a617fa7-dc5a-440a-ab0b-13f6e6ad34fe", 2016 | "isActive": false, 2017 | "balance": "$1,371.59", 2018 | "picture": "http://placehold.it/32x32", 2019 | "age": 22, 2020 | "eyeColor": "blue", 2021 | "name": "Potter Cannon", 2022 | "gender": "male", 2023 | "company": "MONDICIL", 2024 | "email": "pottercannon@mondicil.com", 2025 | "phone": "+1 (913) 431-3765", 2026 | "address": { 2027 | "street": "762 Drew Street", 2028 | "city": "Riceville", 2029 | "state": "Michigan" 2030 | }, 2031 | "registered": "2015-08-31", 2032 | "tags": [ 2033 | "velit", 2034 | "velit", 2035 | "ex", 2036 | "aliqua", 2037 | "consequat", 2038 | "esse", 2039 | "irure" 2040 | ] 2041 | }, 2042 | { 2043 | "_id": "57ef9cd8218b984cbcc2fcee", 2044 | "index": 68, 2045 | "guid": "ebe26092-53b1-4fd9-b48f-37f68a7008b9", 2046 | "isActive": true, 2047 | "balance": "$2,799.55", 2048 | "picture": "http://placehold.it/32x32", 2049 | "age": 23, 2050 | "eyeColor": "brown", 2051 | "name": "Alyson Calhoun", 2052 | "gender": "female", 2053 | "company": "ZEPITOPE", 2054 | "email": "alysoncalhoun@zepitope.com", 2055 | "phone": "+1 (820) 510-3098", 2056 | "address": { 2057 | "street": "804 Rodney Street", 2058 | "city": "Hatteras", 2059 | "state": "Virginia" 2060 | }, 2061 | "registered": "2014-09-25", 2062 | "tags": [ 2063 | "occaecat", 2064 | "officia", 2065 | "enim", 2066 | "eu", 2067 | "ullamco", 2068 | "eu", 2069 | "pariatur" 2070 | ] 2071 | }, 2072 | { 2073 | "_id": "57ef9cd88e11ec366ca17611", 2074 | "index": 69, 2075 | "guid": "2bb46e78-c42a-449c-93b2-204091ec8296", 2076 | "isActive": false, 2077 | "balance": "$3,754.62", 2078 | "picture": "http://placehold.it/32x32", 2079 | "age": 27, 2080 | "eyeColor": "brown", 2081 | "name": "Zimmerman Hudson", 2082 | "gender": "male", 2083 | "company": "OVERPLEX", 2084 | "email": "zimmermanhudson@overplex.com", 2085 | "phone": "+1 (810) 589-3217", 2086 | "address": { 2087 | "street": "710 Lombardy Street", 2088 | "city": "Tampico", 2089 | "state": "New York" 2090 | }, 2091 | "registered": "2015-12-05", 2092 | "tags": [ 2093 | "aute", 2094 | "Lorem", 2095 | "magna", 2096 | "ut", 2097 | "esse", 2098 | "tempor", 2099 | "voluptate" 2100 | ] 2101 | }, 2102 | { 2103 | "_id": "57ef9cd8c663c704beb3ba0f", 2104 | "index": 70, 2105 | "guid": "3fe808f0-0757-4862-93e1-033724b2d61e", 2106 | "isActive": false, 2107 | "balance": "$3,403.56", 2108 | "picture": "http://placehold.it/32x32", 2109 | "age": 38, 2110 | "eyeColor": "green", 2111 | "name": "Sharon Vargas", 2112 | "gender": "female", 2113 | "company": "SYNKGEN", 2114 | "email": "sharonvargas@synkgen.com", 2115 | "phone": "+1 (837) 452-3719", 2116 | "address": { 2117 | "street": "451 Eckford Street", 2118 | "city": "Wyano", 2119 | "state": "South Dakota" 2120 | }, 2121 | "registered": "2015-11-19", 2122 | "tags": [ 2123 | "consectetur", 2124 | "sint", 2125 | "ad", 2126 | "sunt", 2127 | "ea", 2128 | "velit", 2129 | "officia" 2130 | ] 2131 | }, 2132 | { 2133 | "_id": "57ef9cd8c23f68e4099957d1", 2134 | "index": 71, 2135 | "guid": "79f80e61-d92e-4b97-bea7-0016fb3fbcdc", 2136 | "isActive": false, 2137 | "balance": "$1,738.35", 2138 | "picture": "http://placehold.it/32x32", 2139 | "age": 22, 2140 | "eyeColor": "blue", 2141 | "name": "Herman House", 2142 | "gender": "male", 2143 | "company": "FRENEX", 2144 | "email": "hermanhouse@frenex.com", 2145 | "phone": "+1 (928) 579-3978", 2146 | "address": { 2147 | "street": "770 Wyckoff Avenue", 2148 | "city": "Trail", 2149 | "state": "Louisiana" 2150 | }, 2151 | "registered": "2015-03-20", 2152 | "tags": [ 2153 | "elit", 2154 | "voluptate", 2155 | "sint", 2156 | "laboris", 2157 | "et", 2158 | "nisi", 2159 | "ad" 2160 | ] 2161 | }, 2162 | { 2163 | "_id": "57ef9cd8f684a162c8263ed1", 2164 | "index": 72, 2165 | "guid": "3a82a0ae-ffaa-4833-a4c1-1947eaf2a22a", 2166 | "isActive": false, 2167 | "balance": "$3,451.10", 2168 | "picture": "http://placehold.it/32x32", 2169 | "age": 30, 2170 | "eyeColor": "green", 2171 | "name": "Lenore Hahn", 2172 | "gender": "female", 2173 | "company": "EXOSIS", 2174 | "email": "lenorehahn@exosis.com", 2175 | "phone": "+1 (917) 524-3275", 2176 | "address": { 2177 | "street": "838 Gold Street", 2178 | "city": "Watchtower", 2179 | "state": "Rhode Island" 2180 | }, 2181 | "registered": "2015-05-28", 2182 | "tags": [ 2183 | "id", 2184 | "proident", 2185 | "velit", 2186 | "consequat", 2187 | "non", 2188 | "duis", 2189 | "consectetur" 2190 | ] 2191 | }, 2192 | { 2193 | "_id": "57ef9cd8a220db71c82724b6", 2194 | "index": 73, 2195 | "guid": "3715858a-2b15-40b2-bd25-4c5f27f8a242", 2196 | "isActive": false, 2197 | "balance": "$2,007.02", 2198 | "picture": "http://placehold.it/32x32", 2199 | "age": 40, 2200 | "eyeColor": "brown", 2201 | "name": "Mcfadden Stark", 2202 | "gender": "male", 2203 | "company": "GEEKOLA", 2204 | "email": "mcfaddenstark@geekola.com", 2205 | "phone": "+1 (996) 480-2189", 2206 | "address": { 2207 | "street": "422 Livonia Avenue", 2208 | "city": "Allendale", 2209 | "state": "Alabama" 2210 | }, 2211 | "registered": "2016-06-04", 2212 | "tags": [ 2213 | "qui", 2214 | "consequat", 2215 | "mollit", 2216 | "magna", 2217 | "Lorem", 2218 | "officia", 2219 | "reprehenderit" 2220 | ] 2221 | }, 2222 | { 2223 | "_id": "57ef9cd8ce39d98040920aca", 2224 | "index": 74, 2225 | "guid": "015bb1b1-90c7-47a7-8439-1382355e2198", 2226 | "isActive": false, 2227 | "balance": "$2,762.45", 2228 | "picture": "http://placehold.it/32x32", 2229 | "age": 39, 2230 | "eyeColor": "brown", 2231 | "name": "Haney Schwartz", 2232 | "gender": "male", 2233 | "company": "GEOSTELE", 2234 | "email": "haneyschwartz@geostele.com", 2235 | "phone": "+1 (845) 531-2525", 2236 | "address": { 2237 | "street": "308 Poplar Avenue", 2238 | "city": "Wolcott", 2239 | "state": "Palau" 2240 | }, 2241 | "registered": "2016-05-11", 2242 | "tags": [ 2243 | "proident", 2244 | "enim", 2245 | "sunt", 2246 | "laborum", 2247 | "exercitation", 2248 | "dolore", 2249 | "cillum" 2250 | ] 2251 | }, 2252 | { 2253 | "_id": "57ef9cd890c774293d1b0fb4", 2254 | "index": 75, 2255 | "guid": "d073457d-da93-48aa-8c60-02d9d72ef8fb", 2256 | "isActive": false, 2257 | "balance": "$1,206.03", 2258 | "picture": "http://placehold.it/32x32", 2259 | "age": 34, 2260 | "eyeColor": "brown", 2261 | "name": "Bobbie Livingston", 2262 | "gender": "female", 2263 | "company": "CORPULSE", 2264 | "email": "bobbielivingston@corpulse.com", 2265 | "phone": "+1 (836) 495-2861", 2266 | "address": { 2267 | "street": "655 Laurel Avenue", 2268 | "city": "Eastmont", 2269 | "state": "Indiana" 2270 | }, 2271 | "registered": "2015-09-02", 2272 | "tags": [ 2273 | "proident", 2274 | "laboris", 2275 | "ut", 2276 | "exercitation", 2277 | "labore", 2278 | "proident", 2279 | "adipisicing" 2280 | ] 2281 | }, 2282 | { 2283 | "_id": "57ef9cd8e27b869852bce881", 2284 | "index": 76, 2285 | "guid": "8f740d74-174c-4383-bf25-d97b57bae01d", 2286 | "isActive": false, 2287 | "balance": "$2,399.50", 2288 | "picture": "http://placehold.it/32x32", 2289 | "age": 35, 2290 | "eyeColor": "brown", 2291 | "name": "Ball Talley", 2292 | "gender": "male", 2293 | "company": "GOKO", 2294 | "email": "balltalley@goko.com", 2295 | "phone": "+1 (994) 551-2840", 2296 | "address": { 2297 | "street": "271 Hanover Place", 2298 | "city": "Kipp", 2299 | "state": "Iowa" 2300 | }, 2301 | "registered": "2016-04-07", 2302 | "tags": [ 2303 | "nisi", 2304 | "consequat", 2305 | "labore", 2306 | "occaecat", 2307 | "magna", 2308 | "duis", 2309 | "ullamco" 2310 | ] 2311 | }, 2312 | { 2313 | "_id": "57ef9cd8971d5bf7c2ba6a2e", 2314 | "index": 77, 2315 | "guid": "df18fc2c-8480-4396-93ea-4db26c228f7e", 2316 | "isActive": true, 2317 | "balance": "$3,772.45", 2318 | "picture": "http://placehold.it/32x32", 2319 | "age": 20, 2320 | "eyeColor": "brown", 2321 | "name": "Tara Mcknight", 2322 | "gender": "female", 2323 | "company": "COMTENT", 2324 | "email": "taramcknight@comtent.com", 2325 | "phone": "+1 (932) 574-3393", 2326 | "address": { 2327 | "street": "619 Argyle Road", 2328 | "city": "Roulette", 2329 | "state": "Northern Mariana Islands" 2330 | }, 2331 | "registered": "2015-11-21", 2332 | "tags": [ 2333 | "reprehenderit", 2334 | "occaecat", 2335 | "culpa", 2336 | "anim", 2337 | "eiusmod", 2338 | "labore", 2339 | "fugiat" 2340 | ] 2341 | }, 2342 | { 2343 | "_id": "57ef9cd890abec4d44010eea", 2344 | "index": 78, 2345 | "guid": "74ee47e9-0a58-4a57-80d9-98571e613ae0", 2346 | "isActive": true, 2347 | "balance": "$1,971.96", 2348 | "picture": "http://placehold.it/32x32", 2349 | "age": 21, 2350 | "eyeColor": "brown", 2351 | "name": "Ebony Miller", 2352 | "gender": "female", 2353 | "company": "TETRATREX", 2354 | "email": "ebonymiller@tetratrex.com", 2355 | "phone": "+1 (953) 596-3683", 2356 | "address": { 2357 | "street": "451 Landis Court", 2358 | "city": "Elrama", 2359 | "state": "Tennessee" 2360 | }, 2361 | "registered": "2015-05-06", 2362 | "tags": [ 2363 | "reprehenderit", 2364 | "voluptate", 2365 | "ipsum", 2366 | "Lorem", 2367 | "ea", 2368 | "deserunt", 2369 | "duis" 2370 | ] 2371 | }, 2372 | { 2373 | "_id": "57ef9cd8e8a49916e0eef4a3", 2374 | "index": 79, 2375 | "guid": "1a5eb28e-ba61-4abf-95d1-cf69373ac673", 2376 | "isActive": true, 2377 | "balance": "$3,136.92", 2378 | "picture": "http://placehold.it/32x32", 2379 | "age": 35, 2380 | "eyeColor": "green", 2381 | "name": "Sexton James", 2382 | "gender": "male", 2383 | "company": "XLEEN", 2384 | "email": "sextonjames@xleen.com", 2385 | "phone": "+1 (886) 443-3743", 2386 | "address": { 2387 | "street": "565 Dobbin Street", 2388 | "city": "Hessville", 2389 | "state": "District Of Columbia" 2390 | }, 2391 | "registered": "2016-03-23", 2392 | "tags": [ 2393 | "ea", 2394 | "veniam", 2395 | "ut", 2396 | "aute", 2397 | "aliquip", 2398 | "ea", 2399 | "consectetur" 2400 | ] 2401 | }, 2402 | { 2403 | "_id": "57ef9cd89c8e57302ca806f7", 2404 | "index": 80, 2405 | "guid": "ad19546d-5b93-4dd0-a19f-53e4eb4d79aa", 2406 | "isActive": true, 2407 | "balance": "$2,174.53", 2408 | "picture": "http://placehold.it/32x32", 2409 | "age": 40, 2410 | "eyeColor": "brown", 2411 | "name": "Barr Espinoza", 2412 | "gender": "male", 2413 | "company": "PETICULAR", 2414 | "email": "barrespinoza@peticular.com", 2415 | "phone": "+1 (863) 570-3563", 2416 | "address": { 2417 | "street": "492 Underhill Avenue", 2418 | "city": "Gratton", 2419 | "state": "Marshall Islands" 2420 | }, 2421 | "registered": "2016-08-18", 2422 | "tags": [ 2423 | "ullamco", 2424 | "cillum", 2425 | "ullamco", 2426 | "exercitation", 2427 | "irure", 2428 | "esse", 2429 | "aliquip" 2430 | ] 2431 | }, 2432 | { 2433 | "_id": "57ef9cd84211c7823bf419cf", 2434 | "index": 81, 2435 | "guid": "9c75ad58-fbf9-49c3-a3cc-ec0e747cbc2c", 2436 | "isActive": true, 2437 | "balance": "$2,401.76", 2438 | "picture": "http://placehold.it/32x32", 2439 | "age": 29, 2440 | "eyeColor": "green", 2441 | "name": "Christa Lawson", 2442 | "gender": "female", 2443 | "company": "ENTALITY", 2444 | "email": "christalawson@entality.com", 2445 | "phone": "+1 (887) 449-2183", 2446 | "address": { 2447 | "street": "625 Grafton Street", 2448 | "city": "Cresaptown", 2449 | "state": "Florida" 2450 | }, 2451 | "registered": "2014-03-09", 2452 | "tags": [ 2453 | "in", 2454 | "ea", 2455 | "elit", 2456 | "sit", 2457 | "elit", 2458 | "laboris", 2459 | "labore" 2460 | ] 2461 | }, 2462 | { 2463 | "_id": "57ef9cd8deb2a837eee99361", 2464 | "index": 82, 2465 | "guid": "439349b3-b4e5-4e22-b074-d3d8d053986c", 2466 | "isActive": true, 2467 | "balance": "$3,718.44", 2468 | "picture": "http://placehold.it/32x32", 2469 | "age": 38, 2470 | "eyeColor": "blue", 2471 | "name": "Carla Gray", 2472 | "gender": "female", 2473 | "company": "NETPLODE", 2474 | "email": "carlagray@netplode.com", 2475 | "phone": "+1 (831) 547-3290", 2476 | "address": { 2477 | "street": "129 Mill Street", 2478 | "city": "Austinburg", 2479 | "state": "Texas" 2480 | }, 2481 | "registered": "2014-03-23", 2482 | "tags": [ 2483 | "non", 2484 | "tempor", 2485 | "eu", 2486 | "ipsum", 2487 | "voluptate", 2488 | "exercitation", 2489 | "officia" 2490 | ] 2491 | }, 2492 | { 2493 | "_id": "57ef9cd846d6320f8ee38cd6", 2494 | "index": 83, 2495 | "guid": "ff535f76-d5ed-4d07-9e5d-1426a6a649f1", 2496 | "isActive": true, 2497 | "balance": "$2,427.75", 2498 | "picture": "http://placehold.it/32x32", 2499 | "age": 23, 2500 | "eyeColor": "blue", 2501 | "name": "Aurora Banks", 2502 | "gender": "female", 2503 | "company": "BEDDER", 2504 | "email": "aurorabanks@bedder.com", 2505 | "phone": "+1 (936) 433-3077", 2506 | "address": { 2507 | "street": "498 Louis Place", 2508 | "city": "Canby", 2509 | "state": "South Carolina" 2510 | }, 2511 | "registered": "2015-08-29", 2512 | "tags": [ 2513 | "eu", 2514 | "mollit", 2515 | "et", 2516 | "mollit", 2517 | "laborum", 2518 | "incididunt", 2519 | "aute" 2520 | ] 2521 | }, 2522 | { 2523 | "_id": "57ef9cd893f2a82424d8f6ee", 2524 | "index": 84, 2525 | "guid": "8b007ae2-3474-4eff-bdad-17cd7c378867", 2526 | "isActive": true, 2527 | "balance": "$2,206.37", 2528 | "picture": "http://placehold.it/32x32", 2529 | "age": 28, 2530 | "eyeColor": "green", 2531 | "name": "Ruth Maxwell", 2532 | "gender": "female", 2533 | "company": "ZEAM", 2534 | "email": "ruthmaxwell@zeam.com", 2535 | "phone": "+1 (831) 492-3070", 2536 | "address": { 2537 | "street": "106 Utica Avenue", 2538 | "city": "Norfolk", 2539 | "state": "Nevada" 2540 | }, 2541 | "registered": "2015-11-12", 2542 | "tags": [ 2543 | "consectetur", 2544 | "aliqua", 2545 | "sit", 2546 | "magna", 2547 | "voluptate", 2548 | "esse", 2549 | "non" 2550 | ] 2551 | }, 2552 | { 2553 | "_id": "57ef9cd8f8c3e6032c08eab0", 2554 | "index": 85, 2555 | "guid": "b9872ffe-a6dc-4525-ac91-75b356a43ac2", 2556 | "isActive": false, 2557 | "balance": "$1,234.70", 2558 | "picture": "http://placehold.it/32x32", 2559 | "age": 20, 2560 | "eyeColor": "brown", 2561 | "name": "Mayer Edwards", 2562 | "gender": "male", 2563 | "company": "POWERNET", 2564 | "email": "mayeredwards@powernet.com", 2565 | "phone": "+1 (823) 411-3607", 2566 | "address": { 2567 | "street": "539 Jay Street", 2568 | "city": "Sena", 2569 | "state": "Delaware" 2570 | }, 2571 | "registered": "2015-06-07", 2572 | "tags": [ 2573 | "officia", 2574 | "occaecat", 2575 | "proident", 2576 | "Lorem", 2577 | "aute", 2578 | "et", 2579 | "sit" 2580 | ] 2581 | }, 2582 | { 2583 | "_id": "57ef9cd886542a15d66dc2a6", 2584 | "index": 86, 2585 | "guid": "a959a4e6-7e0c-41a8-912c-c1280609f486", 2586 | "isActive": true, 2587 | "balance": "$1,686.52", 2588 | "picture": "http://placehold.it/32x32", 2589 | "age": 23, 2590 | "eyeColor": "blue", 2591 | "name": "Caroline Bass", 2592 | "gender": "female", 2593 | "company": "ARTWORLDS", 2594 | "email": "carolinebass@artworlds.com", 2595 | "phone": "+1 (932) 419-2973", 2596 | "address": { 2597 | "street": "858 Pershing Loop", 2598 | "city": "Sidman", 2599 | "state": "Kansas" 2600 | }, 2601 | "registered": "2015-04-24", 2602 | "tags": [ 2603 | "ea", 2604 | "veniam", 2605 | "nulla", 2606 | "sint", 2607 | "proident", 2608 | "esse", 2609 | "nisi" 2610 | ] 2611 | }, 2612 | { 2613 | "_id": "57ef9cd8f1adf135eb8b5d4f", 2614 | "index": 87, 2615 | "guid": "1ae041da-fddc-4df5-8485-aff3eacbdcf4", 2616 | "isActive": false, 2617 | "balance": "$2,991.87", 2618 | "picture": "http://placehold.it/32x32", 2619 | "age": 27, 2620 | "eyeColor": "green", 2621 | "name": "Walsh Mccarthy", 2622 | "gender": "male", 2623 | "company": "FARMAGE", 2624 | "email": "walshmccarthy@farmage.com", 2625 | "phone": "+1 (921) 500-3805", 2626 | "address": { 2627 | "street": "930 Banker Street", 2628 | "city": "Nicholson", 2629 | "state": "California" 2630 | }, 2631 | "registered": "2014-10-18", 2632 | "tags": [ 2633 | "laboris", 2634 | "ad", 2635 | "adipisicing", 2636 | "esse", 2637 | "sit", 2638 | "consequat", 2639 | "magna" 2640 | ] 2641 | }, 2642 | { 2643 | "_id": "57ef9cd8e292916e52e972ec", 2644 | "index": 88, 2645 | "guid": "9207f1d2-870c-466e-a1ad-ed2b9af4ad65", 2646 | "isActive": true, 2647 | "balance": "$1,310.82", 2648 | "picture": "http://placehold.it/32x32", 2649 | "age": 37, 2650 | "eyeColor": "brown", 2651 | "name": "Natalie Bond", 2652 | "gender": "female", 2653 | "company": "GYNKO", 2654 | "email": "nataliebond@gynko.com", 2655 | "phone": "+1 (908) 587-2856", 2656 | "address": { 2657 | "street": "698 Madoc Avenue", 2658 | "city": "Outlook", 2659 | "state": "New Jersey" 2660 | }, 2661 | "registered": "2016-03-30", 2662 | "tags": [ 2663 | "aute", 2664 | "magna", 2665 | "eiusmod", 2666 | "est", 2667 | "officia", 2668 | "adipisicing", 2669 | "amet" 2670 | ] 2671 | }, 2672 | { 2673 | "_id": "57ef9cd8ff15e5092584605b", 2674 | "index": 89, 2675 | "guid": "1cf9890d-2d89-4a98-ac4c-488b47f33ec7", 2676 | "isActive": false, 2677 | "balance": "$1,664.41", 2678 | "picture": "http://placehold.it/32x32", 2679 | "age": 32, 2680 | "eyeColor": "green", 2681 | "name": "Watts Kramer", 2682 | "gender": "male", 2683 | "company": "MARKETOID", 2684 | "email": "wattskramer@marketoid.com", 2685 | "phone": "+1 (981) 572-3764", 2686 | "address": { 2687 | "street": "460 Caton Place", 2688 | "city": "Southmont", 2689 | "state": "Wyoming" 2690 | }, 2691 | "registered": "2015-02-16", 2692 | "tags": [ 2693 | "occaecat", 2694 | "sit", 2695 | "amet", 2696 | "non", 2697 | "sit", 2698 | "enim", 2699 | "ex" 2700 | ] 2701 | }, 2702 | { 2703 | "_id": "57ef9cd85d843de02021c7a4", 2704 | "index": 90, 2705 | "guid": "095bf361-65f5-42ae-aa51-1973d6ad6a2c", 2706 | "isActive": true, 2707 | "balance": "$1,981.37", 2708 | "picture": "http://placehold.it/32x32", 2709 | "age": 20, 2710 | "eyeColor": "green", 2711 | "name": "Iva Brady", 2712 | "gender": "female", 2713 | "company": "COMDOM", 2714 | "email": "ivabrady@comdom.com", 2715 | "phone": "+1 (942) 514-2261", 2716 | "address": { 2717 | "street": "525 Hoyts Lane", 2718 | "city": "Waterloo", 2719 | "state": "Massachusetts" 2720 | }, 2721 | "registered": "2015-12-22", 2722 | "tags": [ 2723 | "nisi", 2724 | "quis", 2725 | "adipisicing", 2726 | "et", 2727 | "quis", 2728 | "esse", 2729 | "consequat" 2730 | ] 2731 | }, 2732 | { 2733 | "_id": "57ef9cd8bf5b4c18438c890c", 2734 | "index": 91, 2735 | "guid": "bfb1f645-a63e-4fc0-9a94-a208396e32f7", 2736 | "isActive": true, 2737 | "balance": "$2,694.33", 2738 | "picture": "http://placehold.it/32x32", 2739 | "age": 39, 2740 | "eyeColor": "blue", 2741 | "name": "Estella Moses", 2742 | "gender": "female", 2743 | "company": "UNDERTAP", 2744 | "email": "estellamoses@undertap.com", 2745 | "phone": "+1 (999) 418-3031", 2746 | "address": { 2747 | "street": "127 Liberty Avenue", 2748 | "city": "Roy", 2749 | "state": "Kentucky" 2750 | }, 2751 | "registered": "2014-08-10", 2752 | "tags": [ 2753 | "ipsum", 2754 | "ea", 2755 | "eu", 2756 | "duis", 2757 | "enim", 2758 | "consequat", 2759 | "veniam" 2760 | ] 2761 | }, 2762 | { 2763 | "_id": "57ef9cd895135c80288cf57e", 2764 | "index": 92, 2765 | "guid": "6470c22d-0086-4acf-9fdf-7d1762a17e08", 2766 | "isActive": true, 2767 | "balance": "$3,995.47", 2768 | "picture": "http://placehold.it/32x32", 2769 | "age": 40, 2770 | "eyeColor": "brown", 2771 | "name": "Anthony Knight", 2772 | "gender": "male", 2773 | "company": "EQUICOM", 2774 | "email": "anthonyknight@equicom.com", 2775 | "phone": "+1 (873) 569-3224", 2776 | "address": { 2777 | "street": "654 Greene Avenue", 2778 | "city": "Chamizal", 2779 | "state": "Arizona" 2780 | }, 2781 | "registered": "2014-02-08", 2782 | "tags": [ 2783 | "Lorem", 2784 | "duis", 2785 | "incididunt", 2786 | "nulla", 2787 | "Lorem", 2788 | "dolor", 2789 | "adipisicing" 2790 | ] 2791 | }, 2792 | { 2793 | "_id": "57ef9cd8ca4056877bc2cb23", 2794 | "index": 93, 2795 | "guid": "fc8ea442-c629-42a1-87dd-c58609c0ebdb", 2796 | "isActive": false, 2797 | "balance": "$3,017.70", 2798 | "picture": "http://placehold.it/32x32", 2799 | "age": 40, 2800 | "eyeColor": "blue", 2801 | "name": "Russell Gilliam", 2802 | "gender": "male", 2803 | "company": "BLUEGRAIN", 2804 | "email": "russellgilliam@bluegrain.com", 2805 | "phone": "+1 (996) 465-2053", 2806 | "address": { 2807 | "street": "400 Columbia Place", 2808 | "city": "Summerset", 2809 | "state": "Maryland" 2810 | }, 2811 | "registered": "2015-01-19", 2812 | "tags": [ 2813 | "sit", 2814 | "eu", 2815 | "qui", 2816 | "Lorem", 2817 | "enim", 2818 | "aliquip", 2819 | "enim" 2820 | ] 2821 | }, 2822 | { 2823 | "_id": "57ef9cd8723a1463115cbf16", 2824 | "index": 94, 2825 | "guid": "282ddfb3-7c52-4732-80a2-be8c436ee0c9", 2826 | "isActive": true, 2827 | "balance": "$1,448.23", 2828 | "picture": "http://placehold.it/32x32", 2829 | "age": 35, 2830 | "eyeColor": "brown", 2831 | "name": "Mcmahon Reynolds", 2832 | "gender": "male", 2833 | "company": "PANZENT", 2834 | "email": "mcmahonreynolds@panzent.com", 2835 | "phone": "+1 (877) 512-2213", 2836 | "address": { 2837 | "street": "452 Kathleen Court", 2838 | "city": "Barronett", 2839 | "state": "Illinois" 2840 | }, 2841 | "registered": "2015-04-03", 2842 | "tags": [ 2843 | "qui", 2844 | "in", 2845 | "qui", 2846 | "laboris", 2847 | "et", 2848 | "nulla", 2849 | "id" 2850 | ] 2851 | }, 2852 | { 2853 | "_id": "57ef9cd8d99535859969e271", 2854 | "index": 95, 2855 | "guid": "ac088fe2-019a-4fd7-bd8c-5d21eeb5e731", 2856 | "isActive": false, 2857 | "balance": "$2,204.60", 2858 | "picture": "http://placehold.it/32x32", 2859 | "age": 20, 2860 | "eyeColor": "green", 2861 | "name": "Rosa Myers", 2862 | "gender": "female", 2863 | "company": "LUNCHPAD", 2864 | "email": "rosamyers@lunchpad.com", 2865 | "phone": "+1 (847) 423-3501", 2866 | "address": { 2867 | "street": "913 Trucklemans Lane", 2868 | "city": "Lynn", 2869 | "state": "West Virginia" 2870 | }, 2871 | "registered": "2016-06-10", 2872 | "tags": [ 2873 | "veniam", 2874 | "consectetur", 2875 | "dolor", 2876 | "quis", 2877 | "anim", 2878 | "do", 2879 | "sit" 2880 | ] 2881 | }, 2882 | { 2883 | "_id": "57ef9cd802b0ae83a4ed2495", 2884 | "index": 96, 2885 | "guid": "0507ff39-d0be-4f4d-afc0-01458a66d7a9", 2886 | "isActive": true, 2887 | "balance": "$3,655.93", 2888 | "picture": "http://placehold.it/32x32", 2889 | "age": 28, 2890 | "eyeColor": "brown", 2891 | "name": "Angeline Schroeder", 2892 | "gender": "female", 2893 | "company": "ZORROMOP", 2894 | "email": "angelineschroeder@zorromop.com", 2895 | "phone": "+1 (852) 421-2895", 2896 | "address": { 2897 | "street": "195 Sumpter Street", 2898 | "city": "Washington", 2899 | "state": "Alaska" 2900 | }, 2901 | "registered": "2015-05-21", 2902 | "tags": [ 2903 | "dolor", 2904 | "dolor", 2905 | "nulla", 2906 | "id", 2907 | "mollit", 2908 | "eiusmod", 2909 | "ut" 2910 | ] 2911 | }, 2912 | { 2913 | "_id": "57ef9cd82e8295c9e6edee99", 2914 | "index": 97, 2915 | "guid": "322617dc-ac2f-4076-bec9-7539ec959ad2", 2916 | "isActive": true, 2917 | "balance": "$1,675.25", 2918 | "picture": "http://placehold.it/32x32", 2919 | "age": 24, 2920 | "eyeColor": "brown", 2921 | "name": "Hall Atkinson", 2922 | "gender": "male", 2923 | "company": "UNIA", 2924 | "email": "hallatkinson@unia.com", 2925 | "phone": "+1 (847) 412-2997", 2926 | "address": { 2927 | "street": "864 Pierrepont Street", 2928 | "city": "Caroleen", 2929 | "state": "Oklahoma" 2930 | }, 2931 | "registered": "2016-01-02", 2932 | "tags": [ 2933 | "quis", 2934 | "id", 2935 | "quis", 2936 | "consequat", 2937 | "enim", 2938 | "esse", 2939 | "elit" 2940 | ] 2941 | }, 2942 | { 2943 | "_id": "57ef9cd8864bcc1330fa009c", 2944 | "index": 98, 2945 | "guid": "3c336f09-140a-423b-963d-e49a0864b214", 2946 | "isActive": false, 2947 | "balance": "$2,141.56", 2948 | "picture": "http://placehold.it/32x32", 2949 | "age": 28, 2950 | "eyeColor": "brown", 2951 | "name": "Paulette Sellers", 2952 | "gender": "female", 2953 | "company": "ARCTIQ", 2954 | "email": "paulettesellers@arctiq.com", 2955 | "phone": "+1 (937) 462-3359", 2956 | "address": { 2957 | "street": "130 Ovington Court", 2958 | "city": "Diaperville", 2959 | "state": "Federated States Of Micronesia" 2960 | }, 2961 | "registered": "2014-10-28", 2962 | "tags": [ 2963 | "aliqua", 2964 | "occaecat", 2965 | "ut", 2966 | "dolor", 2967 | "dolor", 2968 | "irure", 2969 | "pariatur" 2970 | ] 2971 | }, 2972 | { 2973 | "_id": "57ef9cd88bbbbcdd7e59618f", 2974 | "index": 99, 2975 | "guid": "6854d791-09f7-46c2-b66c-bcc0ba82d654", 2976 | "isActive": true, 2977 | "balance": "$1,683.05", 2978 | "picture": "http://placehold.it/32x32", 2979 | "age": 31, 2980 | "eyeColor": "brown", 2981 | "name": "Key Black", 2982 | "gender": "male", 2983 | "company": "MAINELAND", 2984 | "email": "keyblack@maineland.com", 2985 | "phone": "+1 (920) 536-2044", 2986 | "address": { 2987 | "street": "326 Melrose Street", 2988 | "city": "Denio", 2989 | "state": "Vermont" 2990 | }, 2991 | "registered": "2016-08-06", 2992 | "tags": [ 2993 | "tempor", 2994 | "enim", 2995 | "elit", 2996 | "cupidatat", 2997 | "ipsum", 2998 | "ipsum", 2999 | "in" 3000 | ] 3001 | } 3002 | ] 3003 | -------------------------------------------------------------------------------- /docs/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: 'VueJs Smart Table', 3 | base: '/vuejs-smart-table/', 4 | description: 'Simple yet powerful Data Table for Vue', 5 | configurewebpack: { 6 | resolve: { 7 | alias: { 8 | 'vue-smart-table': '../../src' 9 | } 10 | } 11 | }, 12 | themeConfig: { 13 | repo: 'tochoromero/vuejs-smart-table', 14 | docsDir: 'docs', 15 | editLinks: true, 16 | sidebarDepth: 1, 17 | sidebar: [ 18 | '/', 19 | 'the-basics/', 20 | 'filtering/', 21 | 'sorting/', 22 | 'pagination/', 23 | 'selection/' 24 | ] 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | Vue Smart Table was created out of the need for a simple highly customizable data table plugin 4 | that could take advantage of Vue's slots. It has no dependencies but Vue and because it 5 | renders as a standard HTML table it is compatible with CSS Frameworks such as Bootstrap and Foundation. 6 | 7 | Out of the box you will get filtering, column sorting, client side pagination and row selection. 8 | 9 | ## Installation 10 | To install simply run 11 | ``` 12 | npm add vuejs-smart-table 13 | ``` 14 | or 15 | ``` 16 | yarn add vuejs-smart-table 17 | ``` 18 | 19 | Then in your `main.js` 20 | ```js 21 | import SmartTable from 'vuejs-smart-table' 22 | 23 | Vue.use(SmartTable) 24 | ``` 25 | This will globally register four Components: `v-table`, `v-th`, `v-tr` and `smart-pagination` 26 | -------------------------------------------------------------------------------- /docs/filtering/README.md: -------------------------------------------------------------------------------- 1 | # Filtering 2 | Smart Table is only on charge of the actual row filtering based on the provided configuration. 3 | The visual aspect of it are in your control, allowing you to use any UI Elements to interact while it frees you 4 | from the actual filtering computation. 5 | 6 | ## Filters 7 | To enable filtering you need to provide the `filters` property on the `v-table` component. 8 | 9 | The `filters` configuration object has the following form: 10 | 11 | ```js 12 | { 13 | name: {value: '', keys: ['name']} 14 | } 15 | ``` 16 | 17 | The entry Key is just for you, so you can reference any of the filters by its name. 18 | It is the entry Value Object what Smart Table will use to perform the filtering. 19 | 20 | ### value 21 | This String is the value of the filter, you would normally bind it to the `v-model` of an input element. As you type, 22 | the rows will be filtered. 23 | 24 | Keep in mind that an empty `value` means there is no filter. 25 | 26 | ### keys 27 | This is an Array of Strings indicating what fields of each row the filter `value` will apply to. 28 | 29 | You must provide at least one key. If more than one key is provided as long as one of the row fields matches the filter, 30 | the row will be displayed. 31 | 32 | #### Example 33 | ```js 34 | import users from './users.json' 35 | 36 | export default { 37 | name: 'BasicFiltering', 38 | data: () => ({ 39 | users, 40 | filters: { 41 | name: { value: '', keys: ['name'] } 42 | } 43 | }) 44 | } 45 | ``` 46 | 47 | ```html 48 | 78 | ``` 79 | 80 | 81 | 82 | ## Custom Filters 83 | You also have the option to provide a custom filter for more complex situations. 84 | A Custom Filter is a function with two arguments: `filterValue` and `row`. 85 | It should return `true` if the row should be displayed and `false` otherwise. 86 | 87 | ### custom 88 | To use a custom filter provide the filtering function on the `custom` property on the filter configuration object: 89 | 90 | ### value 91 | With custom filtering the `value` property is not limited to Strings, you can provide anything as the `value`, 92 | it will just get passed along to your custom function. 93 | 94 | #### Example 95 | ```js 96 | 116 | ``` 117 | 118 | ```html 119 | 161 | ``` 162 | ::: tip 163 | Please think of the `InputSpinner` as a fancy `Input` with validation. The important bit is its `v-model`. 164 | ::: 165 | 166 | 167 | -------------------------------------------------------------------------------- /docs/pagination/README.md: -------------------------------------------------------------------------------- 1 | # Pagination 2 | 3 | Vue Smart Table supports client side pagination. 4 | To enable it, you need to provide the `pageSize` and `currentPage` properties on the `v-table` Component. 5 | 6 | ## Page Size 7 | The `pageSize` property specify the amount of items each page should contain. 8 | If this property is present, client side pagination will be enabled. 9 | 10 | ## Current Page 11 | The `currentPage` property indicates the current active page. 12 | This property should be bound with a `sync` modifier, since the `v-table` itself 13 | may update its value, e.g. if a new filter is applied and the amount of available items decreases 14 | so the current active page is no longer valid. 15 | ::: tip 16 | The `currentPage` property index starts at `1`, 17 | this is to avoid confusion since visually the page links start at `1` not `0`. 18 | ::: 19 | 20 | ## Total pages 21 | The total amount of pages is calculated using the Total Items and the Page Size. 22 | As the Total Items changes the Total Pages will also change and a `totalPagesChanged` event 23 | will be emitted with the new amount as its payload. 24 | 25 | ## Total Items 26 | The total amount of items changes as the Filters change. When it changes `v-table` will emit a `totalItemsChanged` Event. 27 | This event will also be emitted when the `v-table` mounts so it will have the right amount from the start. 28 | 29 | ## Pagination Controls 30 | The pagination controls are handled outside of `v-table`, you can use whatever you want to control it, but we provide 31 | a `SmartPagination` component so you can have it working out of the box. 32 | 33 | The component requires the following properties: 34 | 35 | ### Current Page 36 | This should be the same `currentPage` property used for the `v-table` component 37 | and it should also use the `sync` modifier, that way whenever either of them changes it the other one will be notified. 38 | 39 | ### Total Pages 40 | The `v-table` component emits a `totalPagesChanged` event, when the event happens we should save the event payload and 41 | use it for the `totalPages` property on the `SmartPagination` component. 42 | 43 | ## Example 44 | ```html 45 | 75 | ``` 76 | 77 | ```js 78 | 90 | ``` 91 | 92 | 93 | ## Customizing Smart Pagination 94 | Besides the `currentPage` and `totalPages` properties, there are many others used to configure the behaviour and look 95 | and feel of the pagination controls. 96 | 97 | ### Hide Single Page 98 | Determines whether or not we show the pagination controls when there is only a single page. 99 | 100 | ### Max Page Links 101 | By default we will show every single page link, but you can use the `maxPageLinks` property to limit the amount of visible links. 102 | 103 | ### Boundary Links 104 | Determines whether or not we should show two links to navigate to the First and Last page. 105 | 106 | ### First Text 107 | Specify the text for the First Page link. 108 | 109 | ### Last Text 110 | Specify the text for the Last Page link. 111 | 112 | ### Direction Links 113 | Determines whether or not we should have direction links to navigate back and forth between pages. 114 | 115 | ### CSS Customization 116 | The HTML structure for the Smart Pagination component is as follows: 117 | ```html 118 | 127 | ``` 128 | This structure is compatible with Bootstrap's Pagination. But you can easily customize it with your own Styles. 129 | -------------------------------------------------------------------------------- /docs/selection/README.md: -------------------------------------------------------------------------------- 1 | # Row Selection 2 | 3 | ## Table Row 4 | To enable row selection you need to use the `v-tr` component. It only has one property: `row` 5 | 6 | ### Row 7 | You must provide the `row` property with the current Object for the row. 8 | 9 | ## Selection Options 10 | You can configure the Selection Mode and the Selected Class in the `v-table` component. 11 | 12 | ### Selection Mode 13 | By default the selection mode is `single`, meaning only one row at a time can be selected. 14 | You can use the `selectionMode` property in the `v-table` component to set it to `multiple`, so multiple rows 15 | can be selected. 16 | 17 | ### Selected Class 18 | When a row is selected a class is added to the `tr` element, by default it is `vt-selected` byt you can change it to 19 | something else with the `selectedClass` property in the `v-table` component. 20 | 21 | ## Selection Changed 22 | When the selected items changes the `v-table` component will emit a `selectionChanged` event with the 23 | list of selected items as its payload. 24 | 25 | ## Example 26 | 27 | ```html 28 | 66 | ``` 67 | 68 | ```js 69 | 80 | ``` 81 | 82 | -------------------------------------------------------------------------------- /docs/sorting/README.md: -------------------------------------------------------------------------------- 1 | # Sorting 2 | 3 | To enable column sorting, instead of using vanilla `th` elements we will use `v-th` Components for the columns 4 | that will allow sorting. 5 | 6 | ## Table Header 7 | The `v-th` component renders to a regular `th` element but it allows you to sort the table, it has three properties: 8 | `sortKey`, `customSort` and `defaultSort`. 9 | 10 | ### Sort Key 11 | The `sortKey` property is used to get the Row value we will sort by it can either be a `String` or a `Function`. 12 | 13 | #### String 14 | As a `String`, it represents the path to the property in the Row we want to sort. You can even use nested paths. 15 | ```html 16 | 17 | Name 18 | State 19 | 20 | ``` 21 | 22 | #### Function 23 | If you instead pass a `Function`, we will call it with the current `row` as a parameter and expect to get back 24 | the value used for sorting. 25 | ```html 26 | 27 | Name 28 | 29 | ``` 30 | 31 | ```js 32 | methods: { 33 | nameLength (row) { 34 | return `row.name.length` 35 | } 36 | } 37 | ``` 38 | 39 | Once we have used the `key` property to get the column values, we will compare them. 40 | If the values are number we will just compare them by subtraction. 41 | Otherwise we will call `toString()` on them and compare them with `localCompare`. 42 | 43 | ### Custom Sort 44 | In some cases you need more control over sorting, 45 | for instance if you have a complex object or your sorting depends in two or more values. 46 | For those instances instead of providing a `key` property you can use the `custom` property to provide a sorting function. 47 | 48 | The function will receive the 2 rows being compared and a third parameter with the sort order 49 | where `1` represents ascending and `-1` represents descending. 50 | The function needs to return `1` if the first row is greater, `-1` if the second row is greater 51 | or `0` if they are the same. 52 | 53 | ```html 54 | 55 | Registered 56 | 57 | ``` 58 | 59 | ```js 60 | methods: { 61 | dateSort(a, b) { 62 | let date1 = new Date(a.registered).getTime(); 63 | let date2 = new Date(b.registered).getTime(); 64 | 65 | return date1 - date2; 66 | } 67 | } 68 | ``` 69 | 70 | ### Default Sort 71 | You should provide this for the one column you want the table to be sorted by default. 72 | The possible values are: `asc` for ascending ordering and `desc` for descending order. 73 | 74 | ```html 75 | 76 | Name 77 | 78 | ``` 79 | 80 | ### Example 81 | ```html 82 | 102 | ``` 103 | 104 | ```js 105 | 126 | ``` 127 | 128 | 129 | 130 | ## CSS icons 131 | By default we include three SVG icons to indicate the sorting state of a column. 132 | But you can use CSS Styles to change the sort icons. 133 | 134 | The first thing you need to do is to disable the default sort icons with the `hideSortIcons` property on the `v-table` component: 135 | 136 | ```html 137 | 141 | ... 142 | 143 | ``` 144 | 145 | Then you will get 4 CSS classes for `th` elements with sorting enabled: 146 | 147 | * `vt-sort`: This class is always present, its purpose is to provide a constant CSS class for the columns with sorting. 148 | * `vt-sortable`: This class indicates the column can be sorted and it is present when the column is not currently sorted. 149 | * `vt-asc`: This class indicates the column is being sorted by an ascending order. 150 | * `vt-desc`: This class indicates the column is being sorted by a descending order. 151 | 152 | For this example we will use FontAwesome icons: 153 | 154 | ```css 155 | .vt-sort:before{ 156 | font-family: FontAwesome; 157 | padding-right: 0.5em; 158 | width: 1.28571429em; 159 | display: inline-block; 160 | text-align: center; 161 | } 162 | 163 | .vt-sortable:before{ 164 | content: "\f0dc"; 165 | } 166 | 167 | .vt-asc:before{ 168 | content: "\f160"; 169 | } 170 | 171 | .vt-desc:before{ 172 | content: "\f161"; 173 | } 174 | ``` 175 | 176 | 177 | -------------------------------------------------------------------------------- /docs/the-basics/README.md: -------------------------------------------------------------------------------- 1 | # The Basics 2 | 3 | The main goal for Vue Smart Table is to be intuitive to use while offering powerful features out of the box. 4 | 5 | To achieve this we mix Vue Components and vanilla HTML Elements with the output being the same as a traditional HTML Table. 6 | This will allow you to easily customize your tables with CSS or with a framework such as Bootstrap or Foundation. 7 | 8 | For our examples we decided to use Bootstrap and Font Awesome, but you can use whatever your heart desires. 9 | 10 | Here is the code for the simplest table you can create: 11 | 12 | ```js 13 | 23 | 24 | ``` 25 | 26 | ```html 27 | 49 | ``` 50 | 51 | 52 | 53 | ## Table 54 | 55 | The `v-table` component is the main element of Smart Table, here you will provide most of the configuration and listen for events. 56 | But for now we will just focus on the `data` attribute. 57 | 58 | ### Data 59 | Each `v-table` requires a `data` property, it must be an `array` even if it is initially empty. 60 | Each entry in the array represents a row in the table. 61 | 62 | It is important to note the array will not be mutated by Smart Table, internally it will create a shallow copy of it to perform 63 | the operations. 64 | 65 | ## Head 66 | The `head` slot is for the table `thead`, other than specifying the slot name with `slot="head"` there is nothing special about this. 67 | You just need to provide vanilla `th` elements for each of your columns. 68 | ```html 69 | 70 | Name 71 | Age 72 | ... 73 | 74 | ``` 75 | 76 | ## Body 77 | The `body` slot is for the table `tbody`. This is a scoped slot which provides a `displayData` property. 78 | 79 | ### Display Data 80 | The `display-data` property provided by the `body` scoped slot is a shallow copy of the `data` array provided to the `v-table` component. 81 | 82 | This array has all the plugins applied to it, for example, if filtering is enabled, this array will only contain the rows that pass the filters. 83 | 84 | You will want to use a `v-for` directive to render the `tr` elements, remember, each entry in the `display-data` array represents a row. 85 | 86 | ```html 87 | 88 | 89 | {{ row.name }} 90 | {{ row.age }} 91 | ... 92 | 93 | 94 | ``` 95 | 96 | All right, this is the simplest table you can create, but right now Smart Table is effectively doing nothing you might as well just use a vanilla Html Table. 97 | 98 | Keep browsing to discover how powerful Smart Table is out of the box. 99 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuejs-smart-table", 3 | "keywords": [ 4 | "vue", 5 | "table", 6 | "grid", 7 | "datagrid" 8 | ], 9 | "version": "0.0.8", 10 | "private": false, 11 | "main": "src/main.js", 12 | "author": "Hector Romero Granillo", 13 | "repository": "https://github.com/tochoromero/vuejs-smart-table", 14 | "license": "MIT", 15 | "scripts": { 16 | "build": "vue-cli-service build --target lib --name smart-table src/main.js", 17 | "lint": "vue-cli-service lint", 18 | "test:unit": "vue-cli-service test:unit --reporter mocha-junit-reporter --reporter-options mochaFile=./tests/results/test_results.xml", 19 | "docs:dev": "vuepress dev docs", 20 | "docs:build": "vuepress build docs" 21 | }, 22 | "dependencies": { 23 | "vue": "^2.5.17" 24 | }, 25 | "devDependencies": { 26 | "@fortawesome/fontawesome-free": "^5.6.3", 27 | "@vue/cli-plugin-babel": "^3.1.1", 28 | "@vue/cli-plugin-eslint": "^3.1.5", 29 | "@vue/cli-plugin-unit-mocha": "^3.1.1", 30 | "@vue/cli-service": "^3.1.4", 31 | "@vue/eslint-config-standard": "^4.0.0", 32 | "@vue/test-utils": "^1.0.0-beta.20", 33 | "babel-eslint": "^10.0.1", 34 | "bootstrap": "^4.2.1", 35 | "chai": "^4.1.2", 36 | "eslint": "^5.8.0", 37 | "eslint-plugin-vue": "^5.0.0-0", 38 | "lint-staged": "^7.2.2", 39 | "mocha-junit-reporter": "^1.18.0", 40 | "sass": "^1.30.0", 41 | "sass-loader": "^10.1.0", 42 | "vue-template-compiler": "^2.5.17", 43 | "vuepress": "^0.14.8" 44 | }, 45 | "gitHooks": { 46 | "pre-commit": "lint-staged" 47 | }, 48 | "lint-staged": { 49 | "*.js": [ 50 | "vue-cli-service lint", 51 | "git add" 52 | ], 53 | "*.vue": [ 54 | "vue-cli-service lint", 55 | "git add" 56 | ] 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/SmartPagination.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 178 | 179 | 188 | -------------------------------------------------------------------------------- /src/VTable.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 224 | -------------------------------------------------------------------------------- /src/VTh.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 107 | 108 | 113 | -------------------------------------------------------------------------------- /src/VTr.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 66 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import VTable from './VTable.vue' 2 | import VTh from './VTh.vue' 3 | import VTr from './VTr.vue' 4 | import SmartPagination from './SmartPagination.vue' 5 | 6 | export { 7 | VTable, 8 | VTh, 9 | VTr, 10 | SmartPagination 11 | } 12 | /**/ 13 | export default { 14 | install (Vue) { 15 | Vue.component('v-table', VTable) 16 | Vue.component('v-th', VTh) 17 | Vue.component('v-tr', VTr) 18 | Vue.component('smart-pagination', SmartPagination) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | export default { 2 | data: () => ({ 3 | selectedRows: [], 4 | selectionMode: 'single', 5 | customSelection: null, 6 | selectedClass: null, 7 | hideSortIcons: null, 8 | sortId: null, 9 | sortKey: null, 10 | customSort: null, 11 | sortOrder: null 12 | }), 13 | methods: { 14 | selectRow (row) { 15 | if (this.selectionMode === 'single') { 16 | this.selectedRows = [row] 17 | return 18 | } 19 | 20 | const index = this.selectedRows.indexOf(row) 21 | if (index === -1) { 22 | this.selectedRows.push(row) 23 | } 24 | }, 25 | selectRows (rows) { 26 | for (let row of rows) { 27 | this.selectRow(row) 28 | } 29 | }, 30 | deselectRow (row) { 31 | const index = this.selectedRows.indexOf(row) 32 | 33 | if (index > -1) { 34 | this.selectedRows.splice(index, 1) 35 | } 36 | }, 37 | deselectRows (rows) { 38 | for (let row of rows) { 39 | this.deselectRow(row) 40 | } 41 | }, 42 | selectAll (all) { 43 | this.selectedRows = all 44 | }, 45 | deselectAll () { 46 | this.selectedRows = [] 47 | }, 48 | setSort ({ sortKey, customSort, sortOrder, sortId }) { 49 | this.sortKey = sortKey 50 | this.customSort = customSort 51 | this.sortOrder = sortOrder 52 | this.sortId = sortId 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/table-utils.js: -------------------------------------------------------------------------------- 1 | export function doSort (toSort, sortKey, customSort, sortOrder) { 2 | let local = [...toSort] 3 | 4 | return local.sort((a, b) => { 5 | if (typeof customSort === 'function') { 6 | return customSort(a, b) * sortOrder 7 | } 8 | 9 | let val1 10 | let val2 11 | 12 | if (typeof sortKey === 'function') { 13 | val1 = sortKey(a, sortOrder) 14 | val2 = sortKey(b, sortOrder) 15 | } else { 16 | val1 = getPropertyValue(a, sortKey) 17 | val2 = getPropertyValue(b, sortKey) 18 | } 19 | 20 | if (val1 === null || val1 === undefined) val1 = '' 21 | if (val2 === null || val2 === undefined) val2 = '' 22 | 23 | if (isNumeric(val1) && isNumeric(val2)) { 24 | return (val1 - val2) * sortOrder 25 | } 26 | 27 | const str1 = val1.toString() 28 | const str2 = val2.toString() 29 | 30 | return str1.localeCompare(str2) * sortOrder 31 | }) 32 | } 33 | 34 | export function doFilter (toFilter, filters) { 35 | let filteredData = [] 36 | 37 | for (let item of toFilter) { 38 | let passed = true 39 | 40 | for (let filterName in filters) { 41 | if (!filters.hasOwnProperty(filterName)) { 42 | continue 43 | } 44 | 45 | let filter = filters[filterName] 46 | 47 | if (!passFilter(item, filter)) { 48 | passed = false 49 | break 50 | } 51 | } 52 | 53 | if (passed) { 54 | filteredData.push(item) 55 | } 56 | } 57 | 58 | return filteredData 59 | } 60 | 61 | export function doPaginate (toPaginate, pageSize, currentPage) { 62 | if (toPaginate.length <= pageSize || pageSize <= 0 || currentPage <= 0) { 63 | return toPaginate 64 | } 65 | 66 | const start = (currentPage - 1) * pageSize 67 | const end = start + pageSize 68 | 69 | return [...toPaginate].slice(start, end) 70 | } 71 | 72 | export function calculateTotalPages (totalItems, pageSize) { 73 | return totalItems <= pageSize ? 1 : Math.ceil(totalItems / pageSize) 74 | } 75 | 76 | export function passFilter (item, filter) { 77 | if (typeof filter.custom === 'function' && !filter.custom(filter.value, item)) { 78 | return false 79 | } 80 | 81 | if (filter.value === null || filter.value === undefined || filter.value.length === 0 || !Array.isArray(filter.keys)) { 82 | return true 83 | } 84 | 85 | for (let key of filter.keys) { 86 | const value = getPropertyValue(item, key) 87 | 88 | if (value !== null && value !== undefined) { 89 | const filterStrings = Array.isArray(filter.value) ? filter.value : [filter.value] 90 | 91 | for (const filterString of filterStrings) { 92 | if (filter.exact) { 93 | if (value.toString() === filterString.toString()) { 94 | return true 95 | } 96 | } else { 97 | if (value.toString().toLowerCase().includes(filterString.toString().toLowerCase())) { 98 | return true 99 | } 100 | } 101 | } 102 | } 103 | } 104 | return false 105 | } 106 | 107 | export function getPropertyValue (object, keyPath) { 108 | keyPath = keyPath.replace(/\[(\w+)\]/g, '.$1') 109 | keyPath = keyPath.replace(/^\./, '') 110 | const a = keyPath.split('.') 111 | for (let i = 0, n = a.length; i < n; ++i) { 112 | let k = a[i] 113 | if (k in object) { 114 | object = object[k] 115 | } else { 116 | return 117 | } 118 | } 119 | return object 120 | } 121 | 122 | export function isNumeric (toCheck) { 123 | return !Array.isArray(toCheck) && !isNaN(parseFloat(toCheck)) && isFinite(toCheck) 124 | } 125 | 126 | export function uuid () { 127 | return '_' + Math.random().toString(36).substr(2, 9) 128 | } 129 | -------------------------------------------------------------------------------- /tests/unit/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | mocha: true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /tests/unit/table-utils.spec.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { calculateTotalPages, isNumeric, getPropertyValue, doPaginate } from '../../src/table-utils.js' 3 | 4 | let scenario = [ 5 | { totalItems: 10, pageSize: 5, result: 2 }, 6 | { totalItems: 1, pageSize: 10, result: 1 }, 7 | { totalItems: 11, pageSize: 10, result: 2 }, 8 | { totalItems: 200, pageSize: 200, result: 1 }, 9 | { totalItems: 200, pageSize: 1, result: 200 } 10 | ] 11 | 12 | scenario.forEach(({ totalItems, pageSize, result }) => { 13 | describe('calculateTotalPages', () => { 14 | it(`Should be ${result} pages when totalItems is ${totalItems} and pageSize: is ${pageSize}`, () => { 15 | expect(calculateTotalPages(totalItems, pageSize)) 16 | .to.equal(result) 17 | }) 18 | }) 19 | }) 20 | 21 | scenario = [ 22 | { toCheck: 5, result: true }, 23 | { toCheck: 1.0, result: true }, 24 | { toCheck: -1.0, result: true }, 25 | // eslint-disable-next-line no-floating-decimal 26 | { toCheck: .5, result: true }, 27 | { toCheck: 0.8, result: true }, 28 | { toCheck: '0.5', result: true }, 29 | { toCheck: '-0.5', result: true }, 30 | { toCheck: 'asd', result: false }, 31 | { toCheck: '5,2', result: false }, 32 | { toCheck: [1], result: false }, 33 | { toCheck: [], result: false }, 34 | { toCheck: { value: 1 }, result: false } 35 | ] 36 | 37 | scenario.forEach(({ toCheck, result }) => { 38 | describe('isNumeric', () => { 39 | it(`${toCheck} should ${result ? '' : 'not'} be numeric`, () => { 40 | expect(isNumeric(toCheck)) 41 | .to.equal(result) 42 | }) 43 | }) 44 | }) 45 | 46 | scenario = [ 47 | { object: { value: 'asd', values: 123 }, path: 'value', result: 'asd' }, 48 | { object: { value: 'asd', values: 123 }, path: '[value]', result: 'asd' }, 49 | { object: { a: { b: { c: 13 } } }, path: 'a.b.c', result: 13 }, 50 | { object: { a: { b: { c: 13 } } }, path: 'a[b].c', result: 13 }, 51 | { object: { value: 'asd' }, path: 'none', result: undefined }, 52 | { object: {}, path: 'empty', result: undefined } 53 | ] 54 | 55 | scenario.forEach(({ object, path, result }) => { 56 | describe('getPropertyValue', () => { 57 | it(`path '${path}' should be ${result}`, () => { 58 | expect(getPropertyValue(object, path)) 59 | .to.equal(result) 60 | }) 61 | }) 62 | }) 63 | 64 | let toPaginate = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 65 | scenario = [ 66 | { pageSize: 3, currentPage: 1, result: [1, 2, 3] }, 67 | { pageSize: 5, currentPage: 2, result: [6, 7, 8, 9, 10] }, 68 | { pageSize: 2, currentPage: 3, result: [5, 6] }, 69 | { pageSize: 5, currentPage: 3, result: [] }, 70 | { pageSize: 50, currentPage: 1, result: toPaginate }, 71 | { pageSize: 0, currentPage: 1, result: toPaginate }, 72 | { pageSize: 5, currentPage: 0, result: toPaginate } 73 | ] 74 | 75 | scenario.forEach(({ pageSize, currentPage, result }) => { 76 | describe('doPaginate', () => { 77 | it(`With size: ${pageSize} and currentPage: ${currentPage} it should return ${result}`, () => { 78 | expect(doPaginate(toPaginate, pageSize, currentPage)) 79 | .to.eql(result) 80 | }) 81 | }) 82 | }) 83 | --------------------------------------------------------------------------------