sw2at-ui 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (387) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/Gemfile +21 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +19 -0
  6. data/Rakefile +51 -0
  7. data/VERSION +1 -0
  8. data/app/assets/images/swat/loading-green.gif +0 -0
  9. data/app/assets/javascripts/swat/.bowerrc +3 -0
  10. data/app/assets/javascripts/swat/app/app.coffee +38 -0
  11. data/app/assets/javascripts/swat/app/controllers/revision.coffee +25 -0
  12. data/app/assets/javascripts/swat/app/controllers/revisions.coffee +10 -0
  13. data/app/assets/javascripts/swat/app/controllers/root.coffee +8 -0
  14. data/app/assets/javascripts/swat/app/factories/response.coffee +9 -0
  15. data/app/assets/javascripts/swat/app/factories/revision_model.coffee +20 -0
  16. data/app/assets/javascripts/swat/app/services/revision.coffee +16 -0
  17. data/app/assets/javascripts/swat/app/services/test_case.coffee +8 -0
  18. data/app/assets/javascripts/swat/application.coffee +5 -0
  19. data/app/assets/javascripts/swat/bower.json +16 -0
  20. data/app/assets/javascripts/swat/bower_components/angular/angular-csp.css +21 -0
  21. data/app/assets/javascripts/swat/bower_components/angular/angular.js +28133 -0
  22. data/app/assets/javascripts/swat/bower_components/angular/angular.min.js +289 -0
  23. data/app/assets/javascripts/swat/bower_components/angular/index.js +2 -0
  24. data/app/assets/javascripts/swat/bower_components/angular-animate/angular-animate.js +2137 -0
  25. data/app/assets/javascripts/swat/bower_components/angular-animate/angular-animate.min.js +33 -0
  26. data/app/assets/javascripts/swat/bower_components/angular-aria/angular-aria.js +339 -0
  27. data/app/assets/javascripts/swat/bower_components/angular-aria/angular-aria.min.js +12 -0
  28. data/app/assets/javascripts/swat/bower_components/angular-bootstrap/ui-bootstrap-csp.css +6 -0
  29. data/app/assets/javascripts/swat/bower_components/angular-bootstrap/ui-bootstrap-tpls.js +4840 -0
  30. data/app/assets/javascripts/swat/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js +10 -0
  31. data/app/assets/javascripts/swat/bower_components/angular-bootstrap/ui-bootstrap.js +4461 -0
  32. data/app/assets/javascripts/swat/bower_components/angular-bootstrap/ui-bootstrap.min.js +9 -0
  33. data/app/assets/javascripts/swat/bower_components/angular-material/LICENSE.txt +21 -0
  34. data/app/assets/javascripts/swat/bower_components/angular-material/angular-material.css +6228 -0
  35. data/app/assets/javascripts/swat/bower_components/angular-material/angular-material.js +8602 -0
  36. data/app/assets/javascripts/swat/bower_components/angular-material/angular-material.min.css +6 -0
  37. data/app/assets/javascripts/swat/bower_components/angular-material/angular-material.min.js +277 -0
  38. data/app/assets/javascripts/swat/bower_components/angular-material/default-theme.css +394 -0
  39. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/backdrop/backdrop-default-theme.css +8 -0
  40. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/backdrop/backdrop.css +54 -0
  41. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/backdrop/backdrop.js +40 -0
  42. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet-default-theme.css +15 -0
  43. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.css +161 -0
  44. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.js +263 -0
  45. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/button/button-default-theme.css +49 -0
  46. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/button/button.css +134 -0
  47. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/button/button.js +101 -0
  48. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/card/card-default-theme.css +10 -0
  49. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/card/card.css +26 -0
  50. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/card/card.js +60 -0
  51. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/checkbox/checkbox-default-theme.css +38 -0
  52. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/checkbox/checkbox.css +78 -0
  53. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/checkbox/checkbox.js +135 -0
  54. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/content/content-default-theme.css +8 -0
  55. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/content/content.css +24 -0
  56. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/content/content.js +87 -0
  57. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/core/core.css +2736 -0
  58. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/core/core.js +3090 -0
  59. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/core/default-theme.js +1 -0
  60. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/dialog/dialog-default-theme.css +11 -0
  61. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/dialog/dialog.css +75 -0
  62. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/dialog/dialog.js +500 -0
  63. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/divider/divider-default-theme.css +8 -0
  64. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/divider/divider.css +12 -0
  65. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/divider/divider.js +50 -0
  66. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/icon/icon.css +24 -0
  67. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/icon/icon.js +52 -0
  68. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/input/input-default-theme.css +39 -0
  69. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/input/input.css +113 -0
  70. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/input/input.js +355 -0
  71. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/list/list.css +56 -0
  72. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/list/list.js +96 -0
  73. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/menu/menu.css +6 -0
  74. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/menu/menu.js +29 -0
  75. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/progressCircular/progressCircular-default-theme.css +35 -0
  76. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/progressCircular/progressCircular.css +1395 -0
  77. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/progressCircular/progressCircular.js +129 -0
  78. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/progressLinear/progressLinear-default-theme.css +26 -0
  79. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/progressLinear/progressLinear.css +366 -0
  80. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/progressLinear/progressLinear.js +130 -0
  81. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/radioButton/radioButton-default-theme.css +39 -0
  82. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/radioButton/radioButton.css +66 -0
  83. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/radioButton/radioButton.js +302 -0
  84. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/sidenav/sidenav-default-theme.css +8 -0
  85. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/sidenav/sidenav.css +86 -0
  86. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/sidenav/sidenav.js +320 -0
  87. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/slider/slider-default-theme.css +55 -0
  88. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/slider/slider.css +210 -0
  89. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/slider/slider.js +391 -0
  90. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/sticky/sticky.css +20 -0
  91. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/sticky/sticky.js +314 -0
  92. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/subheader/subheader-default-theme.css +15 -0
  93. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/subheader/subheader.css +62 -0
  94. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/subheader/subheader.js +89 -0
  95. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/swipe/swipe.js +79 -0
  96. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/switch/switch-default-theme.css +29 -0
  97. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/switch/switch.css +81 -0
  98. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/switch/switch.js +171 -0
  99. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/tabs/tabs-default-theme.css +34 -0
  100. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/tabs/tabs.css +171 -0
  101. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/tabs/tabs.js +1009 -0
  102. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/textField/textField-default-theme.css +29 -0
  103. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/textField/textField.css +72 -0
  104. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/textField/textField.js +145 -0
  105. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/toast/toast-default-theme.css +17 -0
  106. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/toast/toast.css +110 -0
  107. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/toast/toast.js +236 -0
  108. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/toolbar/toolbar-default-theme.css +17 -0
  109. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/toolbar/toolbar.css +69 -0
  110. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/toolbar/toolbar.js +161 -0
  111. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/tooltip/tooltip-default-theme.css +10 -0
  112. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/tooltip/tooltip.css +133 -0
  113. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/tooltip/tooltip.js +199 -0
  114. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/whiteframe/whiteframe.css +20 -0
  115. data/app/assets/javascripts/swat/bower_components/angular-material/modules/closure/whiteframe/whiteframe.js +17 -0
  116. data/app/assets/javascripts/swat/bower_components/angular-material/modules/css/angular-material-layout.css +2582 -0
  117. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/backdrop-default-theme.css +8 -0
  118. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/backdrop-default-theme.min.css +6 -0
  119. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/backdrop.css +54 -0
  120. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/backdrop.js +38 -0
  121. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/backdrop.min.css +6 -0
  122. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/backdrop.min.js +7 -0
  123. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/backdrop/bower.json +7 -0
  124. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bottomSheet-default-theme.css +15 -0
  125. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bottomSheet-default-theme.min.css +6 -0
  126. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.css +188 -0
  127. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.js +293 -0
  128. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.min.css +6 -0
  129. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.min.js +7 -0
  130. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/bottomSheet/bower.json +8 -0
  131. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/bower.json +7 -0
  132. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/button-default-theme.css +42 -0
  133. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/button-default-theme.min.css +6 -0
  134. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/button.css +132 -0
  135. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/button.js +94 -0
  136. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/button.min.css +6 -0
  137. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/button/button.min.js +7 -0
  138. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/bower.json +7 -0
  139. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/card-default-theme.css +10 -0
  140. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/card-default-theme.min.css +6 -0
  141. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/card.css +31 -0
  142. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/card.js +58 -0
  143. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/card.min.css +6 -0
  144. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/card/card.min.js +7 -0
  145. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/bower.json +7 -0
  146. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/checkbox-default-theme.css +38 -0
  147. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/checkbox-default-theme.min.css +6 -0
  148. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/checkbox.css +79 -0
  149. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/checkbox.js +133 -0
  150. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/checkbox.min.css +6 -0
  151. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/checkbox/checkbox.min.js +7 -0
  152. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/bower.json +7 -0
  153. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/content-default-theme.css +8 -0
  154. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/content-default-theme.min.css +6 -0
  155. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/content.css +24 -0
  156. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/content.js +60 -0
  157. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/content.min.css +6 -0
  158. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/content/content.min.js +7 -0
  159. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/core/bower.json +7 -0
  160. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/core/core.css +3067 -0
  161. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/core/core.js +2780 -0
  162. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/core/core.min.css +6 -0
  163. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/core/core.min.js +7 -0
  164. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/core/default-theme.js +1 -0
  165. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/bower.json +8 -0
  166. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/dialog-default-theme.css +11 -0
  167. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/dialog-default-theme.min.css +6 -0
  168. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/dialog.css +88 -0
  169. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/dialog.js +495 -0
  170. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/dialog.min.css +6 -0
  171. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/dialog/dialog.min.js +7 -0
  172. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/bower.json +7 -0
  173. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/divider-default-theme.css +8 -0
  174. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/divider-default-theme.min.css +6 -0
  175. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/divider.css +12 -0
  176. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/divider.js +48 -0
  177. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/divider.min.css +6 -0
  178. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/divider/divider.min.js +7 -0
  179. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/icon/bower.json +7 -0
  180. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/icon/icon.css +24 -0
  181. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/icon/icon.js +50 -0
  182. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/icon/icon.min.css +6 -0
  183. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/icon/icon.min.js +7 -0
  184. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/bower.json +7 -0
  185. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/input-default-theme.css +40 -0
  186. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/input-default-theme.min.css +6 -0
  187. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/input.css +102 -0
  188. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/input.js +333 -0
  189. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/input.min.css +6 -0
  190. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/input/input.min.js +7 -0
  191. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/list/bower.json +7 -0
  192. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/list/list.css +61 -0
  193. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/list/list.js +94 -0
  194. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/list/list.min.css +6 -0
  195. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/list/list.min.js +7 -0
  196. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/menu/bower.json +5 -0
  197. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/menu/menu.css +6 -0
  198. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/menu/menu.js +27 -0
  199. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/menu/menu.min.css +6 -0
  200. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/menu/menu.min.js +7 -0
  201. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/bower.json +7 -0
  202. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/progressCircular-default-theme.css +35 -0
  203. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/progressCircular-default-theme.min.css +6 -0
  204. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/progressCircular.css +1445 -0
  205. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/progressCircular.js +127 -0
  206. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/progressCircular.min.css +6 -0
  207. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressCircular/progressCircular.min.js +7 -0
  208. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/bower.json +7 -0
  209. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/progressLinear-default-theme.css +28 -0
  210. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/progressLinear-default-theme.min.css +6 -0
  211. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/progressLinear.css +368 -0
  212. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/progressLinear.js +128 -0
  213. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/progressLinear.min.css +6 -0
  214. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/progressLinear/progressLinear.min.js +7 -0
  215. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/bower.json +7 -0
  216. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/radioButton-default-theme.css +39 -0
  217. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/radioButton-default-theme.min.css +6 -0
  218. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/radioButton.css +67 -0
  219. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/radioButton.js +296 -0
  220. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/radioButton.min.css +6 -0
  221. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/radioButton/radioButton.min.js +7 -0
  222. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/bower.json +8 -0
  223. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/sidenav-default-theme.css +8 -0
  224. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/sidenav-default-theme.min.css +6 -0
  225. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/sidenav.css +90 -0
  226. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/sidenav.js +302 -0
  227. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/sidenav.min.css +6 -0
  228. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sidenav/sidenav.min.js +7 -0
  229. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/bower.json +7 -0
  230. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/slider-default-theme.css +55 -0
  231. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/slider-default-theme.min.css +6 -0
  232. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/slider.css +218 -0
  233. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/slider.js +411 -0
  234. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/slider.min.css +6 -0
  235. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/slider/slider.min.js +7 -0
  236. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sticky/bower.json +8 -0
  237. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sticky/sticky.css +20 -0
  238. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sticky/sticky.js +309 -0
  239. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sticky/sticky.min.css +6 -0
  240. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/sticky/sticky.min.js +7 -0
  241. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/bower.json +8 -0
  242. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/subheader-default-theme.css +15 -0
  243. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/subheader-default-theme.min.css +6 -0
  244. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/subheader.css +61 -0
  245. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/subheader.js +86 -0
  246. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/subheader.min.css +6 -0
  247. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/subheader/subheader.min.js +7 -0
  248. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/swipe/bower.json +5 -0
  249. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/swipe/swipe.js +213 -0
  250. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/swipe/swipe.min.js +7 -0
  251. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/bower.json +8 -0
  252. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/switch-default-theme.css +29 -0
  253. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/switch-default-theme.min.css +6 -0
  254. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/switch.css +77 -0
  255. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/switch.js +144 -0
  256. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/switch.min.css +6 -0
  257. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/switch/switch.min.js +7 -0
  258. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/bower.json +7 -0
  259. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/tabs-default-theme.css +34 -0
  260. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/tabs-default-theme.min.css +6 -0
  261. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/tabs.css +181 -0
  262. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/tabs.js +992 -0
  263. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/tabs.min.css +6 -0
  264. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tabs/tabs.min.js +7 -0
  265. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/bower.json +7 -0
  266. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/textField-default-theme.css +29 -0
  267. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/textField-default-theme.min.css +6 -0
  268. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/textField.css +76 -0
  269. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/textField.js +143 -0
  270. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/textField.min.css +6 -0
  271. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/textField/textField.min.js +7 -0
  272. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/bower.json +9 -0
  273. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/toast-default-theme.css +17 -0
  274. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/toast-default-theme.min.css +6 -0
  275. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/toast.css +115 -0
  276. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/toast.js +235 -0
  277. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/toast.min.css +6 -0
  278. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toast/toast.min.js +7 -0
  279. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/bower.json +8 -0
  280. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/toolbar-default-theme.css +17 -0
  281. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/toolbar-default-theme.min.css +6 -0
  282. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/toolbar.css +78 -0
  283. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/toolbar.js +158 -0
  284. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/toolbar.min.css +6 -0
  285. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/toolbar/toolbar.min.js +7 -0
  286. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/bower.json +7 -0
  287. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/tooltip-default-theme.css +10 -0
  288. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/tooltip-default-theme.min.css +6 -0
  289. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/tooltip.css +136 -0
  290. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/tooltip.js +197 -0
  291. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/tooltip.min.css +6 -0
  292. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/tooltip/tooltip.min.js +7 -0
  293. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/whiteframe/bower.json +5 -0
  294. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/whiteframe/whiteframe.css +20 -0
  295. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/whiteframe/whiteframe.js +15 -0
  296. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/whiteframe/whiteframe.min.css +6 -0
  297. data/app/assets/javascripts/swat/bower_components/angular-material/modules/js/whiteframe/whiteframe.min.js +7 -0
  298. data/app/assets/javascripts/swat/bower_components/angular-resource/angular-resource.js +668 -0
  299. data/app/assets/javascripts/swat/bower_components/angular-resource/angular-resource.min.js +13 -0
  300. data/app/assets/javascripts/swat/bower_components/angular-resource/index.js +2 -0
  301. data/app/assets/javascripts/swat/bower_components/angular-route/angular-route.js +991 -0
  302. data/app/assets/javascripts/swat/bower_components/angular-route/angular-route.min.js +15 -0
  303. data/app/assets/javascripts/swat/bower_components/angular-route/index.js +2 -0
  304. data/app/assets/javascripts/swat/bower_components/angular-ui-router/LICENSE.txt +21 -0
  305. data/app/assets/javascripts/swat/bower_components/angular-ui-router/api/angular-ui-router.d.ts +126 -0
  306. data/app/assets/javascripts/swat/bower_components/angular-ui-router/release/angular-ui-router.js +4370 -0
  307. data/app/assets/javascripts/swat/bower_components/angular-ui-router/release/angular-ui-router.min.js +7 -0
  308. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/common.js +292 -0
  309. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/resolve.js +252 -0
  310. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/state.js +1465 -0
  311. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/stateDirectives.js +285 -0
  312. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/stateFilters.js +39 -0
  313. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/templateFactory.js +110 -0
  314. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/urlMatcherFactory.js +1050 -0
  315. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/urlRouter.js +427 -0
  316. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/view.js +71 -0
  317. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/viewDirective.js +303 -0
  318. data/app/assets/javascripts/swat/bower_components/angular-ui-router/src/viewScroll.js +52 -0
  319. data/app/assets/javascripts/swat/bower_components/lodash/lodash.js +12235 -0
  320. data/app/assets/javascripts/swat/bower_components/lodash/lodash.min.js +98 -0
  321. data/app/assets/javascripts/swat/bower_components/ng-clip/.editorconfig +10 -0
  322. data/app/assets/javascripts/swat/bower_components/ng-clip/.gitignore +3 -0
  323. data/app/assets/javascripts/swat/bower_components/ng-clip/Gruntfile.js +96 -0
  324. data/app/assets/javascripts/swat/bower_components/ng-clip/dest/ng-clip.min.js +2 -0
  325. data/app/assets/javascripts/swat/bower_components/ng-clip/example/bootstrap-tooltip.html +49 -0
  326. data/app/assets/javascripts/swat/bower_components/ng-clip/example/index.html +68 -0
  327. data/app/assets/javascripts/swat/bower_components/ng-clip/example/ng-repeat.html +44 -0
  328. data/app/assets/javascripts/swat/bower_components/ng-clip/npm-debug.log +145 -0
  329. data/app/assets/javascripts/swat/bower_components/ng-clip/src/ngClip.js +84 -0
  330. data/app/assets/javascripts/swat/bower_components/zeroclipboard/dist/.jshintrc +70 -0
  331. data/app/assets/javascripts/swat/bower_components/zeroclipboard/dist/ZeroClipboard.Core.js +2017 -0
  332. data/app/assets/javascripts/swat/bower_components/zeroclipboard/dist/ZeroClipboard.Core.min.js +10 -0
  333. data/app/assets/javascripts/swat/bower_components/zeroclipboard/dist/ZeroClipboard.js +2581 -0
  334. data/app/assets/javascripts/swat/bower_components/zeroclipboard/dist/ZeroClipboard.min.js +10 -0
  335. data/app/assets/javascripts/swat/bower_components/zeroclipboard/dist/ZeroClipboard.swf +0 -0
  336. data/app/assets/javascripts/swat/bower_components.coffee +12 -0
  337. data/app/assets/stylesheets/swat/application.sass +59 -0
  338. data/app/assets/stylesheets/swat/default-theme.css +394 -0
  339. data/app/assets/stylesheets/swat/font-awesome.css +1801 -0
  340. data/app/assets/stylesheets/swat/fonts/FontAwesome.otf +0 -0
  341. data/app/assets/stylesheets/swat/fonts/fontawesome-webfont.eot +0 -0
  342. data/app/assets/stylesheets/swat/fonts/fontawesome-webfont.svg +565 -0
  343. data/app/assets/stylesheets/swat/fonts/fontawesome-webfont.ttf +0 -0
  344. data/app/assets/stylesheets/swat/fonts/fontawesome-webfont.woff +0 -0
  345. data/app/assets/stylesheets/swat/fonts/fontawesome-webfont.woff2 +0 -0
  346. data/app/assets/stylesheets/swat/swat_theme.sass +177 -0
  347. data/app/controllers/swat/api/revisions_controller.rb +27 -0
  348. data/app/controllers/swat/api/test_cases_controller.rb +20 -0
  349. data/app/controllers/swat/application_controller.rb +4 -0
  350. data/app/controllers/swat/info/states_controller.rb +12 -0
  351. data/app/controllers/swat/pages/base_pages_controller.rb +7 -0
  352. data/app/controllers/swat/pages/revisions_controller.rb +8 -0
  353. data/app/controllers/swat/revisions_controller.rb +4 -0
  354. data/app/helpers/swat/application_helper.rb +4 -0
  355. data/app/models/concerns/root_revision_ext.rb +14 -0
  356. data/app/models/full_revision.rb +88 -0
  357. data/app/models/revision.rb +84 -0
  358. data/app/models/revision_status_calculator.rb +98 -0
  359. data/app/models/test_case.rb +25 -0
  360. data/app/views/layouts/swat/application.slim +36 -0
  361. data/app/views/layouts/swat/page.slim +2 -0
  362. data/app/views/swat/application/index.slim +0 -0
  363. data/app/views/swat/pages/revisions/index.slim +25 -0
  364. data/app/views/swat/pages/revisions/show.slim +43 -0
  365. data/app/views/swat/shared/_footer.slim +5 -0
  366. data/app/views/swat/shared/_header.slim +9 -0
  367. data/bin/rails +12 -0
  368. data/config/routes.rb +38 -0
  369. data/fixtures/firebase_collection.rb +97 -0
  370. data/lib/sw2at-ui.rb +19 -0
  371. data/lib/swat/engine.rb +5 -0
  372. data/lib/swat/ui/config.rb +28 -0
  373. data/lib/swat/ui/rspec_commands.rb +191 -0
  374. data/lib/swat/ui/rspec_setup.rb +42 -0
  375. data/lib/swat/ui/stats_collector.rb +90 -0
  376. data/lib/swat/ui/version.rb +5 -0
  377. data/lib/tasks/swat_tasks.rake +36 -0
  378. data/spec/lib/commands_spec.rb +88 -0
  379. data/spec/models/calculator_spec.rb +130 -0
  380. data/spec/models/full_revision_spec.rb +263 -0
  381. data/spec/models/revision_spec.rb +59 -0
  382. data/spec/models/testcase_spec.rb +94 -0
  383. data/spec/spec_helper.rb +45 -0
  384. data/sw2at-ui.gemspec +465 -0
  385. data/test/helper.rb +34 -0
  386. data/test/test_sw2at-ui.rb +7 -0
  387. metadata +628 -0
@@ -0,0 +1,1009 @@
1
+ /*!
2
+ * Angular Material Design
3
+ * https://github.com/angular/material
4
+ * @license MIT
5
+ * v0.7.1
6
+ */
7
+ goog.provide('ng.material.components.tabs');
8
+ goog.require('ng.material.core');
9
+ (function() {
10
+ 'use strict';
11
+
12
+ /**
13
+ * @ngdoc module
14
+ * @name material.components.tabs
15
+ * @description
16
+ *
17
+ * Tabs, created with the `<md-tabs>` directive provide *tabbed* navigation with different styles.
18
+ * The Tabs component consists of clickable tabs that are aligned horizontally side-by-side.
19
+ *
20
+ * Features include support for:
21
+ *
22
+ * - static or dynamic tabs,
23
+ * - responsive designs,
24
+ * - accessibility support (ARIA),
25
+ * - tab pagination,
26
+ * - external or internal tab content,
27
+ * - focus indicators and arrow-key navigations,
28
+ * - programmatic lookup and access to tab controllers, and
29
+ * - dynamic transitions through different tab contents.
30
+ *
31
+ */
32
+ /*
33
+ * @see js folder for tabs implementation
34
+ */
35
+ angular.module('material.components.tabs', [
36
+ 'material.core'
37
+ ]);
38
+ })();
39
+
40
+ (function() {
41
+ 'use strict';
42
+
43
+ /**
44
+ * Conditionally configure ink bar animations when the
45
+ * tab selection changes. If `mdNoBar` then do not show the
46
+ * bar nor animate.
47
+ */
48
+ angular.module('material.components.tabs')
49
+ .directive('mdTabsInkBar', MdTabInkDirective);
50
+
51
+ function MdTabInkDirective($$rAF) {
52
+
53
+ var lastIndex = 0;
54
+
55
+ return {
56
+ restrict: 'E',
57
+ require: ['^?mdNoBar', '^mdTabs'],
58
+ link: postLink
59
+ };
60
+
61
+ function postLink(scope, element, attr, ctrls) {
62
+ var mdNoBar = !!ctrls[0];
63
+
64
+ var tabsCtrl = ctrls[1],
65
+ debouncedUpdateBar = $$rAF.throttle(updateBar);
66
+
67
+ tabsCtrl.inkBarElement = element;
68
+
69
+ scope.$on('$mdTabsPaginationChanged', debouncedUpdateBar);
70
+
71
+ function updateBar() {
72
+ var selected = tabsCtrl.getSelectedItem();
73
+ var hideInkBar = !selected || tabsCtrl.count() < 2 || mdNoBar;
74
+
75
+ element.css('display', hideInkBar ? 'none' : 'block');
76
+
77
+ if (hideInkBar) return;
78
+
79
+ if (scope.pagination && scope.pagination.tabData) {
80
+ var index = tabsCtrl.getSelectedIndex();
81
+ var data = scope.pagination.tabData.tabs[index] || { left: 0, right: 0, width: 0 };
82
+ var right = element.parent().prop('offsetWidth') - data.right;
83
+ var classNames = ['md-transition-left', 'md-transition-right', 'md-no-transition'];
84
+ var classIndex = lastIndex > index ? 0 : lastIndex < index ? 1 : 2;
85
+
86
+ element
87
+ .removeClass(classNames.join(' '))
88
+ .addClass(classNames[classIndex])
89
+ .css({ left: data.left + 'px', right: right + 'px' });
90
+
91
+ lastIndex = index;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ MdTabInkDirective.$inject = ["$$rAF"];
97
+ })();
98
+
99
+ (function() {
100
+ 'use strict';
101
+
102
+ angular.module('material.components.tabs')
103
+ .directive('mdTabsPagination', TabPaginationDirective);
104
+
105
+ function TabPaginationDirective($mdConstant, $window, $$rAF, $$q, $timeout, $mdMedia) {
106
+
107
+ // Must match (2 * width of paginators) in scss
108
+ var PAGINATORS_WIDTH = (8 * 4) * 2;
109
+
110
+ return {
111
+ restrict: 'A',
112
+ require: '^mdTabs',
113
+ link: postLink
114
+ };
115
+
116
+ function postLink(scope, element, attr, tabsCtrl) {
117
+
118
+ var tabs = element[0].getElementsByTagName('md-tab');
119
+ var debouncedUpdatePagination = $$rAF.throttle(updatePagination);
120
+ var tabsParent = element.children();
121
+ var locked = false;
122
+ var state = scope.pagination = {
123
+ page: -1,
124
+ active: false,
125
+ clickNext: function() { locked || userChangePage(+1); },
126
+ clickPrevious: function() { locked || userChangePage(-1); }
127
+ };
128
+
129
+ scope.$on('$mdTabsChanged', debouncedUpdatePagination);
130
+ angular.element($window).on('resize', debouncedUpdatePagination);
131
+
132
+ scope.$on('$destroy', function() {
133
+ angular.element($window).off('resize', debouncedUpdatePagination);
134
+ });
135
+
136
+ scope.$watch(function() { return tabsCtrl.tabToFocus; }, onTabFocus);
137
+
138
+ // Make sure we don't focus an element on the next page
139
+ // before it's in view
140
+ function onTabFocus(tab, oldTab) {
141
+ if (!tab) return;
142
+
143
+ var pageIndex = getPageForTab(tab);
144
+ if (!state.active || pageIndex === state.page) {
145
+ tab.element.focus();
146
+ } else {
147
+ // Go to the new page, wait for the page transition to end, then focus.
148
+ oldTab && oldTab.element.blur();
149
+ setPage(pageIndex).then(function() {
150
+ locked = false;
151
+ tab.element.focus();
152
+ });
153
+ }
154
+ }
155
+
156
+ // Called when page is changed by a user action (click)
157
+ function userChangePage(increment) {
158
+ var sizeData = state.tabData;
159
+ var newPage = Math.max(0, Math.min(sizeData.pages.length - 1, state.page + increment));
160
+ var newTabIndex = sizeData.pages[newPage][ increment > 0 ? 'firstTabIndex' : 'lastTabIndex' ];
161
+ var newTab = tabsCtrl.itemAt(newTabIndex);
162
+ locked = true;
163
+ onTabFocus(newTab);
164
+ }
165
+
166
+ function updatePagination() {
167
+ if (!element.prop('offsetParent')) {
168
+ var watcher = waitForVisible();
169
+ return;
170
+ }
171
+
172
+ var tabs = element.find('md-tab');
173
+
174
+ disablePagination();
175
+
176
+ var sizeData = state.tabData = calculateTabData();
177
+ var needPagination = state.active = sizeData.pages.length > 1;
178
+
179
+ if (needPagination) { enablePagination(); }
180
+
181
+ scope.$evalAsync(function () { scope.$broadcast('$mdTabsPaginationChanged'); });
182
+
183
+ function enablePagination() {
184
+ tabsParent.css('width', '9999px');
185
+
186
+ //-- apply filler margins
187
+ angular.forEach(sizeData.tabs, function (tab) {
188
+ angular.element(tab.element).css('margin-left', tab.filler + 'px');
189
+ });
190
+
191
+ setPage(getPageForTab(tabsCtrl.getSelectedItem()));
192
+ }
193
+
194
+ function disablePagination() {
195
+ slideTabButtons(0);
196
+ tabsParent.css('width', '');
197
+ tabs.css('width', '');
198
+ tabs.css('margin-left', '');
199
+ state.page = null;
200
+ state.active = false;
201
+ }
202
+
203
+ function waitForVisible() {
204
+ return watcher || scope.$watch(
205
+ function () {
206
+ $timeout(function () {
207
+ if (element[0].offsetParent) {
208
+ if (angular.isFunction(watcher)) {
209
+ watcher();
210
+ }
211
+ debouncedUpdatePagination();
212
+ watcher = null;
213
+ }
214
+ }, 0, false);
215
+ }
216
+ );
217
+ }
218
+ }
219
+
220
+ function slideTabButtons(x) {
221
+ if (tabsCtrl.pagingOffset === x) {
222
+ // Resolve instantly if no change
223
+ return $$q.when();
224
+ }
225
+
226
+ var deferred = $$q.defer();
227
+
228
+ tabsCtrl.$$pagingOffset = x;
229
+ tabsParent.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + x + 'px,0,0)');
230
+ tabsParent.on($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);
231
+
232
+ return deferred.promise;
233
+
234
+ function onTabsParentTransitionEnd(ev) {
235
+ // Make sure this event didn't bubble up from an animation in a child element.
236
+ if (ev.target === tabsParent[0]) {
237
+ tabsParent.off($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);
238
+ deferred.resolve();
239
+ }
240
+ }
241
+ }
242
+
243
+ function shouldStretchTabs() {
244
+ switch (scope.stretchTabs) {
245
+ case 'never': return false;
246
+ case 'always': return true;
247
+ default: return $mdMedia('sm');
248
+ }
249
+ }
250
+
251
+ function calculateTabData(noAdjust) {
252
+ var clientWidth = element.parent().prop('offsetWidth');
253
+ var tabsWidth = clientWidth - PAGINATORS_WIDTH - 1;
254
+ var $tabs = angular.element(tabs);
255
+ var totalWidth = 0;
256
+ var max = 0;
257
+ var tabData = [];
258
+ var pages = [];
259
+ var currentPage;
260
+
261
+ $tabs.css('max-width', '');
262
+ angular.forEach(tabs, function (tab, index) {
263
+ var tabWidth = Math.min(tabsWidth, tab.offsetWidth);
264
+ var data = {
265
+ element: tab,
266
+ left: totalWidth,
267
+ width: tabWidth,
268
+ right: totalWidth + tabWidth,
269
+ filler: 0
270
+ };
271
+
272
+ //-- This calculates the page for each tab. The first page will use the clientWidth, which
273
+ // does not factor in the pagination items. After the first page, tabsWidth is used
274
+ // because at this point, we know that the pagination buttons will be shown.
275
+ data.page = Math.ceil(data.right / ( pages.length === 1 && index === tabs.length - 1 ? clientWidth : tabsWidth )) - 1;
276
+
277
+ if (data.page >= pages.length) {
278
+ data.filler = (tabsWidth * data.page) - data.left;
279
+ data.right += data.filler;
280
+ data.left += data.filler;
281
+ currentPage = {
282
+ left: data.left,
283
+ firstTabIndex: index,
284
+ lastTabIndex: index,
285
+ tabs: [ data ]
286
+ };
287
+ pages.push(currentPage);
288
+ } else {
289
+ currentPage.lastTabIndex = index;
290
+ currentPage.tabs.push(data);
291
+ }
292
+ totalWidth = data.right;
293
+ max = Math.max(max, tabWidth);
294
+ tabData.push(data);
295
+ });
296
+ $tabs.css('max-width', tabsWidth + 'px');
297
+
298
+ if (!noAdjust && shouldStretchTabs()) {
299
+ return adjustForStretchedTabs();
300
+ } else {
301
+ return {
302
+ width: totalWidth,
303
+ max: max,
304
+ tabs: tabData,
305
+ pages: pages,
306
+ tabElements: tabs
307
+ };
308
+ }
309
+
310
+
311
+ function adjustForStretchedTabs() {
312
+ var canvasWidth = pages.length === 1 ? clientWidth : tabsWidth;
313
+ var tabsPerPage = Math.min(Math.floor(canvasWidth / max), tabs.length);
314
+ var tabWidth = Math.floor(canvasWidth / tabsPerPage);
315
+ $tabs.css('width', tabWidth + 'px');
316
+ return calculateTabData(true);
317
+ }
318
+ }
319
+
320
+ function getPageForTab(tab) {
321
+ var tabIndex = tabsCtrl.indexOf(tab);
322
+ if (tabIndex === -1) return 0;
323
+
324
+ var sizeData = state.tabData;
325
+
326
+ return sizeData ? sizeData.tabs[tabIndex].page : 0;
327
+ }
328
+
329
+ function setPage(page) {
330
+ if (page === state.page) return;
331
+
332
+ var lastPage = state.tabData.pages.length - 1;
333
+
334
+ if (page < 0) page = 0;
335
+ if (page > lastPage) page = lastPage;
336
+
337
+ state.hasPrev = page > 0;
338
+ state.hasNext = page < lastPage;
339
+
340
+ state.page = page;
341
+
342
+ scope.$broadcast('$mdTabsPaginationChanged');
343
+
344
+ return slideTabButtons(-state.tabData.pages[page].left);
345
+ }
346
+ }
347
+
348
+ }
349
+ TabPaginationDirective.$inject = ["$mdConstant", "$window", "$$rAF", "$$q", "$timeout", "$mdMedia"];
350
+ })();
351
+
352
+ (function() {
353
+ 'use strict';
354
+
355
+
356
+ angular.module('material.components.tabs')
357
+ .controller('$mdTab', TabItemController);
358
+
359
+ function TabItemController($scope, $element, $attrs, $compile, $animate, $mdUtil, $parse, $timeout) {
360
+ var self = this;
361
+ var tabsCtrl = $element.controller('mdTabs');
362
+
363
+ // Properties
364
+ self.contentContainer = angular.element('<div class="md-tab-content ng-hide">');
365
+ self.element = $element;
366
+
367
+ // Methods
368
+ self.isDisabled = isDisabled;
369
+ self.onAdd = onAdd;
370
+ self.onRemove = onRemove;
371
+ self.onSelect = onSelect;
372
+ self.onDeselect = onDeselect;
373
+
374
+ var disabledParsed = $parse($attrs.ngDisabled);
375
+ function isDisabled() {
376
+ return disabledParsed($scope.$parent);
377
+ }
378
+
379
+ /**
380
+ * Add the tab's content to the DOM container area in the tabs,
381
+ * @param contentArea the contentArea to add the content of the tab to
382
+ */
383
+ function onAdd(contentArea, shouldDisconnectScope) {
384
+ if (self.content.length) {
385
+ self.contentContainer.append(self.content);
386
+ self.contentScope = $scope.$parent.$new();
387
+ contentArea.append(self.contentContainer);
388
+
389
+ $compile(self.contentContainer)(self.contentScope);
390
+ if (shouldDisconnectScope === true) {
391
+ $timeout(function () {
392
+ $mdUtil.disconnectScope(self.contentScope);
393
+ }, 0, false);
394
+ }
395
+ }
396
+ }
397
+
398
+ function onRemove() {
399
+ $animate.leave(self.contentContainer).then(function() {
400
+ self.contentScope && self.contentScope.$destroy();
401
+ self.contentScope = null;
402
+ });
403
+ }
404
+
405
+ function toggleAnimationClass(rightToLeft) {
406
+ self.contentContainer[rightToLeft ? 'addClass' : 'removeClass']('md-transition-rtl');
407
+ }
408
+
409
+ function onSelect(rightToLeft) {
410
+ // Resume watchers and events firing when tab is selected
411
+ $mdUtil.reconnectScope(self.contentScope);
412
+
413
+ $element
414
+ .addClass('active')
415
+ .attr({
416
+ 'aria-selected': true,
417
+ 'tabIndex': 0
418
+ })
419
+ .on('$md.swipeleft $md.swiperight', onSwipe);
420
+
421
+ toggleAnimationClass(rightToLeft);
422
+ $animate.removeClass(self.contentContainer, 'ng-hide');
423
+
424
+ $scope.onSelect();
425
+ }
426
+
427
+ function onDeselect(rightToLeft) {
428
+ // Stop watchers & events from firing while tab is deselected
429
+ $mdUtil.disconnectScope(self.contentScope);
430
+
431
+ $element
432
+ .removeClass('active')
433
+ .attr({
434
+ 'aria-selected': false,
435
+ 'tabIndex': -1
436
+ })
437
+ .off('$md.swipeleft $md.swiperight', onSwipe);
438
+
439
+ toggleAnimationClass(rightToLeft);
440
+ $animate.addClass(self.contentContainer, 'ng-hide');
441
+
442
+ $scope.onDeselect();
443
+ }
444
+
445
+ ///// Private functions
446
+
447
+ function onSwipe(ev) {
448
+ $scope.$apply(function() {
449
+ if (/left/.test(ev.type)) {
450
+ tabsCtrl.select(tabsCtrl.next());
451
+ } else {
452
+ tabsCtrl.select(tabsCtrl.previous());
453
+ }
454
+ });
455
+ }
456
+
457
+
458
+ }
459
+ TabItemController.$inject = ["$scope", "$element", "$attrs", "$compile", "$animate", "$mdUtil", "$parse", "$timeout"];
460
+
461
+ })();
462
+
463
+ (function() {
464
+ 'use strict';
465
+
466
+ angular.module('material.components.tabs')
467
+ .directive('mdTab', MdTabDirective);
468
+
469
+ /**
470
+ * @ngdoc directive
471
+ * @name mdTab
472
+ * @module material.components.tabs
473
+ *
474
+ * @restrict E
475
+ *
476
+ * @description
477
+ * `<md-tab>` is the nested directive used [within `<md-tabs>`] to specify each tab with a **label** and optional *view content*.
478
+ *
479
+ * If the `label` attribute is not specified, then an optional `<md-tab-label>` tag can be used to specify more
480
+ * complex tab header markup. If neither the **label** nor the **md-tab-label** are specified, then the nested
481
+ * markup of the `<md-tab>` is used as the tab header markup.
482
+ *
483
+ * If a tab **label** has been identified, then any **non-**`<md-tab-label>` markup
484
+ * will be considered tab content and will be transcluded to the internal `<div class="md-tabs-content">` container.
485
+ *
486
+ * This container is used by the TabsController to show/hide the active tab's content view. This synchronization is
487
+ * automatically managed by the internal TabsController whenever the tab selection changes. Selection changes can
488
+ * be initiated via data binding changes, programmatic invocation, or user gestures.
489
+ *
490
+ * @param {string=} label Optional attribute to specify a simple string as the tab label
491
+ * @param {boolean=} md-active When evaluteing to true, selects the tab.
492
+ * @param {boolean=} disabled If present, disabled tab selection.
493
+ * @param {expression=} md-on-deselect Expression to be evaluated after the tab has been de-selected.
494
+ * @param {expression=} md-on-select Expression to be evaluated after the tab has been selected.
495
+ *
496
+ *
497
+ * @usage
498
+ *
499
+ * <hljs lang="html">
500
+ * <md-tab label="" disabled="" md-on-select="" md-on-deselect="" >
501
+ * <h3>My Tab content</h3>
502
+ * </md-tab>
503
+ *
504
+ * <md-tab >
505
+ * <md-tab-label>
506
+ * <h3>My Tab content</h3>
507
+ * </md-tab-label>
508
+ * <p>
509
+ * Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
510
+ * totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
511
+ * dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
512
+ * sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
513
+ * </p>
514
+ * </md-tab>
515
+ * </hljs>
516
+ *
517
+ */
518
+ function MdTabDirective($mdInkRipple, $compile, $mdUtil, $mdConstant, $timeout) {
519
+ return {
520
+ restrict: 'E',
521
+ require: ['mdTab', '^mdTabs'],
522
+ controller: '$mdTab',
523
+ scope: {
524
+ onSelect: '&mdOnSelect',
525
+ onDeselect: '&mdOnDeselect',
526
+ label: '@'
527
+ },
528
+ compile: compile
529
+ };
530
+
531
+ function compile(element, attr) {
532
+ var tabLabel = element.find('md-tab-label');
533
+
534
+ if (tabLabel.length) {
535
+ // If a tab label element is found, remove it for later re-use.
536
+ tabLabel.remove();
537
+
538
+ } else if (angular.isDefined(attr.label)) {
539
+ // Otherwise, try to use attr.label as the label
540
+ tabLabel = angular.element('<md-tab-label>').html(attr.label);
541
+
542
+ } else {
543
+ // If nothing is found, use the tab's content as the label
544
+ tabLabel = angular.element('<md-tab-label>')
545
+ .append(element.contents().remove());
546
+ }
547
+
548
+ // Everything that's left as a child is the tab's content.
549
+ var tabContent = element.contents().remove();
550
+
551
+ return function postLink(scope, element, attr, ctrls) {
552
+
553
+ var tabItemCtrl = ctrls[0]; // Controller for THIS tabItemCtrl
554
+ var tabsCtrl = ctrls[1]; // Controller for ALL tabs
555
+
556
+ $timeout(element.addClass.bind(element, 'md-tab-themed'), 0, false);
557
+
558
+ scope.$watch(
559
+ function () { return attr.label; },
560
+ function () { $timeout(function () { tabsCtrl.scope.$broadcast('$mdTabsChanged'); }, 0, false); }
561
+ );
562
+
563
+ transcludeTabContent();
564
+ configureAria();
565
+
566
+ var detachRippleFn = $mdInkRipple.attachTabBehavior(scope, element, {
567
+ colorElement: tabsCtrl.inkBarElement
568
+ });
569
+ tabsCtrl.add(tabItemCtrl);
570
+ scope.$on('$destroy', function() {
571
+ detachRippleFn();
572
+ tabsCtrl.remove(tabItemCtrl);
573
+ });
574
+ element.on('$destroy', function () {
575
+ //-- wait for item to be removed from the dom
576
+ $timeout(function () {
577
+ tabsCtrl.scope.$broadcast('$mdTabsChanged');
578
+ }, 0, false);
579
+ });
580
+
581
+ if (!angular.isDefined(attr.ngClick)) {
582
+ element.on('click', defaultClickListener);
583
+ }
584
+ element.on('keydown', keydownListener);
585
+
586
+ if (angular.isNumber(scope.$parent.$index)) {
587
+ watchNgRepeatIndex();
588
+ }
589
+ if (angular.isDefined(attr.mdActive)) {
590
+ watchActiveAttribute();
591
+ }
592
+ watchDisabled();
593
+
594
+ function transcludeTabContent() {
595
+ // Clone the label we found earlier, and $compile and append it
596
+ var label = tabLabel.clone();
597
+ element.append(label);
598
+ $compile(label)(scope.$parent);
599
+
600
+ // Clone the content we found earlier, and mark it for later placement into
601
+ // the proper content area.
602
+ tabItemCtrl.content = tabContent.clone();
603
+ }
604
+
605
+ //defaultClickListener isn't applied if the user provides an ngClick expression.
606
+ function defaultClickListener() {
607
+ scope.$apply(function() {
608
+ tabsCtrl.select(tabItemCtrl);
609
+ tabsCtrl.focus(tabItemCtrl);
610
+ });
611
+ }
612
+ function keydownListener(ev) {
613
+ if (ev.keyCode == $mdConstant.KEY_CODE.SPACE || ev.keyCode == $mdConstant.KEY_CODE.ENTER ) {
614
+ // Fire the click handler to do normal selection if space is pressed
615
+ element.triggerHandler('click');
616
+ ev.preventDefault();
617
+ } else if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {
618
+ scope.$evalAsync(function() {
619
+ tabsCtrl.focus(tabsCtrl.previous(tabItemCtrl));
620
+ });
621
+ } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {
622
+ scope.$evalAsync(function() {
623
+ tabsCtrl.focus(tabsCtrl.next(tabItemCtrl));
624
+ });
625
+ }
626
+ }
627
+
628
+ // If tabItemCtrl is part of an ngRepeat, move the tabItemCtrl in our internal array
629
+ // when its $index changes
630
+ function watchNgRepeatIndex() {
631
+ // The tabItemCtrl has an isolate scope, so we watch the $index on the parent.
632
+ scope.$watch('$parent.$index', function $indexWatchAction(newIndex) {
633
+ tabsCtrl.move(tabItemCtrl, newIndex);
634
+ });
635
+ }
636
+
637
+ function watchActiveAttribute() {
638
+ var unwatch = scope.$parent.$watch('!!(' + attr.mdActive + ')', activeWatchAction);
639
+ scope.$on('$destroy', unwatch);
640
+
641
+ function activeWatchAction(isActive) {
642
+ var isSelected = tabsCtrl.getSelectedItem() === tabItemCtrl;
643
+
644
+ if (isActive && !isSelected) {
645
+ tabsCtrl.select(tabItemCtrl);
646
+ } else if (!isActive && isSelected) {
647
+ tabsCtrl.deselect(tabItemCtrl);
648
+ }
649
+ }
650
+ }
651
+
652
+ function watchDisabled() {
653
+ scope.$watch(tabItemCtrl.isDisabled, disabledWatchAction);
654
+
655
+ function disabledWatchAction(isDisabled) {
656
+ element.attr('aria-disabled', isDisabled);
657
+
658
+ // Auto select `next` tab when disabled
659
+ var isSelected = (tabsCtrl.getSelectedItem() === tabItemCtrl);
660
+ if (isSelected && isDisabled) {
661
+ tabsCtrl.select(tabsCtrl.next() || tabsCtrl.previous());
662
+ }
663
+
664
+ }
665
+ }
666
+
667
+ function configureAria() {
668
+ // Link together the content area and tabItemCtrl with an id
669
+ var tabId = attr.id || ('tab_' + $mdUtil.nextUid());
670
+
671
+ element.attr({
672
+ id: tabId,
673
+ role: 'tab',
674
+ tabIndex: -1 //this is also set on select/deselect in tabItemCtrl
675
+ });
676
+
677
+ // Only setup the contentContainer's aria attributes if tab content is provided
678
+ if (tabContent.length) {
679
+ var tabContentId = 'content_' + tabId;
680
+ if (!element.attr('aria-controls')) {
681
+ element.attr('aria-controls', tabContentId);
682
+ }
683
+ tabItemCtrl.contentContainer.attr({
684
+ id: tabContentId,
685
+ role: 'tabpanel',
686
+ 'aria-labelledby': tabId
687
+ });
688
+ }
689
+ }
690
+
691
+ };
692
+
693
+ }
694
+
695
+ }
696
+ MdTabDirective.$inject = ["$mdInkRipple", "$compile", "$mdUtil", "$mdConstant", "$timeout"];
697
+
698
+ })();
699
+
700
+ (function() {
701
+ 'use strict';
702
+
703
+ angular.module('material.components.tabs')
704
+ .controller('$mdTabs', MdTabsController);
705
+
706
+ function MdTabsController($scope, $element, $mdUtil, $timeout) {
707
+
708
+ var tabsList = $mdUtil.iterator([], false);
709
+ var self = this;
710
+
711
+ // Properties
712
+ self.$element = $element;
713
+ self.scope = $scope;
714
+ // The section containing the tab content $elements
715
+ var contentArea = self.contentArea = angular.element($element[0].querySelector('.md-tabs-content'));
716
+
717
+ // Methods from iterator
718
+ var inRange = self.inRange = tabsList.inRange;
719
+ var indexOf = self.indexOf = tabsList.indexOf;
720
+ var itemAt = self.itemAt = tabsList.itemAt;
721
+ self.count = tabsList.count;
722
+
723
+ self.getSelectedItem = getSelectedItem;
724
+ self.getSelectedIndex = getSelectedIndex;
725
+ self.add = add;
726
+ self.remove = remove;
727
+ self.move = move;
728
+ self.select = select;
729
+ self.focus = focus;
730
+ self.deselect = deselect;
731
+
732
+ self.next = next;
733
+ self.previous = previous;
734
+
735
+ $scope.$on('$destroy', function() {
736
+ deselect(getSelectedItem());
737
+ for (var i = tabsList.count() - 1; i >= 0; i--) {
738
+ remove(tabsList[i], true);
739
+ }
740
+ });
741
+
742
+ // Get the selected tab
743
+ function getSelectedItem() {
744
+ return itemAt($scope.selectedIndex);
745
+ }
746
+
747
+ function getSelectedIndex() {
748
+ return $scope.selectedIndex;
749
+ }
750
+
751
+ // Add a new tab.
752
+ // Returns a method to remove the tab from the list.
753
+ function add(tab, index) {
754
+ tabsList.add(tab, index);
755
+
756
+ // Select the new tab if we don't have a selectedIndex, or if the
757
+ // selectedIndex we've been waiting for is this tab
758
+ if (!angular.isDefined(tab.element.attr('md-active')) && ($scope.selectedIndex === -1 || !angular.isNumber($scope.selectedIndex) ||
759
+ $scope.selectedIndex === self.indexOf(tab))) {
760
+ tab.onAdd(self.contentArea, false);
761
+ self.select(tab);
762
+ } else {
763
+ tab.onAdd(self.contentArea, true);
764
+ }
765
+
766
+ $scope.$broadcast('$mdTabsChanged');
767
+ }
768
+
769
+ function remove(tab, noReselect) {
770
+ if (!tabsList.contains(tab)) return;
771
+ if (noReselect) return;
772
+ var isSelectedItem = getSelectedItem() === tab,
773
+ newTab = previous() || next();
774
+
775
+ deselect(tab);
776
+ tabsList.remove(tab);
777
+ tab.onRemove();
778
+
779
+ $scope.$broadcast('$mdTabsChanged');
780
+
781
+ if (isSelectedItem) { select(newTab); }
782
+ }
783
+
784
+ // Move a tab (used when ng-repeat order changes)
785
+ function move(tab, toIndex) {
786
+ var isSelected = getSelectedItem() === tab;
787
+
788
+ tabsList.remove(tab);
789
+ tabsList.add(tab, toIndex);
790
+ if (isSelected) select(tab);
791
+
792
+ $scope.$broadcast('$mdTabsChanged');
793
+ }
794
+
795
+ function select(tab, rightToLeft) {
796
+ if (!tab || tab.isSelected || tab.isDisabled()) return;
797
+ if (!tabsList.contains(tab)) return;
798
+
799
+ if (!angular.isDefined(rightToLeft)) {
800
+ rightToLeft = indexOf(tab) < $scope.selectedIndex;
801
+ }
802
+ deselect(getSelectedItem(), rightToLeft);
803
+
804
+ $scope.selectedIndex = indexOf(tab);
805
+ tab.isSelected = true;
806
+ tab.onSelect(rightToLeft);
807
+
808
+ $scope.$broadcast('$mdTabsChanged');
809
+ }
810
+
811
+ function focus(tab) {
812
+ // this variable is watched by pagination
813
+ self.tabToFocus = tab;
814
+ }
815
+
816
+ function deselect(tab, rightToLeft) {
817
+ if (!tab || !tab.isSelected) return;
818
+ if (!tabsList.contains(tab)) return;
819
+
820
+ $scope.selectedIndex = -1;
821
+ tab.isSelected = false;
822
+ tab.onDeselect(rightToLeft);
823
+ }
824
+
825
+ function next(tab, filterFn) {
826
+ return tabsList.next(tab || getSelectedItem(), filterFn || isTabEnabled);
827
+ }
828
+ function previous(tab, filterFn) {
829
+ return tabsList.previous(tab || getSelectedItem(), filterFn || isTabEnabled);
830
+ }
831
+
832
+ function isTabEnabled(tab) {
833
+ return tab && !tab.isDisabled();
834
+ }
835
+
836
+ }
837
+ MdTabsController.$inject = ["$scope", "$element", "$mdUtil", "$timeout"];
838
+ })();
839
+
840
+ (function() {
841
+ 'use strict';
842
+
843
+ angular.module('material.components.tabs')
844
+ .directive('mdTabs', TabsDirective);
845
+
846
+ /**
847
+ * @ngdoc directive
848
+ * @name mdTabs
849
+ * @module material.components.tabs
850
+ *
851
+ * @restrict E
852
+ *
853
+ * @description
854
+ * The `<md-tabs>` directive serves as the container for 1..n `<md-tab>` child directives to produces a Tabs components.
855
+ * In turn, the nested `<md-tab>` directive is used to specify a tab label for the **header button** and a [optional] tab view
856
+ * content that will be associated with each tab button.
857
+ *
858
+ * Below is the markup for its simplest usage:
859
+ *
860
+ * <hljs lang="html">
861
+ * <md-tabs>
862
+ * <md-tab label="Tab #1"></md-tab>
863
+ * <md-tab label="Tab #2"></md-tab>
864
+ * <md-tab label="Tab #3"></md-tab>
865
+ * <md-tabs>
866
+ * </hljs>
867
+ *
868
+ * Tabs supports three (3) usage scenarios:
869
+ *
870
+ * 1. Tabs (buttons only)
871
+ * 2. Tabs with internal view content
872
+ * 3. Tabs with external view content
873
+ *
874
+ * **Tab-only** support is useful when tab buttons are used for custom navigation regardless of any other components, content, or views.
875
+ * **Tabs with internal views** are the traditional usages where each tab has associated view content and the view switching is managed internally by the Tabs component.
876
+ * **Tabs with external view content** is often useful when content associated with each tab is independently managed and data-binding notifications announce tab selection changes.
877
+ *
878
+ * > As a performance bonus, if the tab content is managed internally then the non-active (non-visible) tab contents are temporarily disconnected from the `$scope.$digest()` processes; which restricts and optimizes DOM updates to only the currently active tab.
879
+ *
880
+ * Additional features also include:
881
+ *
882
+ * * Content can include any markup.
883
+ * * If a tab is disabled while active/selected, then the next tab will be auto-selected.
884
+ * * If the currently active tab is the last tab, then next() action will select the first tab.
885
+ * * Any markup (other than **`<md-tab>`** tags) will be transcluded into the tab header area BEFORE the tab buttons.
886
+ *
887
+ * ### Explanation of tab stretching
888
+ *
889
+ * Initially, tabs will have an inherent size. This size will either be defined by how much space is needed to accommodate their text or set by the user through CSS. Calculations will be based on this size.
890
+ *
891
+ * On mobile devices, tabs will be expanded to fill the available horizontal space. When this happens, all tabs will become the same size.
892
+ *
893
+ * On desktops, by default, stretching will never occur.
894
+ *
895
+ * This default behavior can be overridden through the `md-stretch-tabs` attribute. Here is a table showing when stretching will occur:
896
+ *
897
+ * `md-stretch-tabs` | mobile | desktop
898
+ * ------------------|-----------|--------
899
+ * `auto` | stretched | ---
900
+ * `always` | stretched | stretched
901
+ * `never` | --- | ---
902
+ *
903
+ * @param {integer=} md-selected Index of the active/selected tab
904
+ * @param {boolean=} md-no-ink If present, disables ink ripple effects.
905
+ * @param {boolean=} md-no-bar If present, disables the selection ink bar.
906
+ * @param {string=} md-align-tabs Attribute to indicate position of tab buttons: `bottom` or `top`; default is `top`
907
+ * @param {string=} md-stretch-tabs Attribute to indicate whether or not to stretch tabs: `auto`, `always`, or `never`; default is `auto`
908
+ *
909
+ * @usage
910
+ * <hljs lang="html">
911
+ * <md-tabs md-selected="selectedIndex" >
912
+ * <img ng-src="img/angular.png" class="centered">
913
+ *
914
+ * <md-tab
915
+ * ng-repeat="tab in tabs | orderBy:predicate:reversed"
916
+ * md-on-select="onTabSelected(tab)"
917
+ * md-on-deselect="announceDeselected(tab)"
918
+ * disabled="tab.disabled" >
919
+ *
920
+ * <md-tab-label>
921
+ * {{tab.title}}
922
+ * <img src="img/removeTab.png"
923
+ * ng-click="removeTab(tab)"
924
+ * class="delete" >
925
+ * </md-tab-label>
926
+ *
927
+ * {{tab.content}}
928
+ *
929
+ * </md-tab>
930
+ *
931
+ * </md-tabs>
932
+ * </hljs>
933
+ *
934
+ */
935
+ function TabsDirective($mdTheming) {
936
+ return {
937
+ restrict: 'E',
938
+ controller: '$mdTabs',
939
+ require: 'mdTabs',
940
+ transclude: true,
941
+ scope: {
942
+ selectedIndex: '=?mdSelected'
943
+ },
944
+ template:
945
+ '<section class="md-header" ' +
946
+ 'ng-class="{\'md-paginating\': pagination.active}">' +
947
+
948
+ '<button class="md-paginator md-prev" ' +
949
+ 'ng-if="pagination.active && pagination.hasPrev" ' +
950
+ 'ng-click="pagination.clickPrevious()" ' +
951
+ 'aria-hidden="true">' +
952
+ '</button>' +
953
+
954
+ // overflow: hidden container when paginating
955
+ '<div class="md-header-items-container" md-tabs-pagination>' +
956
+ // flex container for <md-tab> elements
957
+ '<div class="md-header-items">' +
958
+ '<md-tabs-ink-bar></md-tabs-ink-bar>' +
959
+ '</div>' +
960
+ '</div>' +
961
+
962
+ '<button class="md-paginator md-next" ' +
963
+ 'ng-if="pagination.active && pagination.hasNext" ' +
964
+ 'ng-click="pagination.clickNext()" ' +
965
+ 'aria-hidden="true">' +
966
+ '</button>' +
967
+
968
+ '</section>' +
969
+ '<section class="md-tabs-content"></section>',
970
+ link: postLink
971
+ };
972
+
973
+ function postLink(scope, element, attr, tabsCtrl, transclude) {
974
+
975
+ scope.stretchTabs = attr.hasOwnProperty('mdStretchTabs') ? attr.mdStretchTabs || 'always' : 'auto';
976
+
977
+ $mdTheming(element);
978
+ configureAria();
979
+ watchSelected();
980
+
981
+ transclude(scope.$parent, function(clone) {
982
+ angular.element(element[0].querySelector('.md-header-items')).append(clone);
983
+ });
984
+
985
+ function configureAria() {
986
+ element.attr('role', 'tablist');
987
+ }
988
+
989
+ function watchSelected() {
990
+ scope.$watch('selectedIndex', function watchSelectedIndex(newIndex, oldIndex) {
991
+ if (oldIndex == newIndex) return;
992
+ var rightToLeft = oldIndex > newIndex;
993
+ tabsCtrl.deselect(tabsCtrl.itemAt(oldIndex), rightToLeft);
994
+
995
+ if (tabsCtrl.inRange(newIndex)) {
996
+ var newTab = tabsCtrl.itemAt(newIndex);
997
+ while (newTab && newTab.isDisabled()) {
998
+ newTab = newIndex > oldIndex
999
+ ? tabsCtrl.next(newTab)
1000
+ : tabsCtrl.previous(newTab);
1001
+ }
1002
+ tabsCtrl.select(newTab, rightToLeft);
1003
+ }
1004
+ });
1005
+ }
1006
+ }
1007
+ }
1008
+ TabsDirective.$inject = ["$mdTheming"];
1009
+ })();