Here is a flow to get a dynamic table with sortable columns, a searchbar and outputs the clicked row data:
Enjoy!
[{"id":"ee4d312b.cc342","type":"ui_template","z":"95993933.d7c978","group":"18e6e44c.b0561c","name":"Search Sortable Table","order":1,"width":"6","height":"5","format":"<style>\n\ntable {\n color: #333;\n font-family: Helvetica, Arial, sans-serif;\n width: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd, th {\n border: 1px solid transparent;\n /* No more visible border */\n height: 30px;\n transition: all 0.3s;\n /* Simple transition for hover effect */\n}\nth {\n background: #DFDFDF;\n /* Darken header a bit */\n font-weight: bold;\n}\ntd {\n background: #FAFAFA;\n}\n\n/* Cells in even rows (2,4,6...) are one color */\n\ntr:nth-child(even) td {\n background: #F1F1F1;\n}\n\n/* Cells in odd rows (1,3,5...) are another (excludes header cells) */\n\ntr:nth-child(odd) td {\n background: #FEFEFE;\n}\ntr td:hover {\n background: #666;\n color: #FFF;\n}\n\n/* Hover cell effect! */\n \n.animate-enter, \n.animate-leave\n{ \n -webkit-transition: 400ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n -moz-transition: 400ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n -ms-transition: 400ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n -o-transition: 400ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n transition: 400ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;\n position: relative;\n display: block;\n} \n\n.animate-enter.animate-enter-active, \n.animate-leave {\n opacity: 1;\n top: 0;\n height: 30px;\n}\n\n.animate-leave.animate-leave-active,\n.animate-enter {\n opacity: 0;\n top: -50px;\n height: 0px;\n}\n \n.container\n{\n max-height: 450px;\n overflow-y: scroll;\n overflow-x: hidden;\n}\n</style>\n\n<div>\n <form>\n <span class=\"input-group\">\n <i class=\"fa fa-search\"></i>\n <input type=\"text\" class=\"form-control\" placeholder=\"Search\" ng-model=\"search\">\n </span> \n </form>\n <div class=\"container\" ng-app=\"sortApp\">\n\n <table>\n <thead>\n <tr style=\"width:100%\">\n <td>\n <a href=\"#\">\n Index\n </a>\n </td>\n <td>\n <a href=\"#\" ng-click=\"sortType = 'firstname'; sortReverse = !sortReverse\">\n First Name \n <span ng-show=\"sortType == 'firstname' && !sortReverse\" class=\"fa fa-caret-down\"></span>\n <span ng-show=\"sortType == 'firstname' && sortReverse\" class=\"fa fa-caret-up\"></span>\n </a>\n </td>\n <td>\n <a href=\"#\" ng-click=\"sortType = 'lastname'; sortReverse = !sortReverse\">\n Last Name \n <span ng-show=\"sortType == 'lastname' && !sortReverse\" class=\"fa fa-caret-down\"></span>\n <span ng-show=\"sortType == 'lastname' && sortReverse\" class=\"fa fa-caret-up\"></span>\n </a>\n </td>\n <td>\n <a href=\"#\" ng-click=\"sortType = '(age -0)'; sortReverse = !sortReverse\">\n Age\n <span ng-show=\"sortType == '(age -0)' && !sortReverse\" class=\"fa fa-caret-down\"></span>\n <span ng-show=\"sortType == '(age -0)' && sortReverse\" class=\"fa fa-caret-up\"></span>\n </a>\n </td>\n\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat=\"user in msg.options | orderBy:sortType:sortReverse | filter:search track by $index\" ng-click=\"msg.payload = user;send(msg);\" style=\"width:100%\" flex>\n <td><b ng-bind=\"$index+1\"></b></td>\n <td ng-bind=\"user.firstname\"></td>\n <td ng-bind=\"user.lastname\"></td>\n <td ng-bind=\"user.age\"></td>\n </tr>\n </tbody>\n </table>\n\n</div>\n</div>\n</body></html>","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":880,"y":2180,"wires":[["e91124.de6c3ee"]]},{"id":"a60a7430.d10bd8","type":"inject","z":"95993933.d7c978","name":"Go","topic":"","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":"","x":490,"y":2180,"wires":[["bece8dfc.55e45"]]},{"id":"e91124.de6c3ee","type":"debug","z":"95993933.d7c978","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1110,"y":2180,"wires":[]},{"id":"bece8dfc.55e45","type":"change","z":"95993933.d7c978","name":"","rules":[{"t":"set","p":"options","pt":"msg","to":"[{\"firstname\":\"Paul\",\"lastname\":\"Doe\",\"age\":24},{\"firstname\":\"Greg\",\"lastname\":\"Jones\",\"age\":31},{\"firstname\":\"Able\",\"lastname\":\"Smith\",\"age\":29}]","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":2180,"wires":[["ee4d312b.cc342"]]},{"id":"18e6e44c.b0561c","type":"ui_group","z":0,"name":"Tables","tab":"e3a9c600.825af8","order":8,"disp":true,"width":"6"},{"id":"e3a9c600.825af8","type":"ui_tab","z":0,"name":"Angular UI templates","icon":"dashboard"}]