You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@griffin.apache.org by gu...@apache.org on 2017/05/18 02:10:29 UTC

[46/51] [partial] incubator-griffin git commit: For create docker

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-route/angular-route.min.js.map
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-route/angular-route.min.js.map b/ui/bower_components/angular-route/angular-route.min.js.map
new file mode 100644
index 0000000..e583089
--- /dev/null
+++ b/ui/bower_components/angular-route/angular-route.min.js.map
@@ -0,0 +1,8 @@
+{
+"version":3,
+"file":"angular-route.min.js",
+"lineCount":15,
+"mappings":"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",
+"sources":["angular-route.js"],
+"names":["window","angular","ngViewFactory","$route","$anchorScroll","$animate","restrict","terminal","priority","transclude","link","scope","$element","attr","ctrl","$transclude","cleanupLastView","previousLeaveAnimation","cancel","currentScope","$destroy","currentElement","leave","then","update","locals","current","isDefined","$template","newScope","$new","clone","enter","onNgViewEnter","autoScrollExp","$eval","$emit","onloadExp","autoscroll","onload","$on","ngViewFillContentFactory","$compile","$controller","html","contents","controller","$scope","controllerAs","data","children","resolveAs","isArray","isObject","ngRouteModule","module","provider","$RouteProvider","inherit","parent","extra","extend","Object","create","pathRegExp","path","opts","insensitive","caseInsensitiveMatch","ret","originalPath","regexp","keys","replace","_","slash","key","option","optional","star","push","name","RegExp","routes","when","this.when","route","routeCopy","dst","i","ii","length","charAt","isUndef
 ined","reloadOnSearch","redirectPath","substr","redirectTo","otherwise","this.otherwise","params","$get","$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce","prepareRoute","$locationEvent","lastRoute","preparedRouteIsUpdateOnly","preparedRoute","parseRoute","$$route","equals","pathParams","forceReload","$broadcast","defaultPrevented","preventDefault","commitRoute","nextRoute","copy","isString","interpolate","search","url","resolveLocals","error","resolve","forEach","value","get","invoke","template","getTemplateFor","all","templateUrl","isFunction","loadedTemplateUrl","valueOf","match","m","exec","on","len","val","string","result","split","segment","segmentMatch","join","reload","fakeLocationEvent","fakePreventDefault","$evalAsync","updateParams","newParams","$routeMinErr","$$minErr","$RouteParamsProvider","this.$get","directive","$inject"]
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-route/bower.json
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-route/bower.json b/ui/bower_components/angular-route/bower.json
new file mode 100644
index 0000000..8e6c86b
--- /dev/null
+++ b/ui/bower_components/angular-route/bower.json
@@ -0,0 +1,10 @@
+{
+  "name": "angular-route",
+  "version": "1.5.8",
+  "license": "MIT",
+  "main": "./angular-route.js",
+  "ignore": [],
+  "dependencies": {
+    "angular": "1.5.8"
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-route/index.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-route/index.js b/ui/bower_components/angular-route/index.js
new file mode 100644
index 0000000..9ed2645
--- /dev/null
+++ b/ui/bower_components/angular-route/index.js
@@ -0,0 +1,2 @@
+require('./angular-route');
+module.exports = 'ngRoute';

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-route/package.json
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-route/package.json b/ui/bower_components/angular-route/package.json
new file mode 100644
index 0000000..7aa115a
--- /dev/null
+++ b/ui/bower_components/angular-route/package.json
@@ -0,0 +1,33 @@
+{
+  "name": "angular-route",
+  "version": "1.5.8",
+  "description": "AngularJS router module",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/angular/angular.js.git"
+  },
+  "keywords": [
+    "angular",
+    "framework",
+    "browser",
+    "router",
+    "client-side"
+  ],
+  "author": "Angular Core Team <an...@google.com>",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/angular/angular.js/issues"
+  },
+  "homepage": "http://angularjs.org",
+  "jspm": {
+    "shim": {
+      "angular-route": {
+        "deps": ["angular"]
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/.bower.json
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/.bower.json b/ui/bower_components/angular-smart-table/.bower.json
new file mode 100644
index 0000000..0780815
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/.bower.json
@@ -0,0 +1,38 @@
+{
+  "name": "angular-smart-table",
+  "version": "2.1.7",
+  "homepage": "https://github.com/lorenzofox3/Smart-Table",
+  "authors": [
+    "lorenzofox3 <la...@gmail.com>"
+  ],
+  "description": "table module for angular",
+  "main": "dist/smart-table.js",
+  "keywords": [
+    "smart-table",
+    "angular",
+    "table"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+    "angular": "^1.0.0"
+  },
+  "devDependencies": {
+    "angular-mocks": "^1.0.0",
+    "jquery": "^2.0.0"
+  },
+  "_release": "2.1.7",
+  "_resolution": {
+    "type": "version",
+    "tag": "v2.1.7",
+    "commit": "42d11a42cb674ec6ff439ea7c91fb534c856c70a"
+  },
+  "_source": "https://github.com/lorenzofox3/Smart-Table.git",
+  "_target": "2.1.7",
+  "_originalSource": "angular-smart-table"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/.gitignore
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/.gitignore b/ui/bower_components/angular-smart-table/.gitignore
new file mode 100644
index 0000000..07cd661
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/.gitignore
@@ -0,0 +1,7 @@
+.idea
+node_modules
+example-app
+bower_components
+coverage
+.DS_Store
+test/.DS_Storesmart-table-website

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/.travis.yml
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/.travis.yml b/ui/bower_components/angular-smart-table/.travis.yml
new file mode 100644
index 0000000..f42dba6
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/.travis.yml
@@ -0,0 +1,12 @@
+language: node_js
+node_js:
+  - "0.10"
+
+
+before_script:
+  - npm install -g gulp bower
+  - npm install
+  - bower install
+
+script:
+  - gulp build
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/bower.json
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/bower.json b/ui/bower_components/angular-smart-table/bower.json
new file mode 100644
index 0000000..7ac851f
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/bower.json
@@ -0,0 +1,29 @@
+{
+  "name": "angular-smart-table",
+  "version": "2.1.6",
+  "homepage": "https://github.com/lorenzofox3/Smart-Table",
+  "authors": [
+    "lorenzofox3 <la...@gmail.com>"
+  ],
+  "description": "table module for angular",
+  "main": "dist/smart-table.js",
+  "keywords": [
+    "smart-table",
+    "angular",
+    "table"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+    "angular": "^1.0.0"
+  },
+  "devDependencies": {
+    "angular-mocks": "^1.0.0",
+    "jquery": "^2.0.0"
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/changeLog.md
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/changeLog.md b/ui/bower_components/angular-smart-table/changeLog.md
new file mode 100644
index 0000000..3d15a3f
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/changeLog.md
@@ -0,0 +1,175 @@
+## version 1.1.0
+
+* allow binding on search predicate [https://github.com/lorenzofox3/Smart-Table/issues/142] (issue 142)
+Note that if you want to search against a property name you have now to put in under single quote otherwise it will be considered as a binding
+```markup
+<input st-search="'name'"/>
+```
+
+## version 1.1.1
+
+* fix #146 and #148, set stPipe before stPagination is called. Thanks [brianchance](https://github.com/brianchance)
+
+## version 1.2.1
+
+* implement #149 (default sorting)
+
+## version 1.2.2
+
+* hide pagination when less than 1 page
+* add unit tests for pagination directive
+
+## version 1.2.3
+
+* fix back to natural sort order
+* use same strategy view -> table state, table state -> view for all the plugins
+
+## version 1.2.4
+
+* fix #161 
+
+## version 1.2.5
+
+* fix #162
+
+## version 1.2.6
+
+* fix #165
+* ability to overwrite class names for (st-sort-ascent and st-sort-descent) thanks to [replacement87](https://github.com/replacement87)
+
+## version 1.2.7
+
+* fix #167
+
+## version 1.3.0
+
+* new feature, items by page and displayed page can be bound
+
+## version 1.4.0
+
+* support external template for pagination
+* support angular v1.3.x
+
+## version 1.4.1
+
+* ability to skip natural ordering state (ie fix #192)
+
+## versiokn 1.4.2
+
+* fix #200, `this` in a custom pipe function does not refer to the table controller anymore, and the signature of a custom pipe function is
+```javascript
+function(tableState, tableController){
+
+}
+```
+
+## version 1.4.3
+
+* ability to set filter function <code>st-set-filter</code>
+* ability to set sort function <code>st-set-sort</code>
+
+## version 1.4.4
+
+* patch for sync problem
+
+## version 1.4.5
+
+* merge #234, #218
+* fix #233 #237
+
+## version 1.4.6
+
+* evaluate sort predicate as late as possible
+* fix #262
+
+## version 1.4.7
+
+* fix #276
+
+## version 1.4.8
+
+* fix #281
+
+## version 1.4.9
+
+* fix #285
+
+## version 1.4.10
+
+* fix #284
+* fix #290
+
+## version 1.4.11
+
+* fix #296
+* add possibility to bind a callback when page changes
+
+## version 1.4.12
+
+* don't use pagination class twice
+* build improvement
+
+## version 1.4.13
+
+* use a global configuration
+* expose filtered collection result
+
+## version 2.0.0
+
+* use interpolation rather than binding for st-search directive (to avoid the creation of isolated scope)
+
+**This is a breaking change as now, you will have to remove the single quote around the predicate property name, and if you were using a binding, you'll have to interpolate it with the curly brace notation**
+
+## version 2.0.1
+
+* fix #328
+
+## version 2.0.2
+
+* add debounce to custom pipe function to make sure tableState is stable
+* fix #329
+
+## version 2.0.3
+
+* implements #379
+* fix #390
+
+## version 2.1.0
+
+* support nested search (thanks to @jansabbe)
+* fix #254
+* fix wrong path to default config for stSkipNatural (@phuvo)
+* fix #406
+
+## version 2.1.1
+
+* support commonjs 
+* add totalItemCount on tableState (@eirikbell)
+
+## version 2.1.2
+
+* improve build #461 [stanleyxu](https://github.com/stanleyxu2005)
+
+## version 2.1.3
+
+* fix #477
+
+## version 2.1.4
+
+* add throttle to sort
+* add watch to first item in collection (@matthewbednarski)
+
+## version 2.1.5
+
+* #544
+* #533
+* #515
+
+## version 2.1.6
+
+* #559
+
+## version 2.1.7
+
+* fix [https://github.com/lorenzofox3/Smart-Table/issues/468](#468) thanks to Douglas-Treadwell
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/dist/smart-table.min.js.map
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/dist/smart-table.min.js.map b/ui/bower_components/angular-smart-table/dist/smart-table.min.js.map
new file mode 100644
index 0000000..b1b5a32
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/dist/smart-table.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["smart-table.min.js"],"names":["ng","undefined","module","run","$templateCache","put","constant","pagination","template","itemsByPage","displayedPages","search","delay","inputEvent","select","mode","selectedClass","sort","ascentClass","descentClass","skipNatural","pipe","controller","$scope","$parse","$filter","$attrs","copyRefs","src","concat","updateSafeCopy","safeCopy","safeGetter","pipeAfterSafeCopy","ctrl","deepDelete","object","path","indexOf","partials","split","key","pop","parentPath","join","parentObject","Object","keys","length","filtered","lastSelected","propertyName","stTable","displayGetter","displaySetter","assign","orderBy","filter","tableState","start","totalItemCount","this","stSafeSrc","$watch","safeSrc","newValue","oldValue","sortBy","predicate","reverse","isFunction","functionName","name","input","predicateObject","prop","isString","trim","output","number","numberOfPages","Math","ceil","slice","parseInt","row","rows","index","isSelected","
 getFilteredCollection","setFilterFunction","filterName","setSortFunction","sortFunctionName","preventPipeOnWatch","directive","restrict","link","scope","element","attr","stSetFilter","stSetSort","stConfig","$timeout","require","tableCtrl","promise","throttle","stDelay","event","stInputEvent","$observe","value","predicateExpression","stSearch","bind","evt","originalEvent","cancel","target","stSelectMode","$apply","addClass","removeClass","descendingFirst","func","getter","isArray","stSort","sortDefault","classAscent","stClassAscent","classDescent","stClassDescent","stateClasses","stSkipNatural","stDescendingFirst","stSortDefault","$eval","stItemsByPage","stDisplayedPages","stPageChange","templateUrl","attrs","stTemplate","redraw","end","i","paginationState","prevPage","currentPage","floor","max","abs","pages","numPages","push","newPage","selectPage","page","config","stPipe","pre","pipePromise","post","angular"],"mappings":"CAAA,SAAWA,EAAIC,GACX,YAEJD,GAAGE,OAAO,kBAAmBC,KAAK,iBAAkB,SA
 AUC,GAC1DA,EAAeC,IAAI,uCACf,yMAMRL,EAAGE,OAAO,eACPI,SAAS,YACRC,YACEC,SAAU,uCACVC,YAAa,GACbC,eAAgB,GAElBC,QACEC,MAAO,IACPC,WAAY,SAEdC,QACEC,KAAM,SACNC,cAAe,eAEjBC,MACEC,YAAa,iBACbC,aAAc,kBACdC,aAAa,EACbR,MAAM,KAERS,MACET,MAAO,OAGbZ,EAAGE,OAAO,eACPoB,WAAW,qBAAsB,SAAU,SAAU,UAAW,SAAU,SAA4BC,EAAQC,EAAQC,EAASC,GAqB9H,QAASC,GAAUC,GACjB,MAAOA,MAASC,OAAOD,MAGzB,QAASE,KACPC,EAAWJ,EAASK,EAAWT,IAC3BU,KAAsB,GACxBC,EAAKb,OAIT,QAASc,GAAYC,EAAQC,GAC3B,GAAyB,IAArBA,EAAKC,QAAQ,KAAY,CAC3B,GAAIC,GAAWF,EAAKG,MAAM,KACtBC,EAAMF,EAASG,MACfC,EAAaJ,EAASK,KAAK,KAC3BC,EAAerB,EAAOmB,GAAYP,SAC/BS,GAAaJ,GACoB,GAApCK,OAAOC,KAAKF,GAAcG,QAC5Bb,EAAWC,EAAQO,cAGdP,GAAOC,GA1ClB,GAGIL,GAYAiB,EAGAC,EAlBAC,EAAezB,EAAO0B,QACtBC,EAAgB7B,EAAO2B,GACvBG,EAAgBD,EAAcE,OAE9BC,EAAU/B,EAAQ,WAClBgC,EAAShC,EAAQ,UACjBM,EAAWJ,EAAS0B,EAAc9B,IAClCmC,GACFzC,QACAN,UACAJ,YACEoD,MAAO,EACPC,eAAgB,IAIhB3B,GAAoB,EACpBC,EAAO2B,IA6BPnC,GAAOoC,YACT9B,EAAaR,EAAOE,EAAOoC,WAC3BvC,EAAOwC,OAAO,WACZ,GAAIC,GAAUhC,EAAWT,EACzB,OAAOyC,IAAWA,EAAQhB,OAASgB,EAA
 Q,GAAK/D,GAC/C,SAAUgE,EAAUC,GACjBD,IAAaC,GACfpC,MAGJP,EAAOwC,OAAO,WACZ,GAAIC,GAAUhC,EAAWT,EACzB,OAAOyC,GAAUA,EAAQhB,OAAS,GACjC,SAAUiB,GACPA,IAAalC,EAASiB,QACxBlB,MAGJP,EAAOwC,OAAO,WACZ,MAAO/B,GAAWT,IACjB,SAAU0C,EAAUC,GACjBD,IAAaC,IACfR,EAAWnD,WAAWoD,MAAQ,EAC9B7B,QAUN+B,KAAKM,OAAS,SAAiBC,EAAWC,GAWxC,MAVAX,GAAWzC,KAAKmD,UAAYA,EAC5BV,EAAWzC,KAAKoD,QAAUA,KAAY,EAElCrE,EAAGsE,WAAWF,GAChBV,EAAWzC,KAAKsD,aAAeH,EAAUI,WAElCd,GAAWzC,KAAKsD,aAGzBb,EAAWnD,WAAWoD,MAAQ,EACvBE,KAAKxC,QAQdwC,KAAKlD,OAAS,SAAiB8D,EAAOL,GACpC,GAAIM,GAAkBhB,EAAW/C,OAAO+D,oBACpCC,EAAOP,EAAYA,EAAY,GAUnC,OARAK,GAAQzE,EAAG4E,SAASH,GAASA,EAAMI,OAASJ,EAC5CjD,EAAOmD,GAAMpB,OAAOmB,EAAiBD,GAEhCA,GACHtC,EAAWuC,EAAiBC,GAE9BjB,EAAW/C,OAAO+D,gBAAkBA,EACpChB,EAAWnD,WAAWoD,MAAQ,EACvBE,KAAKxC,QAMdwC,KAAKxC,KAAO,WACV,GACIyD,GADAvE,EAAamD,EAAWnD,UAE5B0C,GAAWS,EAAW/C,OAAO+D,gBAAkBjB,EAAO1B,EAAU2B,EAAW/C,OAAO+D,iBAAmB3C,EACjG2B,EAAWzC,KAAKmD,YAClBnB,EAAWO,EAAQP,EAAUS,EAAWzC,KAAKmD,UAAWV,EAAWzC,KAAKoD,UAE1E9D,EAAWqD,eAAiBX,EAASD,OACjCzC,EAA
 WwE,SAAW9E,IACxBM,EAAWyE,cAAgB/B,EAASD,OAAS,EAAIiC,KAAKC,KAAKjC,EAASD,OAASzC,EAAWwE,QAAU,EAClGxE,EAAWoD,MAAQpD,EAAWoD,OAASV,EAASD,QAAUzC,EAAWyE,cAAgB,GAAKzE,EAAWwE,OAASxE,EAAWoD,MACzHmB,EAAS7B,EAASkC,MAAM5E,EAAWoD,MAAOpD,EAAWoD,MAAQyB,SAAS7E,EAAWwE,UAEnFzB,EAAc/B,EAAQuD,GAAU7B,IAQlCY,KAAK/C,OAAS,SAAiBuE,EAAKtE,GAClC,GAAIuE,GAAO3D,EAAS0B,EAAc9B,IAC9BgE,EAAQD,EAAKhD,QAAQ+C,EACX,MAAVE,IACW,WAATxE,GACFsE,EAAIG,WAAaH,EAAIG,cAAe,EAChCtC,IACFA,EAAasC,YAAa,GAE5BtC,EAAemC,EAAIG,cAAe,EAAOH,EAAMpF,GAE/CqF,EAAKC,GAAOC,YAAcF,EAAKC,GAAOC,aAW5C3B,KAAKsB,MAAQ,SAAiBxB,EAAOoB,GAGnC,MAFArB,GAAWnD,WAAWoD,MAAQA,EAC9BD,EAAWnD,WAAWwE,OAASA,EACxBlB,KAAKxC,QAOdwC,KAAKH,WAAa,WAChB,MAAOA,IAGTG,KAAK4B,sBAAwB,WAC3B,MAAOxC,IAAYlB,GAOrB8B,KAAK6B,kBAAoB,SAA4BC,GACnDlC,EAAShC,EAAQkE,IAOnB9B,KAAK+B,gBAAkB,SAA0BC,GAC/CrC,EAAU/B,EAAQoE,IAOpBhC,KAAKiC,mBAAqB,WACxB7D,GAAoB,MAGvB8D,UAAU,UAAW,WACpB,OACEC,SAAU,IACV1E,WAAY,oBACZ2E,KAAM,SAAUC,EAAOC,EAASC,EAAMlE,GAEhCkE,EAAKC,aACPnE,EAAKwD,kBAAkBU,EAAKC,aAG1BD,EAAKE,WACPpE,EA
 AK0D,gBAAgBQ,EAAKE,eAMpCtG,EAAGE,OAAO,eACP6F,UAAU,YAAa,WAAY,WAAW,SAAU,SAAUQ,EAAUC,EAAUhF,GACrF,OACEiF,QAAS,WACTR,KAAM,SAAUC,EAAOC,EAASC,EAAMlE,GACpC,GAAIwE,GAAYxE,EACZyE,EAAU,KACVC,EAAWR,EAAKS,SAAWN,EAAS5F,OAAOC,MAC3CkG,EAAQV,EAAKW,cAAgBR,EAAS5F,OAAOE,UAEjDuF,GAAKY,SAAS,WAAY,SAAU/C,EAAUC,GAC5C,GAAIO,GAAQ0B,EAAQ,GAAGc,KACnBhD,KAAaC,GAAYO,IAC3BvC,EAAKwB,aAAa/C,UAClB+F,EAAU/F,OAAO8D,EAAOR,MAK5BiC,EAAMnC,OAAO,WACX,MAAO7B,GAAKwB,aAAa/C,QACxB,SAAUsD,GACX,GAAIiD,GAAsBd,EAAKe,UAAY,GACvClD,GAASS,iBAAmBlD,EAAO0F,GAAqBjD,EAASS,mBAAqByB,EAAQ,GAAGc,QACnGd,EAAQ,GAAGc,MAAQzF,EAAO0F,GAAqBjD,EAASS,kBAAoB,MAE7E,GAGHyB,EAAQiB,KAAKN,EAAO,SAAUO,GAC5BA,EAAMA,EAAIC,eAAiBD,EACX,OAAZV,GACFH,EAASe,OAAOZ,GAGlBA,EAAUH,EAAS,WACjBE,EAAU/F,OAAO0G,EAAIG,OAAOP,MAAOb,EAAKe,UAAY,IACpDR,EAAU,MACTC,UAMb5G,EAAGE,OAAO,eACP6F,UAAU,eAAgB,WAAY,SAAUQ,GAC/C,OACEP,SAAU,IACVS,QAAS,WACTP,OACEb,IAAK,gBAEPY,KAAM,SAAUC,EAAOC,EAASC,EAAMlE,GACpC,GAAInB,GAAOqF,EAAKqB,cAAgBlB,EAASzF,OAAOC,IAChDoF,GAAQiB,KAAK,QAAS,WACpBlB,EAAMwB,OAAO,WA
 CXxF,EAAKpB,OAAOoF,EAAMb,IAAKtE,OAI3BmF,EAAMnC,OAAO,iBAAkB,SAAUE,GACnCA,KAAa,EACfkC,EAAQwB,SAASpB,EAASzF,OAAOE,eAEjCmF,EAAQyB,YAAYrB,EAASzF,OAAOE,sBAOhDhB,EAAGE,OAAO,eACR6F,UAAU,UAAW,WAAY,SAAU,WAAY,SAAUQ,EAAU/E,EAAQgF,GACnF,OACCR,SAAU,IACVS,QAAS,WACTR,KAAM,SAAUC,EAAOC,EAASC,EAAMlE,GAmBrC,QAASjB,KACH4G,EAEHtC,EADc,IAAVA,EACI,EACa,IAAVA,EACH,EAEA,EAGTA,GAGD,IAAIuC,EACJ1D,GAAYpE,EAAGsE,WAAWyD,EAAO7B,KAAWlG,EAAGgI,QAAQD,EAAO7B,IAAU6B,EAAO7B,GAASE,EAAK6B,OACzF1C,EAAQ,IAAM,KAAOnE,IAAgB,GAExCmE,EAAQ,EACRrD,EAAKwB,aAAazC,QAClBiB,EAAKwB,aAAanD,WAAWoD,MAAQ,EACrCmE,EAAO5F,EAAKb,KAAK+F,KAAKlF,IAEtB4F,EAAO5F,EAAKiC,OAAOiD,KAAKlF,EAAMkC,EAAWmB,EAAQ,IAAM,GAExC,OAAZoB,GACHH,EAASe,OAAOZ,GAEF,EAAXC,EACHkB,IAEAnB,EAAUH,EAASsB,EAAMlB,GA/C3B,GAMIsB,GANA9D,EAAYgC,EAAK6B,OACjBF,EAASvG,EAAO4C,GAChBmB,EAAQ,EACR4C,EAAc/B,EAAKgC,eAAiB7B,EAAStF,KAAKC,YAClDmH,EAAejC,EAAKkC,gBAAkB/B,EAAStF,KAAKE,aACpDoH,GAAgBJ,EAAaE,GAE7BjH,EAAcgF,EAAKoC,gBAAkBvI,EAAYmG,EAAKoC,cAAgBjC,EAAStF,KAAKG,YACpFyG,EAA6C,SAA3BzB,EAAKqC,kB
 ACvB9B,EAAU,KACVC,EAAWR,EAAKS,SAAWN,EAAStF,KAAKL,KAEzCwF,GAAKsC,gBACRR,EAAchC,EAAMyC,MAAMvC,EAAKsC,iBAAmBzI,EAAYiG,EAAMyC,MAAMvC,EAAKsC,eAAiBtC,EAAKsC,eAsCtGvC,EAAQiB,KAAK,QAAS,WACjBhD,GACH8B,EAAMwB,OAAOzG,KAIXiH,IACH3C,EAAwB,YAAhB2C,EAA4B,EAAI,EACxCjH,KAIDiF,EAAMnC,OAAO,WACZ,MAAO7B,GAAKwB,aAAazC,MACvB,SAAUgD,GACRA,EAASG,YAAcA,GAC1BmB,EAAQ,EACRY,EACEyB,YAAYO,GACZP,YAAYS,KAEd9C,EAAQtB,EAASI,WAAY,EAAO,EAAI,EACxC8B,EACEyB,YAAYW,EAAahD,EAAQ,IACjCoC,SAASY,EAAahD,EAAQ,OAE/B,QAKPvF,EAAGE,OAAO,eACP6F,UAAU,gBAAiB,WAAY,SAAUQ,GAChD,OACEP,SAAU,KACVS,QAAS,WACTP,OACE0C,cAAe,KACfC,iBAAkB,KAClBC,aAAc,KAEhBC,YAAa,SAAU5C,EAAS6C,GAC9B,MAAIA,GAAMC,WACDD,EAAMC,WAER1C,EAAShG,WAAWC,UAE7ByF,KAAM,SAAUC,EAAOC,EAAS6C,EAAO9G,GAQrC,QAASgH,KACP,GAEIC,GACAC,EAHAC,EAAkBnH,EAAKwB,aAAanD,WACpCoD,EAAQ,EAGR2F,EAAWpD,EAAMqD,WAerB,KAdArD,EAAMtC,eAAiByF,EAAgBzF,eACvCsC,EAAMqD,YAActE,KAAKuE,MAAMH,EAAgB1F,MAAQ0F,EAAgBtE,QAAU,EAEjFpB,EAAQsB,KAAKwE,IAAI9F,EAAOuC,EAAMqD,YAActE,KAAKyE,IAAIzE,KAAKuE,MAAMtD,EAAM2C,iBAAmB,KACzFM,
 EAAMxF,EAAQuC,EAAM2C,iBAEhBM,EAAME,EAAgBrE,gBACxBmE,EAAME,EAAgBrE,cAAgB,EACtCrB,EAAQsB,KAAKwE,IAAI,EAAGN,EAAMjD,EAAM2C,mBAGlC3C,EAAMyD,SACNzD,EAAM0D,SAAWP,EAAgBrE,cAE5BoE,EAAIzF,EAAWwF,EAAJC,EAASA,IACvBlD,EAAMyD,MAAME,KAAKT,EAGfE,KAAapD,EAAMqD,aACrBrD,EAAM4C,cAAcgB,QAAS5D,EAAMqD,cA/BvCrD,EAAM0C,cAAgB1C,EAAM0C,eAAkB1C,EAAmB,cAAIK,EAAShG,WAAWE,YACzFyF,EAAM2C,iBAAmB3C,EAAM2C,kBAAqB3C,EAAsB,iBAAIK,EAAShG,WAAWG,eAElGwF,EAAMqD,YAAc,EACpBrD,EAAMyD,SAgCNzD,EAAMnC,OAAO,WACX,MAAO7B,GAAKwB,aAAanD,YACxB2I,GAAQ,GAGXhD,EAAMnC,OAAO,gBAAiB,SAAUE,EAAUC,GAC5CD,IAAaC,GACfgC,EAAM6D,WAAW,KAIrB7D,EAAMnC,OAAO,mBAAoBmF,GAGjChD,EAAM6D,WAAa,SAAUC,GACvBA,EAAO,GAAKA,GAAQ9D,EAAM0D,UAC5B1H,EAAKiD,OAAO6E,EAAO,GAAK9D,EAAM0C,cAAe1C,EAAM0C,gBAIlD1G,EAAKwB,aAAanD,WAAWwE,QAChC7C,EAAKiD,MAAM,EAAGe,EAAM0C,oBAM9B5I,EAAGE,OAAO,eACP6F,UAAU,UAAW,WAAY,WAAY,SAAUkE,EAAQzD,GAC9D,OACEC,QAAS,UACTP,OACEgE,OAAQ,KAEVjE,MAEEkE,IAAK,SAAUjE,EAAOC,EAAS6C,EAAO9G,GAEpC,GAAIkI,GAAc,IAEdpK,GAAGsE,WAAW4B,EAAMgE,UACtBhI,EAAK4D,qBACL5D,EAAKb,K
 AAO,WAUV,MARoB,QAAhB+I,GACF5D,EAASe,OAAO6C,GAGlBA,EAAc5D,EAAS,WACrBN,EAAMgE,OAAOhI,EAAKwB,aAAcxB,IAC/B+H,EAAO5I,KAAKT,UAOrByJ,KAAM,SAAUnE,EAAOC,EAAS6C,EAAO9G,GACrCA,EAAKb,cAMZiJ","file":"smart-table.min.js","sourcesContent":["(function (ng, undefined){\n    'use strict';\n\nng.module('smart-table', []).run(['$templateCache', function ($templateCache) {\n    $templateCache.put('template/smart-table/pagination.html',\n        '<nav ng-if=\"numPages && pages.length >= 2\"><ul class=\"pagination\">' +\n        '<li ng-repeat=\"page in pages\" ng-class=\"{active: page==currentPage}\"><a ng-click=\"selectPage(page)\">{{page}}</a></li>' +\n        '</ul></nav>');\n}]);\n\n\nng.module('smart-table')\n  .constant('stConfig', {\n    pagination: {\n      template: 'template/smart-table/pagination.html',\n      itemsByPage: 10,\n      displayedPages: 5\n    },\n    search: {\n      delay: 400, // ms\n      inputEvent: 'input'\n    },\n    select: {\n      mode: 'single',\n      selectedClass: '
 st-selected'\n    },\n    sort: {\n      ascentClass: 'st-sort-ascent',\n      descentClass: 'st-sort-descent',\n      skipNatural: false,\n      delay:300\n    },\n    pipe: {\n      delay: 100 //ms\n    }\n  });\nng.module('smart-table')\n  .controller('stTableController', ['$scope', '$parse', '$filter', '$attrs', function StTableController ($scope, $parse, $filter, $attrs) {\n    var propertyName = $attrs.stTable;\n    var displayGetter = $parse(propertyName);\n    var displaySetter = displayGetter.assign;\n    var safeGetter;\n    var orderBy = $filter('orderBy');\n    var filter = $filter('filter');\n    var safeCopy = copyRefs(displayGetter($scope));\n    var tableState = {\n      sort: {},\n      search: {},\n      pagination: {\n        start: 0,\n        totalItemCount: 0\n      }\n    };\n    var filtered;\n    var pipeAfterSafeCopy = true;\n    var ctrl = this;\n    var lastSelected;\n\n    function copyRefs (src) {\n      return src ? [].concat(src) : [];\n    }\n\n    f
 unction updateSafeCopy () {\n      safeCopy = copyRefs(safeGetter($scope));\n      if (pipeAfterSafeCopy === true) {\n        ctrl.pipe();\n      }\n    }\n\n    function deepDelete (object, path) {\n      if (path.indexOf('.') != -1) {\n        var partials = path.split('.');\n        var key = partials.pop();\n        var parentPath = partials.join('.');\n        var parentObject = $parse(parentPath)(object)\n        delete parentObject[key];\n        if (Object.keys(parentObject).length == 0) {\n          deepDelete(object, parentPath);\n        }\n      } else {\n        delete object[path];\n      }\n    }\n\n    if ($attrs.stSafeSrc) {\n      safeGetter = $parse($attrs.stSafeSrc);\n      $scope.$watch(function () {\n        var safeSrc = safeGetter($scope);\n        return safeSrc && safeSrc.length ? safeSrc[0] : undefined;\n      }, function (newValue, oldValue) {\n        if (newValue !== oldValue) {\n          updateSafeCopy();\n        }\n      });\n      $scope.$watch(fun
 ction () {\n        var safeSrc = safeGetter($scope);\n        return safeSrc ? safeSrc.length : 0;\n      }, function (newValue, oldValue) {\n        if (newValue !== safeCopy.length) {\n          updateSafeCopy();\n        }\n      });\n      $scope.$watch(function () {\n        return safeGetter($scope);\n      }, function (newValue, oldValue) {\n        if (newValue !== oldValue) {\n          tableState.pagination.start = 0;\n          updateSafeCopy();\n        }\n      });\n    }\n\n    /**\n     * sort the rows\n     * @param {Function | String} predicate - function or string which will be used as predicate for the sorting\n     * @param [reverse] - if you want to reverse the order\n     */\n    this.sortBy = function sortBy (predicate, reverse) {\n      tableState.sort.predicate = predicate;\n      tableState.sort.reverse = reverse === true;\n\n      if (ng.isFunction(predicate)) {\n        tableState.sort.functionName = predicate.name;\n      } else {\n        delete tableS
 tate.sort.functionName;\n      }\n\n      tableState.pagination.start = 0;\n      return this.pipe();\n    };\n\n    /**\n     * search matching rows\n     * @param {String} input - the input string\n     * @param {String} [predicate] - the property name against you want to check the match, otherwise it will search on all properties\n     */\n    this.search = function search (input, predicate) {\n      var predicateObject = tableState.search.predicateObject || {};\n      var prop = predicate ? predicate : '$';\n\n      input = ng.isString(input) ? input.trim() : input;\n      $parse(prop).assign(predicateObject, input);\n      // to avoid to filter out null value\n      if (!input) {\n        deepDelete(predicateObject, prop);\n      }\n      tableState.search.predicateObject = predicateObject;\n      tableState.pagination.start = 0;\n      return this.pipe();\n    };\n\n    /**\n     * this will chain the operations of sorting and filtering based on the current table state (sort o
 ptions, filtering, ect)\n     */\n    this.pipe = function pipe () {\n      var pagination = tableState.pagination;\n      var output;\n      filtered = tableState.search.predicateObject ? filter(safeCopy, tableState.search.predicateObject) : safeCopy;\n      if (tableState.sort.predicate) {\n        filtered = orderBy(filtered, tableState.sort.predicate, tableState.sort.reverse);\n      }\n      pagination.totalItemCount = filtered.length;\n      if (pagination.number !== undefined) {\n        pagination.numberOfPages = filtered.length > 0 ? Math.ceil(filtered.length / pagination.number) : 1;\n        pagination.start = pagination.start >= filtered.length ? (pagination.numberOfPages - 1) * pagination.number : pagination.start;\n        output = filtered.slice(pagination.start, pagination.start + parseInt(pagination.number));\n      }\n      displaySetter($scope, output || filtered);\n    };\n\n    /**\n     * select a dataRow (it will add the attribute isSelected to the row object)
 \n     * @param {Object} row - the row to select\n     * @param {String} [mode] - \"single\" or \"multiple\" (multiple by default)\n     */\n    this.select = function select (row, mode) {\n      var rows = copyRefs(displayGetter($scope));\n      var index = rows.indexOf(row);\n      if (index !== -1) {\n        if (mode === 'single') {\n          row.isSelected = row.isSelected !== true;\n          if (lastSelected) {\n            lastSelected.isSelected = false;\n          }\n          lastSelected = row.isSelected === true ? row : undefined;\n        } else {\n          rows[index].isSelected = !rows[index].isSelected;\n        }\n      }\n    };\n\n    /**\n     * take a slice of the current sorted/filtered collection (pagination)\n     *\n     * @param {Number} start - start index of the slice\n     * @param {Number} number - the number of item in the slice\n     */\n    this.slice = function splice (start, number) {\n      tableState.pagination.start = start;\n      tableState
 .pagination.number = number;\n      return this.pipe();\n    };\n\n    /**\n     * return the current state of the table\n     * @returns {{sort: {}, search: {}, pagination: {start: number}}}\n     */\n    this.tableState = function getTableState () {\n      return tableState;\n    };\n\n    this.getFilteredCollection = function getFilteredCollection () {\n      return filtered || safeCopy;\n    };\n\n    /**\n     * Use a different filter function than the angular FilterFilter\n     * @param filterName the name under which the custom filter is registered\n     */\n    this.setFilterFunction = function setFilterFunction (filterName) {\n      filter = $filter(filterName);\n    };\n\n    /**\n     * Use a different function than the angular orderBy\n     * @param sortFunctionName the name under which the custom order function is registered\n     */\n    this.setSortFunction = function setSortFunction (sortFunctionName) {\n      orderBy = $filter(sortFunctionName);\n    };\n\n    /**\n
      * Usually when the safe copy is updated the pipe function is called.\n     * Calling this method will prevent it, which is something required when using a custom pipe function\n     */\n    this.preventPipeOnWatch = function preventPipe () {\n      pipeAfterSafeCopy = false;\n    };\n  }])\n  .directive('stTable', function () {\n    return {\n      restrict: 'A',\n      controller: 'stTableController',\n      link: function (scope, element, attr, ctrl) {\n\n        if (attr.stSetFilter) {\n          ctrl.setFilterFunction(attr.stSetFilter);\n        }\n\n        if (attr.stSetSort) {\n          ctrl.setSortFunction(attr.stSetSort);\n        }\n      }\n    };\n  });\n\nng.module('smart-table')\n  .directive('stSearch', ['stConfig', '$timeout','$parse', function (stConfig, $timeout, $parse) {\n    return {\n      require: '^stTable',\n      link: function (scope, element, attr, ctrl) {\n        var tableCtrl = ctrl;\n        var promise = null;\n        var throttle = attr.stDel
 ay || stConfig.search.delay;\n        var event = attr.stInputEvent || stConfig.search.inputEvent;\n\n        attr.$observe('stSearch', function (newValue, oldValue) {\n          var input = element[0].value;\n          if (newValue !== oldValue && input) {\n            ctrl.tableState().search = {};\n            tableCtrl.search(input, newValue);\n          }\n        });\n\n        //table state -> view\n        scope.$watch(function () {\n          return ctrl.tableState().search;\n        }, function (newValue, oldValue) {\n          var predicateExpression = attr.stSearch || '$';\n          if (newValue.predicateObject && $parse(predicateExpression)(newValue.predicateObject) !== element[0].value) {\n            element[0].value = $parse(predicateExpression)(newValue.predicateObject) || '';\n          }\n        }, true);\n\n        // view -> table state\n        element.bind(event, function (evt) {\n          evt = evt.originalEvent || evt;\n          if (promise !== null) {\n
             $timeout.cancel(promise);\n          }\n\n          promise = $timeout(function () {\n            tableCtrl.search(evt.target.value, attr.stSearch || '');\n            promise = null;\n          }, throttle);\n        });\n      }\n    };\n  }]);\n\nng.module('smart-table')\n  .directive('stSelectRow', ['stConfig', function (stConfig) {\n    return {\n      restrict: 'A',\n      require: '^stTable',\n      scope: {\n        row: '=stSelectRow'\n      },\n      link: function (scope, element, attr, ctrl) {\n        var mode = attr.stSelectMode || stConfig.select.mode;\n        element.bind('click', function () {\n          scope.$apply(function () {\n            ctrl.select(scope.row, mode);\n          });\n        });\n\n        scope.$watch('row.isSelected', function (newValue) {\n          if (newValue === true) {\n            element.addClass(stConfig.select.selectedClass);\n          } else {\n            element.removeClass(stConfig.select.selectedClass);\n         
  }\n        });\n      }\n    };\n  }]);\n\nng.module('smart-table')\n\t.directive('stSort', ['stConfig', '$parse', '$timeout', function (stConfig, $parse, $timeout) {\n\t\treturn {\n\t\t\trestrict: 'A',\n\t\t\trequire: '^stTable',\n\t\t\tlink: function (scope, element, attr, ctrl) {\n\n\t\t\t\tvar predicate = attr.stSort;\n\t\t\t\tvar getter = $parse(predicate);\n\t\t\t\tvar index = 0;\n\t\t\t\tvar classAscent = attr.stClassAscent || stConfig.sort.ascentClass;\n\t\t\t\tvar classDescent = attr.stClassDescent || stConfig.sort.descentClass;\n\t\t\t\tvar stateClasses = [classAscent, classDescent];\n\t\t\t\tvar sortDefault;\n\t\t\t\tvar skipNatural = attr.stSkipNatural !== undefined ? attr.stSkipNatural : stConfig.sort.skipNatural;\n\t\t\t\tvar descendingFirst = attr.stDescendingFirst === 'true';\n\t\t\t\tvar promise = null;\n\t\t\t\tvar throttle = attr.stDelay || stConfig.sort.delay;\n\n\t\t\t\tif (attr.stSortDefault) {\n\t\t\t\t\tsortDefault = scope.$eval(attr.stSortDefault) !== undef
 ined ? scope.$eval(attr.stSortDefault) : attr.stSortDefault;\n\t\t\t\t}\n\n\t\t\t\t//view --> table state\n\t\t\t\tfunction sort () {\n\t\t\t\t\tif ( descendingFirst ) {\n\t\t\t\t\t\tif ( index === 0 ) {\n\t\t\t\t\t\t\tindex = 2;\n\t\t\t\t\t\t} else if ( index === 2 ) {\n\t\t\t\t\t\t\tindex = 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar func;\n\t\t\t\t\tpredicate = ng.isFunction(getter(scope)) || ng.isArray(getter(scope)) ? getter(scope) : attr.stSort;\n\t\t\t\t\tif (index % 3 === 0 && !!skipNatural !== true) {\n\t\t\t\t\t\t//manual reset\n\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\tctrl.tableState().sort = {};\n\t\t\t\t\t\tctrl.tableState().pagination.start = 0;\n\t\t\t\t\t\tfunc = ctrl.pipe.bind(ctrl);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfunc = ctrl.sortBy.bind(ctrl, predicate, index % 2 === 0);\n\t\t\t\t\t}\n\t\t\t\t\tif (promise !== null) {\n\t\t\t\t\t\t$timeout.cancel(promise);\n\t\t\t\t\t}\n\t\t\
 t\t\tif (throttle < 0) {\n\t\t\t\t\t\tfunc();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpromise = $timeout(func, throttle);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telement.bind('click', function sortClick () {\n\t\t\t\t\tif (predicate) {\n\t\t\t\t\t\tscope.$apply(sort);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (sortDefault) {\n\t\t\t\t\tindex = sortDefault === 'reverse' ? 1 : 0;\n\t\t\t\t\tsort();\n\t\t\t\t}\n\n\t\t\t\t//table state --> view\n\t\t\t\tscope.$watch(function () {\n\t\t\t\t\treturn ctrl.tableState().sort;\n\t\t\t\t}, function (newValue) {\n\t\t\t\t\tif (newValue.predicate !== predicate) {\n\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\telement\n\t\t\t\t\t\t\t.removeClass(classAscent)\n\t\t\t\t\t\t\t.removeClass(classDescent);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tindex = newValue.reverse === true ? 2 : 1;\n\t\t\t\t\t\telement\n\t\t\t\t\t\t\t.removeClass(stateClasses[index % 2])\n\t\t\t\t\t\t\t.addClass(stateClasses[index - 1]);\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\t\t\t}\n\t\t};\n\t}]);\n\nng.module('sm
 art-table')\n  .directive('stPagination', ['stConfig', function (stConfig) {\n    return {\n      restrict: 'EA',\n      require: '^stTable',\n      scope: {\n        stItemsByPage: '=?',\n        stDisplayedPages: '=?',\n        stPageChange: '&'\n      },\n      templateUrl: function (element, attrs) {\n        if (attrs.stTemplate) {\n          return attrs.stTemplate;\n        }\n        return stConfig.pagination.template;\n      },\n      link: function (scope, element, attrs, ctrl) {\n\n        scope.stItemsByPage = scope.stItemsByPage ? +(scope.stItemsByPage) : stConfig.pagination.itemsByPage;\n        scope.stDisplayedPages = scope.stDisplayedPages ? +(scope.stDisplayedPages) : stConfig.pagination.displayedPages;\n\n        scope.currentPage = 1;\n        scope.pages = [];\n\n        function redraw () {\n          var paginationState = ctrl.tableState().pagination;\n          var start = 1;\n          var end;\n          var i;\n          var prevPage = scope.currentPage;\
 n          scope.totalItemCount = paginationState.totalItemCount;\n          scope.currentPage = Math.floor(paginationState.start / paginationState.number) + 1;\n\n          start = Math.max(start, scope.currentPage - Math.abs(Math.floor(scope.stDisplayedPages / 2)));\n          end = start + scope.stDisplayedPages;\n\n          if (end > paginationState.numberOfPages) {\n            end = paginationState.numberOfPages + 1;\n            start = Math.max(1, end - scope.stDisplayedPages);\n          }\n\n          scope.pages = [];\n          scope.numPages = paginationState.numberOfPages;\n\n          for (i = start; i < end; i++) {\n            scope.pages.push(i);\n          }\n\n          if (prevPage !== scope.currentPage) {\n            scope.stPageChange({newPage: scope.currentPage});\n          }\n        }\n\n        //table state --> view\n        scope.$watch(function () {\n          return ctrl.tableState().pagination;\n        }, redraw, true);\n\n        //scope --> tabl
 e state  (--> view)\n        scope.$watch('stItemsByPage', function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            scope.selectPage(1);\n          }\n        });\n\n        scope.$watch('stDisplayedPages', redraw);\n\n        //view -> table state\n        scope.selectPage = function (page) {\n          if (page > 0 && page <= scope.numPages) {\n            ctrl.slice((page - 1) * scope.stItemsByPage, scope.stItemsByPage);\n          }\n        };\n\n        if (!ctrl.tableState().pagination.number) {\n          ctrl.slice(0, scope.stItemsByPage);\n        }\n      }\n    };\n  }]);\n\nng.module('smart-table')\n  .directive('stPipe', ['stConfig', '$timeout', function (config, $timeout) {\n    return {\n      require: 'stTable',\n      scope: {\n        stPipe: '='\n      },\n      link: {\n\n        pre: function (scope, element, attrs, ctrl) {\n\n          var pipePromise = null;\n\n          if (ng.isFunction(scope.stPipe)) {\n            ctrl.preventP
 ipeOnWatch();\n            ctrl.pipe = function () {\n\n              if (pipePromise !== null) {\n                $timeout.cancel(pipePromise)\n              }\n\n              pipePromise = $timeout(function () {\n                scope.stPipe(ctrl.tableState(), ctrl);\n              }, config.pipe.delay);\n\n              return pipePromise;\n            }\n          }\n        },\n\n        post: function (scope, element, attrs, ctrl) {\n          ctrl.pipe();\n        }\n      }\n    };\n  }]);\n\n})(angular);"],"sourceRoot":"/source/"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/gulpFile.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/gulpFile.js b/ui/bower_components/angular-smart-table/gulpFile.js
new file mode 100644
index 0000000..cd2bb70
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/gulpFile.js
@@ -0,0 +1,60 @@
+var gulp = require('gulp');
+var concat = require('gulp-concat');
+var uglify = require('gulp-uglify');
+var karma = require('karma').server;
+var jshint = require('gulp-jshint');
+var insert = require('gulp-insert');
+var sourcemaps = require('gulp-sourcemaps');
+var stylish = require('jshint-stylish');
+var packageJson = require('./package.json');
+var pluginList = ['stSearch', 'stSelectRow', 'stSort', 'stPagination', 'stPipe'];
+var disFolder = './dist/';
+var src = (['smart-table.module', 'stConfig', 'stTable']).concat(pluginList).map(function (val) {
+    return 'src/' + val + '.js';
+});
+
+src.push('src/bottom.txt');
+src.unshift('src/top.txt');
+
+//just as indication
+gulp.task('lint', function () {
+    gulp.src(src)
+        .pipe(jshint())
+        .pipe(jshint.reporter(stylish));
+});
+
+
+gulp.task('karma-CI', function (done) {
+    var conf = require('./test/karma.common.js');
+    conf.singleRun = true;
+    conf.browsers = ['PhantomJS'];
+    conf.basePath = './';
+    karma.start(conf, done);
+});
+
+gulp.task('uglify', function () {
+    gulp.src(src)
+      .pipe(concat('smart-table.min.js'))
+      .pipe(sourcemaps.init())
+      .pipe(uglify())
+      .pipe(sourcemaps.write('.'))
+      .pipe(gulp.dest(disFolder));
+});
+
+gulp.task('concat', function () {
+    gulp.src(src, { base: '.' })
+      .pipe(concat('smart-table.js'))
+      .pipe(gulp.dest(disFolder));
+});
+
+gulp.task('test', ['karma-CI']);
+
+gulp.task('build',['test', 'uglify', 'concat'], function () {
+
+    var version = packageJson.version;
+    var string = '/** \n* @version ' + version + '\n* @license MIT\n*/\n';
+
+    gulp.src(disFolder + '*.js')
+        .pipe(insert.prepend(string))
+        .pipe(gulp.dest(disFolder));
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/index.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/index.js b/ui/bower_components/angular-smart-table/index.js
new file mode 100644
index 0000000..dd10701
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/index.js
@@ -0,0 +1,2 @@
+require('./dist/smart-table.js');
+module.exports = 'smart-table';
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/package.json
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/package.json b/ui/bower_components/angular-smart-table/package.json
new file mode 100644
index 0000000..a746451
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/package.json
@@ -0,0 +1,29 @@
+{
+  "name": "angular-smart-table",
+  "version": "2.1.7",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "node ./node_modules/.bin/gulp karma-CI"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/lorenzofox3/Smart-Table.git"
+  },
+  "author": "Laurent Renard",
+  "license": "MIT",
+  "devDependencies": {
+    "gulp": "^3.8.7",
+    "gulp-concat": "^2.3.4",
+    "gulp-insert": "^0.4.0",
+    "gulp-jshint": "^1.8.4",
+    "gulp-sourcemaps": "^1.3.0",
+    "gulp-uglify": "^0.3.1",
+    "jshint-stylish": "^0.4.0",
+    "karma": "^0.12.21",
+    "karma-chrome-launcher": "^0.1.4",
+    "karma-coverage": "^0.2.6",
+    "karma-jasmine": "^0.1.5",
+    "karma-phantomjs-launcher": "^0.1.4"
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/readme.md
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/readme.md b/ui/bower_components/angular-smart-table/readme.md
new file mode 100644
index 0000000..bc069ad
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/readme.md
@@ -0,0 +1,72 @@
+[![Build Status](https://travis-ci.org/lorenzofox3/Smart-Table.svg?branch=master)](https://travis-ci.org/lorenzofox3/Smart-Table)
+
+# Smart Table
+[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/lorenzofox3/Smart-Table?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+Smart Table is a table module for angular js. It allows you to quickly compose your table in a declarative way including sorting, filtering, row selection, and pagination.
+It is lightweight (around 3kb minified) and has no other dependencies than Angular itself.
+Check the [documentation](http://lorenzofox3.github.io/smart-table-website/) website for more details
+
+## Submitting an issue
+
+Please be responsible -- investigate potential issues yourself to eliminate the possibility that your issue isn't just an error.  If you are still having problems, try posting on our [gitter](https://gitter.im/lorenzofox3/Smart-Table).  When submitting an issue try as much as possible to:
+
+1. Search in the already existing issues or on [stackoverflow](http://stackoverflow.com/questions/tagged/smart-table?sort=newest&pageSize=30) if your issue has not been raised before.
+
+2. Give a precise description mentionning angular version, smart-table version.
+
+3. Give a way to reproduce your issue, the best would be with a <strong>running example</strong>, you can use [plunkr](http://plnkr.co/) (smart-table is the list of available packages). Note if you want to mimic ajax loading behaviour you can use [$timeout](https://docs.angularjs.org/api/ng/service/$timeout) angular service or [$httpBackend](https://docs.angularjs.org/api/ng/service/$httpBackend).
+
+4. Isolate your code sample on the probable issue to avoid pollution and noise.
+
+5. Close your issue when a solution has been found (and share it with the community).
+
+Note that 80% of the open issues are actually not issues but due to lack of good investigation. These issues create unnecessary work, so please be considerate.
+
+Any open issue which do not follow the steps above will be closed without investigation.
+
+## Install
+
+The easiest way is to run `bower install angular-smart-table`, then you just have to add the script and register the module `smart-table` to you application.
+
+## Test
+
+Run `npm install` after you have installed the dependencies (`npm install` and `bower install`).
+
+## Custom builds
+
+Smart Table is based around a main directive which generate a top level controller whose API can be accessed by sub directives
+(plugins). If you don't need some of these, simply edit the gulpfile (the pluginList variable) and run `gulp build`.
+
+## Older versions
+
+Smart Table used to be configuration based and if you rely on this version, you can still access the code on the [0.2.x](https://github.com/lorenzofox3/Smart-Table/tree/vx.2.x) branch. You will be able to find the documentation related to this version
+[here](https://github.com/lorenzofox3/smart-table-website) (simply open index.html in a browser).
+
+Note, I have closed all the issues related to these versions as people get confused when reading these issues and commented on them like it was related to the newer version. Feel free to reopen any of them (or open a new one), but don't forget to mention it is related to the older versions.
+
+## License
+
+Smart Table module is under MIT license:
+
+> Copyright (C) 2015 Laurent Renard.
+>
+> Permission is hereby granted, free of charge, to any person
+> obtaining a copy of this software and associated documentation files
+> (the "Software"), to deal in the Software without restriction,
+> including without limitation the rights to use, copy, modify, merge,
+> publish, distribute, sublicense, and/or sell copies of the Software,
+> and to permit persons to whom the Software is furnished to do so,
+> subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+> BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+> ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+> SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/bottom.txt
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/bottom.txt b/ui/bower_components/angular-smart-table/src/bottom.txt
new file mode 100644
index 0000000..0384cb1
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/bottom.txt
@@ -0,0 +1 @@
+})(angular);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/smart-table.module.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/smart-table.module.js b/ui/bower_components/angular-smart-table/src/smart-table.module.js
new file mode 100644
index 0000000..104ea27
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/smart-table.module.js
@@ -0,0 +1,7 @@
+ng.module('smart-table', []).run(['$templateCache', function ($templateCache) {
+    $templateCache.put('template/smart-table/pagination.html',
+        '<nav ng-if="numPages && pages.length >= 2"><ul class="pagination">' +
+        '<li ng-repeat="page in pages" ng-class="{active: page==currentPage}"><a ng-click="selectPage(page)">{{page}}</a></li>' +
+        '</ul></nav>');
+}]);
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stConfig.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stConfig.js b/ui/bower_components/angular-smart-table/src/stConfig.js
new file mode 100644
index 0000000..ae9fbde
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stConfig.js
@@ -0,0 +1,25 @@
+ng.module('smart-table')
+  .constant('stConfig', {
+    pagination: {
+      template: 'template/smart-table/pagination.html',
+      itemsByPage: 10,
+      displayedPages: 5
+    },
+    search: {
+      delay: 400, // ms
+      inputEvent: 'input'
+    },
+    select: {
+      mode: 'single',
+      selectedClass: 'st-selected'
+    },
+    sort: {
+      ascentClass: 'st-sort-ascent',
+      descentClass: 'st-sort-descent',
+      skipNatural: false,
+      delay:300
+    },
+    pipe: {
+      delay: 100 //ms
+    }
+  });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stPagination.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stPagination.js b/ui/bower_components/angular-smart-table/src/stPagination.js
new file mode 100644
index 0000000..fa27bfc
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stPagination.js
@@ -0,0 +1,80 @@
+ng.module('smart-table')
+  .directive('stPagination', ['stConfig', function (stConfig) {
+    return {
+      restrict: 'EA',
+      require: '^stTable',
+      scope: {
+        stItemsByPage: '=?',
+        stDisplayedPages: '=?',
+        stPageChange: '&'
+      },
+      templateUrl: function (element, attrs) {
+        if (attrs.stTemplate) {
+          return attrs.stTemplate;
+        }
+        return stConfig.pagination.template;
+      },
+      link: function (scope, element, attrs, ctrl) {
+
+        scope.stItemsByPage = scope.stItemsByPage ? +(scope.stItemsByPage) : stConfig.pagination.itemsByPage;
+        scope.stDisplayedPages = scope.stDisplayedPages ? +(scope.stDisplayedPages) : stConfig.pagination.displayedPages;
+
+        scope.currentPage = 1;
+        scope.pages = [];
+
+        function redraw () {
+          var paginationState = ctrl.tableState().pagination;
+          var start = 1;
+          var end;
+          var i;
+          var prevPage = scope.currentPage;
+          scope.totalItemCount = paginationState.totalItemCount;
+          scope.currentPage = Math.floor(paginationState.start / paginationState.number) + 1;
+
+          start = Math.max(start, scope.currentPage - Math.abs(Math.floor(scope.stDisplayedPages / 2)));
+          end = start + scope.stDisplayedPages;
+
+          if (end > paginationState.numberOfPages) {
+            end = paginationState.numberOfPages + 1;
+            start = Math.max(1, end - scope.stDisplayedPages);
+          }
+
+          scope.pages = [];
+          scope.numPages = paginationState.numberOfPages;
+
+          for (i = start; i < end; i++) {
+            scope.pages.push(i);
+          }
+
+          if (prevPage !== scope.currentPage) {
+            scope.stPageChange({newPage: scope.currentPage});
+          }
+        }
+
+        //table state --> view
+        scope.$watch(function () {
+          return ctrl.tableState().pagination;
+        }, redraw, true);
+
+        //scope --> table state  (--> view)
+        scope.$watch('stItemsByPage', function (newValue, oldValue) {
+          if (newValue !== oldValue) {
+            scope.selectPage(1);
+          }
+        });
+
+        scope.$watch('stDisplayedPages', redraw);
+
+        //view -> table state
+        scope.selectPage = function (page) {
+          if (page > 0 && page <= scope.numPages) {
+            ctrl.slice((page - 1) * scope.stItemsByPage, scope.stItemsByPage);
+          }
+        };
+
+        if (!ctrl.tableState().pagination.number) {
+          ctrl.slice(0, scope.stItemsByPage);
+        }
+      }
+    };
+  }]);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stPipe.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stPipe.js b/ui/bower_components/angular-smart-table/src/stPipe.js
new file mode 100644
index 0000000..8ac1288
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stPipe.js
@@ -0,0 +1,36 @@
+ng.module('smart-table')
+  .directive('stPipe', ['stConfig', '$timeout', function (config, $timeout) {
+    return {
+      require: 'stTable',
+      scope: {
+        stPipe: '='
+      },
+      link: {
+
+        pre: function (scope, element, attrs, ctrl) {
+
+          var pipePromise = null;
+
+          if (ng.isFunction(scope.stPipe)) {
+            ctrl.preventPipeOnWatch();
+            ctrl.pipe = function () {
+
+              if (pipePromise !== null) {
+                $timeout.cancel(pipePromise)
+              }
+
+              pipePromise = $timeout(function () {
+                scope.stPipe(ctrl.tableState(), ctrl);
+              }, config.pipe.delay);
+
+              return pipePromise;
+            }
+          }
+        },
+
+        post: function (scope, element, attrs, ctrl) {
+          ctrl.pipe();
+        }
+      }
+    };
+  }]);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stSearch.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stSearch.js b/ui/bower_components/angular-smart-table/src/stSearch.js
new file mode 100644
index 0000000..6105fbe
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stSearch.js
@@ -0,0 +1,43 @@
+ng.module('smart-table')
+  .directive('stSearch', ['stConfig', '$timeout','$parse', function (stConfig, $timeout, $parse) {
+    return {
+      require: '^stTable',
+      link: function (scope, element, attr, ctrl) {
+        var tableCtrl = ctrl;
+        var promise = null;
+        var throttle = attr.stDelay || stConfig.search.delay;
+        var event = attr.stInputEvent || stConfig.search.inputEvent;
+
+        attr.$observe('stSearch', function (newValue, oldValue) {
+          var input = element[0].value;
+          if (newValue !== oldValue && input) {
+            ctrl.tableState().search = {};
+            tableCtrl.search(input, newValue);
+          }
+        });
+
+        //table state -> view
+        scope.$watch(function () {
+          return ctrl.tableState().search;
+        }, function (newValue, oldValue) {
+          var predicateExpression = attr.stSearch || '$';
+          if (newValue.predicateObject && $parse(predicateExpression)(newValue.predicateObject) !== element[0].value) {
+            element[0].value = $parse(predicateExpression)(newValue.predicateObject) || '';
+          }
+        }, true);
+
+        // view -> table state
+        element.bind(event, function (evt) {
+          evt = evt.originalEvent || evt;
+          if (promise !== null) {
+            $timeout.cancel(promise);
+          }
+
+          promise = $timeout(function () {
+            tableCtrl.search(evt.target.value, attr.stSearch || '');
+            promise = null;
+          }, throttle);
+        });
+      }
+    };
+  }]);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stSelectRow.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stSelectRow.js b/ui/bower_components/angular-smart-table/src/stSelectRow.js
new file mode 100644
index 0000000..188408f
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stSelectRow.js
@@ -0,0 +1,26 @@
+ng.module('smart-table')
+  .directive('stSelectRow', ['stConfig', function (stConfig) {
+    return {
+      restrict: 'A',
+      require: '^stTable',
+      scope: {
+        row: '=stSelectRow'
+      },
+      link: function (scope, element, attr, ctrl) {
+        var mode = attr.stSelectMode || stConfig.select.mode;
+        element.bind('click', function () {
+          scope.$apply(function () {
+            ctrl.select(scope.row, mode);
+          });
+        });
+
+        scope.$watch('row.isSelected', function (newValue) {
+          if (newValue === true) {
+            element.addClass(stConfig.select.selectedClass);
+          } else {
+            element.removeClass(stConfig.select.selectedClass);
+          }
+        });
+      }
+    };
+  }]);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stSort.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stSort.js b/ui/bower_components/angular-smart-table/src/stSort.js
new file mode 100644
index 0000000..bd249af
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stSort.js
@@ -0,0 +1,82 @@
+ng.module('smart-table')
+  .directive('stSort', ['stConfig', '$parse', '$timeout', function (stConfig, $parse, $timeout) {
+    return {
+      restrict: 'A',
+      require: '^stTable',
+      link: function (scope, element, attr, ctrl) {
+
+        var predicate = attr.stSort;
+        var getter = $parse(predicate);
+        var index = 0;
+        var classAscent = attr.stClassAscent || stConfig.sort.ascentClass;
+        var classDescent = attr.stClassDescent || stConfig.sort.descentClass;
+        var stateClasses = [classAscent, classDescent];
+        var sortDefault;
+        var skipNatural = attr.stSkipNatural !== undefined ? attr.stSkipNatural : stConfig.sort.skipNatural;
+        var descendingFirst = attr.stDescendingFirst === 'true';
+        var promise = null;
+        var throttle = attr.stDelay || stConfig.sort.delay;
+
+        if (attr.stSortDefault) {
+          sortDefault = scope.$eval(attr.stSortDefault) !== undefined ? scope.$eval(attr.stSortDefault) : attr.stSortDefault;
+        }
+
+        //view --> table state
+        function sort () {
+          if (descendingFirst) {
+            index = index === 0 ? 2 : index - 1;
+          } else {
+            index++;
+          }
+
+          var func;
+          predicate = ng.isFunction(getter(scope)) || ng.isArray(getter(scope)) ? getter(scope) : attr.stSort;
+          if (index % 3 === 0 && !!skipNatural !== true) {
+            //manual reset
+            index = 0;
+            ctrl.tableState().sort = {};
+            ctrl.tableState().pagination.start = 0;
+            func = ctrl.pipe.bind(ctrl);
+          } else {
+            func = ctrl.sortBy.bind(ctrl, predicate, index % 2 === 0);
+          }
+          if (promise !== null) {
+            $timeout.cancel(promise);
+          }
+          if (throttle < 0) {
+            func();
+          } else {
+            promise = $timeout(func, throttle);
+          }
+        }
+
+        element.bind('click', function sortClick () {
+          if (predicate) {
+            scope.$apply(sort);
+          }
+        });
+
+        if (sortDefault) {
+          index = sortDefault === 'reverse' ? 1 : 0;
+          sort();
+        }
+
+        //table state --> view
+        scope.$watch(function () {
+          return ctrl.tableState().sort;
+        }, function (newValue) {
+          if (newValue.predicate !== predicate) {
+            index = 0;
+            element
+              .removeClass(classAscent)
+              .removeClass(classDescent);
+          } else {
+            index = newValue.reverse === true ? 2 : 1;
+            element
+              .removeClass(stateClasses[index % 2])
+              .addClass(stateClasses[index - 1]);
+          }
+        }, true);
+      }
+    };
+  }]);

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/stTable.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/stTable.js b/ui/bower_components/angular-smart-table/src/stTable.js
new file mode 100644
index 0000000..429d8b6
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/stTable.js
@@ -0,0 +1,219 @@
+ng.module('smart-table')
+  .controller('stTableController', ['$scope', '$parse', '$filter', '$attrs', function StTableController ($scope, $parse, $filter, $attrs) {
+    var propertyName = $attrs.stTable;
+    var displayGetter = $parse(propertyName);
+    var displaySetter = displayGetter.assign;
+    var safeGetter;
+    var orderBy = $filter('orderBy');
+    var filter = $filter('filter');
+    var safeCopy = copyRefs(displayGetter($scope));
+    var tableState = {
+      sort: {},
+      search: {},
+      pagination: {
+        start: 0,
+        totalItemCount: 0
+      }
+    };
+    var filtered;
+    var pipeAfterSafeCopy = true;
+    var ctrl = this;
+    var lastSelected;
+
+    function copyRefs (src) {
+      return src ? [].concat(src) : [];
+    }
+
+    function updateSafeCopy () {
+      safeCopy = copyRefs(safeGetter($scope));
+      if (pipeAfterSafeCopy === true) {
+        ctrl.pipe();
+      }
+    }
+
+    function deepDelete (object, path) {
+      if (path.indexOf('.') != -1) {
+        var partials = path.split('.');
+        var key = partials.pop();
+        var parentPath = partials.join('.');
+        var parentObject = $parse(parentPath)(object)
+        delete parentObject[key];
+        if (Object.keys(parentObject).length == 0) {
+          deepDelete(object, parentPath);
+        }
+      } else {
+        delete object[path];
+      }
+    }
+
+    if ($attrs.stSafeSrc) {
+      safeGetter = $parse($attrs.stSafeSrc);
+      $scope.$watch(function () {
+        var safeSrc = safeGetter($scope);
+        return safeSrc && safeSrc.length ? safeSrc[0] : undefined;
+      }, function (newValue, oldValue) {
+        if (newValue !== oldValue) {
+          updateSafeCopy();
+        }
+      });
+      $scope.$watch(function () {
+        var safeSrc = safeGetter($scope);
+        return safeSrc ? safeSrc.length : 0;
+      }, function (newValue, oldValue) {
+        if (newValue !== safeCopy.length) {
+          updateSafeCopy();
+        }
+      });
+      $scope.$watch(function () {
+        return safeGetter($scope);
+      }, function (newValue, oldValue) {
+        if (newValue !== oldValue) {
+          tableState.pagination.start = 0;
+          updateSafeCopy();
+        }
+      });
+    }
+
+    /**
+     * sort the rows
+     * @param {Function | String} predicate - function or string which will be used as predicate for the sorting
+     * @param [reverse] - if you want to reverse the order
+     */
+    this.sortBy = function sortBy (predicate, reverse) {
+      tableState.sort.predicate = predicate;
+      tableState.sort.reverse = reverse === true;
+
+      if (ng.isFunction(predicate)) {
+        tableState.sort.functionName = predicate.name;
+      } else {
+        delete tableState.sort.functionName;
+      }
+
+      tableState.pagination.start = 0;
+      return this.pipe();
+    };
+
+    /**
+     * search matching rows
+     * @param {String} input - the input string
+     * @param {String} [predicate] - the property name against you want to check the match, otherwise it will search on all properties
+     */
+    this.search = function search (input, predicate) {
+      var predicateObject = tableState.search.predicateObject || {};
+      var prop = predicate ? predicate : '$';
+
+      input = ng.isString(input) ? input.trim() : input;
+      $parse(prop).assign(predicateObject, input);
+      // to avoid to filter out null value
+      if (!input) {
+        deepDelete(predicateObject, prop);
+      }
+      tableState.search.predicateObject = predicateObject;
+      tableState.pagination.start = 0;
+      return this.pipe();
+    };
+
+    /**
+     * this will chain the operations of sorting and filtering based on the current table state (sort options, filtering, ect)
+     */
+    this.pipe = function pipe () {
+      var pagination = tableState.pagination;
+      var output;
+      filtered = tableState.search.predicateObject ? filter(safeCopy, tableState.search.predicateObject) : safeCopy;
+      if (tableState.sort.predicate) {
+        filtered = orderBy(filtered, tableState.sort.predicate, tableState.sort.reverse);
+      }
+      pagination.totalItemCount = filtered.length;
+      if (pagination.number !== undefined) {
+        pagination.numberOfPages = filtered.length > 0 ? Math.ceil(filtered.length / pagination.number) : 1;
+        pagination.start = pagination.start >= filtered.length ? (pagination.numberOfPages - 1) * pagination.number : pagination.start;
+        output = filtered.slice(pagination.start, pagination.start + parseInt(pagination.number));
+      }
+      displaySetter($scope, output || filtered);
+    };
+
+    /**
+     * select a dataRow (it will add the attribute isSelected to the row object)
+     * @param {Object} row - the row to select
+     * @param {String} [mode] - "single" or "multiple" (multiple by default)
+     */
+    this.select = function select (row, mode) {
+      var rows = copyRefs(displayGetter($scope));
+      var index = rows.indexOf(row);
+      if (index !== -1) {
+        if (mode === 'single') {
+          row.isSelected = row.isSelected !== true;
+          if (lastSelected) {
+            lastSelected.isSelected = false;
+          }
+          lastSelected = row.isSelected === true ? row : undefined;
+        } else {
+          rows[index].isSelected = !rows[index].isSelected;
+        }
+      }
+    };
+
+    /**
+     * take a slice of the current sorted/filtered collection (pagination)
+     *
+     * @param {Number} start - start index of the slice
+     * @param {Number} number - the number of item in the slice
+     */
+    this.slice = function splice (start, number) {
+      tableState.pagination.start = start;
+      tableState.pagination.number = number;
+      return this.pipe();
+    };
+
+    /**
+     * return the current state of the table
+     * @returns {{sort: {}, search: {}, pagination: {start: number}}}
+     */
+    this.tableState = function getTableState () {
+      return tableState;
+    };
+
+    this.getFilteredCollection = function getFilteredCollection () {
+      return filtered || safeCopy;
+    };
+
+    /**
+     * Use a different filter function than the angular FilterFilter
+     * @param filterName the name under which the custom filter is registered
+     */
+    this.setFilterFunction = function setFilterFunction (filterName) {
+      filter = $filter(filterName);
+    };
+
+    /**
+     * Use a different function than the angular orderBy
+     * @param sortFunctionName the name under which the custom order function is registered
+     */
+    this.setSortFunction = function setSortFunction (sortFunctionName) {
+      orderBy = $filter(sortFunctionName);
+    };
+
+    /**
+     * Usually when the safe copy is updated the pipe function is called.
+     * Calling this method will prevent it, which is something required when using a custom pipe function
+     */
+    this.preventPipeOnWatch = function preventPipe () {
+      pipeAfterSafeCopy = false;
+    };
+  }])
+  .directive('stTable', function () {
+    return {
+      restrict: 'A',
+      controller: 'stTableController',
+      link: function (scope, element, attr, ctrl) {
+
+        if (attr.stSetFilter) {
+          ctrl.setFilterFunction(attr.stSetFilter);
+        }
+
+        if (attr.stSetSort) {
+          ctrl.setSortFunction(attr.stSetSort);
+        }
+      }
+    };
+  });

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-smart-table/src/top.txt
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-smart-table/src/top.txt b/ui/bower_components/angular-smart-table/src/top.txt
new file mode 100644
index 0000000..03a2484
--- /dev/null
+++ b/ui/bower_components/angular-smart-table/src/top.txt
@@ -0,0 +1,2 @@
+(function (ng, undefined){
+    'use strict';

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/.bower.json
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/.bower.json b/ui/bower_components/angular-spinner/.bower.json
new file mode 100644
index 0000000..fe51c43
--- /dev/null
+++ b/ui/bower_components/angular-spinner/.bower.json
@@ -0,0 +1,30 @@
+{
+  "name": "angular-spinner",
+  "description": "Angular directive to show an animated spinner (using spin.js)",
+  "main": "./angular-spinner.js",
+  "author": "Uri Shaked",
+  "license": "MIT",
+  "homepage": "https://github.com/urish/angular-spinner",
+  "ignore": [],
+  "dependencies": {
+    "angular": "~1.x",
+    "spin.js": "~2.x"
+  },
+  "devDependencies": {
+    "angular-mocks": "~1.x"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/urish/angular-spinner.git"
+  },
+  "version": "0.8.0",
+  "_release": "0.8.0",
+  "_resolution": {
+    "type": "version",
+    "tag": "0.8.0",
+    "commit": "d2e36c571a0c051c4f80f436bb15547d51e3c89b"
+  },
+  "_source": "https://github.com/Attrash-Islam/bower-angular-spinner.git",
+  "_target": "0.8.0",
+  "_originalSource": "angular-spinner"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/.editorconfig
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/.editorconfig b/ui/bower_components/angular-spinner/.editorconfig
new file mode 100644
index 0000000..3f4927e
--- /dev/null
+++ b/ui/bower_components/angular-spinner/.editorconfig
@@ -0,0 +1,20 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+
+# Change these settings to your own preference
+indent_style = tab
+indent_size = 4
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/.gitignore
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/.gitignore b/ui/bower_components/angular-spinner/.gitignore
new file mode 100644
index 0000000..2a9c393
--- /dev/null
+++ b/ui/bower_components/angular-spinner/.gitignore
@@ -0,0 +1,4 @@
+.idea
+bower_components
+node_modules
+coverage

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/.jshintrc
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/.jshintrc b/ui/bower_components/angular-spinner/.jshintrc
new file mode 100644
index 0000000..10753a8
--- /dev/null
+++ b/ui/bower_components/angular-spinner/.jshintrc
@@ -0,0 +1,36 @@
+{
+	"node": true,
+	"browser": true,
+	"esnext": true,
+	"bitwise": true,
+	"camelcase": true,
+	"curly": true,
+	"eqeqeq": true,
+	"immed": true,
+	"indent": 2,
+	"latedef": true,
+	"newcap": true,
+	"noarg": true,
+	"quotmark": "single",
+	"regexp": true,
+	"undef": true,
+	"unused": true,
+	"strict": true,
+	"trailing": true,
+	"smarttabs": true,
+	"maxdepth": 2,
+	"maxcomplexity": 7,
+	"globals": {
+		"angular": false,
+		"define": false,
+
+		"jasmine": false,
+		"expect": false,
+		"beforeEach": false,
+		"afterEach": false,
+		"describe": false,
+		"inject": true,
+		"it": false,
+		"spyOn": false
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/.npmignore
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/.npmignore b/ui/bower_components/angular-spinner/.npmignore
new file mode 100644
index 0000000..2a9c393
--- /dev/null
+++ b/ui/bower_components/angular-spinner/.npmignore
@@ -0,0 +1,4 @@
+.idea
+bower_components
+node_modules
+coverage

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/.travis.yml
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/.travis.yml b/ui/bower_components/angular-spinner/.travis.yml
new file mode 100644
index 0000000..3c19a09
--- /dev/null
+++ b/ui/bower_components/angular-spinner/.travis.yml
@@ -0,0 +1,9 @@
+language: node_js
+sudo: false
+node_js:
+  - 0.12
+before_script:
+  - npm install -g bower@1.5.x grunt-cli@~0.1.9
+  - bower install
+after_success:
+  - cat ./coverage/*/lcov.info | ./node_modules/coveralls/bin/coveralls.js

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/CHANGELOG.md
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/CHANGELOG.md b/ui/bower_components/angular-spinner/CHANGELOG.md
new file mode 100644
index 0000000..7571e51
--- /dev/null
+++ b/ui/bower_components/angular-spinner/CHANGELOG.md
@@ -0,0 +1,49 @@
+# Changelog
+
+## 0.8.0 - 2015-10-29
+- Improve UMD (Universal Module Definition) code, fixes ([#61](https://github.com/urish/angular-spinner/issues/61))
+- Theme support ([#66](https://github.com/urish/angular-spinner/pull/66), contributed by [marknadig](https://github.com/marknadig))
+- Add `spinner-on` attribute ([#71](https://github.com/urish/angular-spinner/pull/71), contributed by [marknadig](https://github.com/marknadig))
+
+## 0.7.0 - 2015-09-09
+- Add CommonJS support, improve AMD support (for use with browserify, webpack, SystemJS, etc.)
+
+## 0.6.2 - 2015-07-02
+- Relax Angular's dependency version lock ([#52](https://github.com/urish/angular-spinner/pull/52), contributed by [gottfrois](https://github.com/gottfrois))
+
+## 0.6.1 - 2015-01-06
+- Removed NBSP characters from source code ([#40](https://github.com/urish/angular-spinner/pull/40), contributed by [amolghotankar](https://github.com/amolghotankar))
+- Return the created AngularJS module ([#37](https://github.com/urish/angular-spinner/pull/37), contributed by [k7sleeper](https://github.com/k7sleeper))
+
+## 0.6.0 - 2014-12-12
+- Added configurable default options ([#31](https://github.com/urish/angular-spinner/pull/31), contributed by [aleksih](https://github.com/aleksih))
+- Added scope eval to allow for data binding support ([#21](https://github.com/urish/angular-spinner/pull/21), contributed by [jdamick](https://github.com/jdamick))
+
+## 0.5.1 - 2014-08-09
+- AMD / Require.js compatibility ([#11](https://github.com/urish/angular-spinner/pull/11), contributed by [floribon](https://github.com/floribon))
+- Bugfix: Stop events are ignored if sent before the directive is fully initialized and `startActive` is true ([#22](https://github.com/urish/angular-spinner/pull/22), contributed by [vleborgne](https://github.com/vleborgne))
+
+## 0.5.0 - 2014-06-03
+
+- Add support for expressions in attributes ([#12](https://github.com/urish/angular-spinner/pull/12), contributed by [aaronroberson](https://github.com/aaronroberson))
+- Generate source map for the minified version ([#14](https://github.com/urish/angular-spinner/issues/14))
+- Add a `main` field to package.json ([#15](https://github.com/urish/angular-spinner/pull/15), contributed by [elfreyshira](https://github.com/elfreyshira))
+- Enable support for AngularJS 1.3.x in bower.json
+
+## 0.4.0 - 2014-03-15
+
+- Upgrade spin.js to 2.0.0. See breaking changes [here](http://fgnass.github.io/spin.js/#v2.0.0).
+
+## 0.3.1 - 2014-01-31
+
+- Fixed an issue that caused the minified code to fail.
+
+## 0.3.0 - 2014-01-26
+
+- Add ability to control spinner state with bundled service (([#6](https://github.com/urish/angular-spinner/pull/6), contributed by [lossendae](https://github.com/lossendae))
+
+## 0.2.1 - 2013-08-28
+
+- Add test coverage reporting
+- Stop the spinner on scope destroy
+- Support for AngularJS 1.2

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/bc1ffbcd/ui/bower_components/angular-spinner/Gruntfile.js
----------------------------------------------------------------------
diff --git a/ui/bower_components/angular-spinner/Gruntfile.js b/ui/bower_components/angular-spinner/Gruntfile.js
new file mode 100644
index 0000000..b1912ac
--- /dev/null
+++ b/ui/bower_components/angular-spinner/Gruntfile.js
@@ -0,0 +1,51 @@
+/* License: MIT.
+ * Copyright (C) 2013, 2014, Uri Shaked and contributors.
+ */
+
+'use strict';
+
+module.exports = function (grunt) {
+	// Load grunt tasks automatically
+	require('load-grunt-tasks')(grunt);
+
+	grunt.initConfig({
+		karma: {
+			unit: {
+				configFile: 'karma.conf.js',
+				singleRun: true
+			}
+		},
+		jshint: {
+			options: {
+				jshintrc: '.jshintrc'
+			},
+			all: [
+				'Gruntfile.js',
+				'angular-spinner.js',
+				'tests.js',
+				'karma.conf.js'
+			]
+		},
+		uglify: {
+			dist: {
+				options: {
+					sourceMap: true
+				},
+				files: {
+					'angular-spinner.min.js': 'angular-spinner.js'
+				}
+			}
+		}
+	});
+
+	grunt.registerTask('test', [
+		'jshint',
+		'karma'
+	]);
+
+	grunt.registerTask('build', [
+		'uglify'
+	]);
+
+	grunt.registerTask('default', ['build']);
+};