bastion 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. checksums.yaml +15 -0
  2. data/.jshintrc +35 -0
  3. data/Gruntfile.js +24 -0
  4. data/LICENSE +339 -0
  5. data/README.md +8 -0
  6. data/Rakefile +53 -0
  7. data/app/assets/javascripts/bastion/auth/auth.module.js +87 -0
  8. data/app/assets/javascripts/bastion/auth/authorization.service.js +48 -0
  9. data/app/assets/javascripts/bastion/bastion-bootstrap.js +32 -0
  10. data/app/assets/javascripts/bastion/bastion-resource.factory.js +39 -0
  11. data/app/assets/javascripts/bastion/bastion.js +52 -0
  12. data/app/assets/javascripts/bastion/bastion.module.js +213 -0
  13. data/app/assets/javascripts/bastion/i18n/README +9 -0
  14. data/app/assets/javascripts/bastion/i18n/i18n.module.js +24 -0
  15. data/app/assets/javascripts/bastion/i18n/katello.pot +968 -0
  16. data/app/assets/javascripts/bastion/i18n/locale/README +1 -0
  17. data/app/assets/javascripts/bastion/i18n/translate.service.js +14 -0
  18. data/app/assets/javascripts/bastion/i18n/translations.js +3 -0
  19. data/app/assets/javascripts/bastion/i18n/zanata.xml +28 -0
  20. data/app/assets/javascripts/bastion/incubator/alch-alert.directive.js +67 -0
  21. data/app/assets/javascripts/bastion/incubator/alch-container-scroll.directive.js +44 -0
  22. data/app/assets/javascripts/bastion/incubator/alch-dropdown.directive.js +28 -0
  23. data/app/assets/javascripts/bastion/incubator/alch-edit.directive.js +361 -0
  24. data/app/assets/javascripts/bastion/incubator/alch-flyout.directive.js +19 -0
  25. data/app/assets/javascripts/bastion/incubator/alch-form-buttons.directive.js +60 -0
  26. data/app/assets/javascripts/bastion/incubator/alch-form-group.directive.js +87 -0
  27. data/app/assets/javascripts/bastion/incubator/alch-infinite-scroll.directive.js +84 -0
  28. data/app/assets/javascripts/bastion/incubator/alch-menu.directive.js +56 -0
  29. data/app/assets/javascripts/bastion/incubator/alch-modal.directive.js +80 -0
  30. data/app/assets/javascripts/bastion/incubator/alch-save-control.directive.js +42 -0
  31. data/app/assets/javascripts/bastion/incubator/alch-table.directive.js +295 -0
  32. data/app/assets/javascripts/bastion/incubator/format/alch-format.module.js +21 -0
  33. data/app/assets/javascripts/bastion/incubator/format/array-to-string.filter.js +30 -0
  34. data/app/assets/javascripts/bastion/incubator/format/boolean-to-yes-no.filter.js +34 -0
  35. data/app/assets/javascripts/bastion/incubator/format/capitalize.filter.js +32 -0
  36. data/app/assets/javascripts/bastion/incubator/format/key-value-to-string.filter.js +40 -0
  37. data/app/assets/javascripts/bastion/incubator/format/unlimitedFilter.filter.js +35 -0
  38. data/app/assets/javascripts/bastion/incubator/stylesheets/alch-edit.scss +34 -0
  39. data/app/assets/javascripts/bastion/incubator/stylesheets/header.scss +207 -0
  40. data/app/assets/javascripts/bastion/incubator/views/alch-alert.html +6 -0
  41. data/app/assets/javascripts/bastion/incubator/views/alch-dropdown.html +19 -0
  42. data/app/assets/javascripts/bastion/incubator/views/alch-edit-add-item.html +21 -0
  43. data/app/assets/javascripts/bastion/incubator/views/alch-edit-add-remove-cancel.html +28 -0
  44. data/app/assets/javascripts/bastion/incubator/views/alch-edit-checkbox.html +6 -0
  45. data/app/assets/javascripts/bastion/incubator/views/alch-edit-custom.html +8 -0
  46. data/app/assets/javascripts/bastion/incubator/views/alch-edit-multiselect.html +17 -0
  47. data/app/assets/javascripts/bastion/incubator/views/alch-edit-save-cancel.html +20 -0
  48. data/app/assets/javascripts/bastion/incubator/views/alch-edit-select.html +10 -0
  49. data/app/assets/javascripts/bastion/incubator/views/alch-edit-text.html +6 -0
  50. data/app/assets/javascripts/bastion/incubator/views/alch-edit-textarea.html +6 -0
  51. data/app/assets/javascripts/bastion/incubator/views/alch-edit.html +18 -0
  52. data/app/assets/javascripts/bastion/incubator/views/alch-flyout.html +10 -0
  53. data/app/assets/javascripts/bastion/incubator/views/alch-form-buttons.html +10 -0
  54. data/app/assets/javascripts/bastion/incubator/views/alch-form-group.html +9 -0
  55. data/app/assets/javascripts/bastion/incubator/views/alch-menu.html +18 -0
  56. data/app/assets/javascripts/bastion/incubator/views/alch-modal-remove.html +13 -0
  57. data/app/assets/javascripts/bastion/incubator/views/alch-save-control.html +18 -0
  58. data/app/assets/javascripts/bastion/layouts/details-nutupane.html +73 -0
  59. data/app/assets/javascripts/bastion/layouts/nutupane.html +63 -0
  60. data/app/assets/javascripts/bastion/layouts/select-all-results.html +9 -0
  61. data/app/assets/javascripts/bastion/menu/menu-expander.service.js +51 -0
  62. data/app/assets/javascripts/bastion/menu/menu.module.js +26 -0
  63. data/app/assets/javascripts/bastion/utils/as.filter.js +33 -0
  64. data/app/assets/javascripts/bastion/utils/form-utils.service.js +53 -0
  65. data/app/assets/javascripts/bastion/utils/utils.module.js +21 -0
  66. data/app/assets/javascripts/bastion/widgets/current-tasks.directive.js +67 -0
  67. data/app/assets/javascripts/bastion/widgets/nutupane-table.directive.js +59 -0
  68. data/app/assets/javascripts/bastion/widgets/nutupane.factory.js +316 -0
  69. data/app/assets/javascripts/bastion/widgets/page-title.directive.js +61 -0
  70. data/app/assets/javascripts/bastion/widgets/page-title.service.js +42 -0
  71. data/app/assets/javascripts/bastion/widgets/path-selector.directive.js +109 -0
  72. data/app/assets/javascripts/bastion/widgets/views/current-tasks.html +23 -0
  73. data/app/assets/javascripts/bastion/widgets/views/path-selector.html +11 -0
  74. data/app/assets/javascripts/bastion/widgets/widgets.module.js +24 -0
  75. data/app/assets/stylesheets/bastion/animations.less +15 -0
  76. data/app/assets/stylesheets/bastion/bastion.less +160 -0
  77. data/app/assets/stylesheets/bastion/forms.less +41 -0
  78. data/app/assets/stylesheets/bastion/gpg-keys.less +36 -0
  79. data/app/assets/stylesheets/bastion/helpers.less +6 -0
  80. data/app/assets/stylesheets/bastion/mixins.less +15 -0
  81. data/app/assets/stylesheets/bastion/nutupane.less +382 -0
  82. data/app/assets/stylesheets/bastion/overrides.less +54 -0
  83. data/app/assets/stylesheets/bastion/path-selector.less +123 -0
  84. data/app/assets/stylesheets/bastion/systems.less +35 -0
  85. data/app/assets/stylesheets/bastion/tasks.less +23 -0
  86. data/app/assets/stylesheets/bastion/typography.less +31 -0
  87. data/app/assets/stylesheets/bastion/variables.less +3 -0
  88. data/app/controllers/bastion/bastion_controller.rb +24 -0
  89. data/app/views/bastion/layouts/application.html.erb +32 -0
  90. data/app/views/bastion/layouts/application_ie.html.erb +5 -0
  91. data/bastion.js +26 -0
  92. data/bower.json +94 -0
  93. data/config/routes.rb +25 -0
  94. data/config/routes/mount_engine.rb +3 -0
  95. data/grunt/bower.js +20 -0
  96. data/grunt/htmlhint.js +15 -0
  97. data/grunt/jshint.js +9 -0
  98. data/grunt/karma.js +83 -0
  99. data/lib/bastion.rb +17 -0
  100. data/lib/bastion/engine.rb +37 -0
  101. data/lib/bastion/version.rb +3 -0
  102. data/package.json +29 -0
  103. data/test/auth/authorization.service.test.js +63 -0
  104. data/test/bastion/bastion-resource.factory.test.js +31 -0
  105. data/test/bastion/test-constants.js +30 -0
  106. data/test/i18n/translate.service.test.js +31 -0
  107. data/test/incubator/alch-alert.directive.test.js +84 -0
  108. data/test/incubator/alch-container-scroll.directive.test.js +68 -0
  109. data/test/incubator/alch-dropdown.directive.test.js +113 -0
  110. data/test/incubator/alch-edit.directive.test.js +320 -0
  111. data/test/incubator/alch-flyout.directive.test.js +73 -0
  112. data/test/incubator/alch-form-buttons.directive.test.js +55 -0
  113. data/test/incubator/alch-form-group.directive.test.js +76 -0
  114. data/test/incubator/alch-infinite-scroll.directive.test.js +123 -0
  115. data/test/incubator/alch-menu.directive.test.js +94 -0
  116. data/test/incubator/alch-modal.directive.test.js +81 -0
  117. data/test/incubator/alch-table.directive.test.js +270 -0
  118. data/test/incubator/format/array-to-string.filter.test.js +38 -0
  119. data/test/incubator/format/boolean-to-yes-no.filter.test.js +41 -0
  120. data/test/incubator/format/capitalize.filter.test.js +35 -0
  121. data/test/incubator/format/key-value-to-string.filter.test.js +60 -0
  122. data/test/incubator/format/unlimited-filter.filter.test.js +31 -0
  123. data/test/incubator/nutupane-table.directive.test.js +69 -0
  124. data/test/incubator/nutupane.factory.test.js +307 -0
  125. data/test/menu/menu-expander.service.test.js +74 -0
  126. data/test/test-mocks.module.js +268 -0
  127. data/test/utils/as.filter.test.js +33 -0
  128. data/test/utils/form-utils.service.test.js +52 -0
  129. data/test/widgets/page-title.directive.test.js +54 -0
  130. data/test/widgets/page-title.service.test.js +51 -0
  131. data/test/widgets/path-selector.directive.test.js +136 -0
  132. data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.eot +0 -0
  133. data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.svg +229 -0
  134. data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  135. data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.woff +0 -0
  136. data/vendor/assets/fonts/bastion/font-awesome/FontAwesome.otf +0 -0
  137. data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.eot +0 -0
  138. data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.svg +399 -0
  139. data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.ttf +0 -0
  140. data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.woff +0 -0
  141. data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.eot +0 -0
  142. data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.svg +146 -0
  143. data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.ttf +0 -0
  144. data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.woff +0 -0
  145. data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.eot +0 -0
  146. data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.svg +146 -0
  147. data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.ttf +0 -0
  148. data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.woff +0 -0
  149. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.eot +0 -0
  150. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.svg +146 -0
  151. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.ttf +0 -0
  152. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.woff +0 -0
  153. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.eot +0 -0
  154. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.svg +146 -0
  155. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.ttf +0 -0
  156. data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.woff +0 -0
  157. data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.eot +0 -0
  158. data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.svg +146 -0
  159. data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.ttf +0 -0
  160. data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.woff +0 -0
  161. data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.eot +0 -0
  162. data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.svg +146 -0
  163. data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.ttf +0 -0
  164. data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.woff +0 -0
  165. data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.eot +0 -0
  166. data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.svg +146 -0
  167. data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.ttf +0 -0
  168. data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.woff +0 -0
  169. data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.eot +0 -0
  170. data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.svg +146 -0
  171. data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.ttf +0 -0
  172. data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.woff +0 -0
  173. data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.eot +0 -0
  174. data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.svg +146 -0
  175. data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.ttf +0 -0
  176. data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.woff +0 -0
  177. data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.eot +0 -0
  178. data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.svg +146 -0
  179. data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  180. data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.woff +0 -0
  181. data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.eot +0 -0
  182. data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.svg +454 -0
  183. data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.ttf +0 -0
  184. data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.woff +0 -0
  185. data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.eot +0 -0
  186. data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.svg +454 -0
  187. data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.ttf +0 -0
  188. data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.woff +0 -0
  189. data/vendor/assets/javascripts/bastion/alchemy/alchemy.js +20 -0
  190. data/vendor/assets/javascripts/bastion/angular-animate/angular-animate.js +1226 -0
  191. data/vendor/assets/javascripts/bastion/angular-blocks/angular-blocks.js +79 -0
  192. data/vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap-tpls.js +3677 -0
  193. data/vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap.js +3427 -0
  194. data/vendor/assets/javascripts/bastion/angular-gettext/angular-gettext.js +345 -0
  195. data/vendor/assets/javascripts/bastion/angular-resource/angular-resource.js +594 -0
  196. data/vendor/assets/javascripts/bastion/angular-route/angular-route.js +920 -0
  197. data/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +622 -0
  198. data/vendor/assets/javascripts/bastion/angular-ui-bootstrap/datepicker.js +447 -0
  199. data/vendor/assets/javascripts/bastion/angular-ui-bootstrap/timepicker.js +232 -0
  200. data/vendor/assets/javascripts/bastion/angular-ui-router/angular-ui-router.js +3223 -0
  201. data/vendor/assets/javascripts/bastion/angular-uuid4/angular-uuid4.js +21 -0
  202. data/vendor/assets/javascripts/bastion/angular/angular.js +20560 -0
  203. data/vendor/assets/javascripts/bastion/es5-shim/es5-shim.js +1216 -0
  204. data/vendor/assets/javascripts/bastion/json3/json3.js +861 -0
  205. data/vendor/assets/javascripts/bastion/ngUpload/ng-upload.js +205 -0
  206. data/vendor/assets/javascripts/bastion/underscore/underscore.js +1276 -0
  207. data/vendor/assets/stylesheets/bastion/alchemy/_colors.scss +99 -0
  208. data/vendor/assets/stylesheets/bastion/alchemy/_media_object.scss +22 -0
  209. data/vendor/assets/stylesheets/bastion/alchemy/_mixins.scss +24 -0
  210. data/vendor/assets/stylesheets/bastion/alchemy/_normalize.scss +396 -0
  211. data/vendor/assets/stylesheets/bastion/alchemy/_vars.scss +31 -0
  212. data/vendor/assets/stylesheets/bastion/alchemy/alchemy.scss +8 -0
  213. data/vendor/assets/stylesheets/bastion/bootstrap/alerts.less +67 -0
  214. data/vendor/assets/stylesheets/bastion/bootstrap/badges.less +51 -0
  215. data/vendor/assets/stylesheets/bastion/bootstrap/bootstrap.less +49 -0
  216. data/vendor/assets/stylesheets/bastion/bootstrap/breadcrumbs.less +23 -0
  217. data/vendor/assets/stylesheets/bastion/bootstrap/button-groups.less +227 -0
  218. data/vendor/assets/stylesheets/bastion/bootstrap/buttons.less +155 -0
  219. data/vendor/assets/stylesheets/bastion/bootstrap/carousel.less +232 -0
  220. data/vendor/assets/stylesheets/bastion/bootstrap/close.less +33 -0
  221. data/vendor/assets/stylesheets/bastion/bootstrap/code.less +53 -0
  222. data/vendor/assets/stylesheets/bastion/bootstrap/component-animations.less +29 -0
  223. data/vendor/assets/stylesheets/bastion/bootstrap/dropdowns.less +187 -0
  224. data/vendor/assets/stylesheets/bastion/bootstrap/forms.less +375 -0
  225. data/vendor/assets/stylesheets/bastion/bootstrap/glyphicons.less +237 -0
  226. data/vendor/assets/stylesheets/bastion/bootstrap/grid.less +79 -0
  227. data/vendor/assets/stylesheets/bastion/bootstrap/input-groups.less +136 -0
  228. data/vendor/assets/stylesheets/bastion/bootstrap/jumbotron.less +46 -0
  229. data/vendor/assets/stylesheets/bastion/bootstrap/labels.less +64 -0
  230. data/vendor/assets/stylesheets/bastion/bootstrap/list-group.less +88 -0
  231. data/vendor/assets/stylesheets/bastion/bootstrap/media.less +56 -0
  232. data/vendor/assets/stylesheets/bastion/bootstrap/mixins.less +845 -0
  233. data/vendor/assets/stylesheets/bastion/bootstrap/modals.less +129 -0
  234. data/vendor/assets/stylesheets/bastion/bootstrap/navbar.less +612 -0
  235. data/vendor/assets/stylesheets/bastion/bootstrap/navs.less +242 -0
  236. data/vendor/assets/stylesheets/bastion/bootstrap/normalize.less +406 -0
  237. data/vendor/assets/stylesheets/bastion/bootstrap/pager.less +55 -0
  238. data/vendor/assets/stylesheets/bastion/bootstrap/pagination.less +85 -0
  239. data/vendor/assets/stylesheets/bastion/bootstrap/panels.less +182 -0
  240. data/vendor/assets/stylesheets/bastion/bootstrap/popovers.less +133 -0
  241. data/vendor/assets/stylesheets/bastion/bootstrap/print.less +105 -0
  242. data/vendor/assets/stylesheets/bastion/bootstrap/progress-bars.less +80 -0
  243. data/vendor/assets/stylesheets/bastion/bootstrap/responsive-utilities.less +209 -0
  244. data/vendor/assets/stylesheets/bastion/bootstrap/scaffolding.less +119 -0
  245. data/vendor/assets/stylesheets/bastion/bootstrap/tables.less +231 -0
  246. data/vendor/assets/stylesheets/bastion/bootstrap/theme.less +247 -0
  247. data/vendor/assets/stylesheets/bastion/bootstrap/thumbnails.less +36 -0
  248. data/vendor/assets/stylesheets/bastion/bootstrap/tooltip.less +95 -0
  249. data/vendor/assets/stylesheets/bastion/bootstrap/type.less +281 -0
  250. data/vendor/assets/stylesheets/bastion/bootstrap/utilities.less +56 -0
  251. data/vendor/assets/stylesheets/bastion/bootstrap/variables.less +642 -0
  252. data/vendor/assets/stylesheets/bastion/bootstrap/wells.less +29 -0
  253. data/vendor/assets/stylesheets/bastion/font-awesome/less/bootstrap.less +84 -0
  254. data/vendor/assets/stylesheets/bastion/font-awesome/less/core.less +129 -0
  255. data/vendor/assets/stylesheets/bastion/font-awesome/less/extras.less +93 -0
  256. data/vendor/assets/stylesheets/bastion/font-awesome/less/font-awesome-ie7.less +1953 -0
  257. data/vendor/assets/stylesheets/bastion/font-awesome/less/font-awesome.less +33 -0
  258. data/vendor/assets/stylesheets/bastion/font-awesome/less/icons.less +381 -0
  259. data/vendor/assets/stylesheets/bastion/font-awesome/less/mixins.less +48 -0
  260. data/vendor/assets/stylesheets/bastion/font-awesome/less/path.less +14 -0
  261. data/vendor/assets/stylesheets/bastion/font-awesome/less/variables.less +735 -0
  262. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_bootstrap.scss +84 -0
  263. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_core.scss +129 -0
  264. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_extras.scss +93 -0
  265. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_icons.scss +381 -0
  266. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_mixins.scss +48 -0
  267. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_path.scss +14 -0
  268. data/vendor/assets/stylesheets/bastion/font-awesome/scss/_variables.scss +734 -0
  269. data/vendor/assets/stylesheets/bastion/font-awesome/scss/font-awesome-ie7.scss +1953 -0
  270. data/vendor/assets/stylesheets/bastion/font-awesome/scss/font-awesome.scss +33 -0
  271. data/vendor/assets/stylesheets/bastion/rcue/buttons.less +44 -0
  272. data/vendor/assets/stylesheets/bastion/rcue/fonts.less +52 -0
  273. data/vendor/assets/stylesheets/bastion/rcue/forms.less +19 -0
  274. data/vendor/assets/stylesheets/bastion/rcue/mixins.less +50 -0
  275. data/vendor/assets/stylesheets/bastion/rcue/navbar.less +481 -0
  276. data/vendor/assets/stylesheets/bastion/rcue/rcue.less +15 -0
  277. data/vendor/assets/stylesheets/bastion/rcue/variables.less +47 -0
  278. metadata +376 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @ngdoc directive
3
+ * @name alchemy.directive:alchFlyout
4
+ * @restrict EA
5
+ *
6
+ * @description
7
+ * Provides a "flyout" sub-menu for menu items with one or more
8
+ * child menu items.
9
+ */
10
+ angular.module('alchemy').directive('alchFlyout', function () {
11
+ return {
12
+ restrict: 'EA',
13
+ replace: true,
14
+ scope: {
15
+ 'flyout' : '=alchFlyout'
16
+ },
17
+ templateUrl: 'incubator/views/alch-flyout.html'
18
+ };
19
+ });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copyright 2014 Red Hat, Inc.
3
+ *
4
+ * This software is licensed to you under the GNU General Public
5
+ * License as published by the Free Software Foundation; either version
6
+ * 2 of the License (GPLv2) or (at your option) any later version.
7
+ * There is NO WARRANTY for this software, express or implied,
8
+ * including the implied warranties of MERCHANTABILITY,
9
+ * NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
10
+ * have received a copy of GPLv2 along with this software; if not, see
11
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12
+ */
13
+
14
+ /**
15
+ * @ngdoc directive
16
+ * @name alchemy.directive:alchFormButtons
17
+ *
18
+ * @description
19
+ * Encapsulates the standard structure and styling for create and cancel buttons
20
+ * when used with a form.
21
+ *
22
+ * @example
23
+ * <div alch-form-buttons
24
+ on-cancel="transitionTo('product.index')"
25
+ on-save="save(product)"
26
+ working="working">
27
+ </div>
28
+ */
29
+ angular.module('alchemy').directive('alchFormButtons', function () {
30
+ return {
31
+ replace: true,
32
+ require: '^form',
33
+ templateUrl: 'incubator/views/alch-form-buttons.html',
34
+ scope: {
35
+ handleCancel: '&onCancel',
36
+ handleSave: '&onSave',
37
+ working: '='
38
+ },
39
+ link: function (scope, iElement, iAttrs, controller) {
40
+
41
+ if (scope.working === undefined) {
42
+ scope.working = false;
43
+ }
44
+
45
+ scope.isInvalid = function () {
46
+ var invalid = controller.$invalid;
47
+
48
+ angular.forEach(controller, function (value) {
49
+ if (value && value.$error) {
50
+ if (value.$error.server) {
51
+ invalid = false;
52
+ }
53
+ }
54
+ });
55
+
56
+ return invalid;
57
+ };
58
+ }
59
+ };
60
+ });
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Copyright 2014 Red Hat, Inc.
3
+ *
4
+ * This software is licensed to you under the GNU General Public
5
+ * License as published by the Free Software Foundation; either version
6
+ * 2 of the License (GPLv2) or (at your option) any later version.
7
+ * There is NO WARRANTY for this software, express or implied,
8
+ * including the implied warranties of MERCHANTABILITY,
9
+ * NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
10
+ * have received a copy of GPLv2 along with this software; if not, see
11
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12
+ */
13
+
14
+ /**
15
+ * @ngdoc directive
16
+ * @name alchemy.directive:alchFormGroup
17
+ *
18
+ * @description
19
+ * Encapsulates the structure and styling for a label + input used within a
20
+ * Bootstrap3 based form.
21
+ *
22
+ * @example
23
+ * <div alch-form-group label="{{ 'Name' | translate }}" required>
24
+ <input id="name"
25
+ name="name"
26
+ ng-model="product.name"
27
+ type="text"
28
+ tabindex="1"
29
+ required/>
30
+ </div>
31
+ */
32
+ angular.module('alchemy').directive('alchFormGroup', function () {
33
+ function getInput(element) {
34
+ // table is used for bootstrap3 date/time pickers
35
+ var input = element.find('table');
36
+
37
+ if (input.length === 0) {
38
+ input = element.find('input');
39
+
40
+ if (input.length === 0) {
41
+ input = element.find('select');
42
+
43
+ if (input.length === 0) {
44
+ input = element.find('textarea');
45
+ }
46
+ }
47
+ }
48
+ return input;
49
+ }
50
+
51
+ return {
52
+ transclude: true,
53
+ replace: true,
54
+ require: '^form',
55
+ templateUrl: 'incubator/views/alch-form-group.html',
56
+ scope: {
57
+ 'label': '@',
58
+ 'field': '@'
59
+ },
60
+ link: function (scope, iElement, iAttrs, controller) {
61
+ var input = getInput(iElement),
62
+ type = input.attr('type'),
63
+ field;
64
+
65
+ if (!scope.field) {
66
+ scope.field = input.attr('id');
67
+ }
68
+ field = scope.field;
69
+
70
+ if (['checkbox', 'radio', 'time'].indexOf(type) === -1) {
71
+ input.addClass('form-control');
72
+ }
73
+
74
+ if (input.attr('required')) {
75
+ iElement.addClass('required');
76
+ }
77
+
78
+ if (controller[field]) {
79
+ scope.error = controller[field].$error;
80
+ }
81
+
82
+ scope.hasErrors = function () {
83
+ return controller[field] && controller[field].$invalid && controller[field].$dirty;
84
+ };
85
+ }
86
+ };
87
+ });
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Copyright 2014 Red Hat, Inc.
3
+ *
4
+ * This software is licensed to you under the GNU General Public
5
+ * License as published by the Free Software Foundation; either version
6
+ * 2 of the License (GPLv2) or (at your option) any later version.
7
+ * There is NO WARRANTY for this software, express or implied,
8
+ * including the implied warranties of MERCHANTABILITY,
9
+ * NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
10
+ * have received a copy of GPLv2 along with this software; if not, see
11
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12
+ */
13
+
14
+ /**
15
+ * @ngdoc directive
16
+ * @name alchemy.directive:alchInfiniteScroll
17
+ *
18
+ * @description
19
+ * The infinite scroll directive should be applied to a wrapping div around another element
20
+ * and provides automatic loading when a user scrolls to the bottom of the element.
21
+ *
22
+ * Note that the element using the alch-infinite-scroll directive should have it's overflow
23
+ * set properly.
24
+ *
25
+ * @example
26
+ * <pre>
27
+ * <div alch-infinite-scroll="loadMore()" style="height: 100px; overflow-y: auto;">
28
+ * <p style="height: 1000px;">Hello</p>
29
+ * </div>
30
+ * </pre>
31
+ */
32
+ angular.module('alchemy').directive('alchInfiniteScroll', [function () {
33
+ return {
34
+ scope: {
35
+ data: '=',
36
+ loadMoreFunction: '&alchInfiniteScroll',
37
+ skipInitialLoad: '='
38
+ },
39
+ controller: function ($scope, $element) {
40
+
41
+ var result, raw = $element[0];
42
+
43
+ $element.bind('scroll', function () {
44
+ var sliderPosition = raw.scrollTop + raw.offsetHeight;
45
+ if (sliderPosition > 0 && sliderPosition >= raw.scrollHeight - 1) {
46
+ $scope.loadMoreFunction();
47
+ }
48
+ });
49
+
50
+ var getScrollHeight = function () {
51
+ var scrollHeight = 0;
52
+ $element.children().each(function () {
53
+ scrollHeight = scrollHeight + $(this).get(0).scrollHeight;
54
+ });
55
+ return scrollHeight;
56
+ };
57
+
58
+ var isPromise = function (promise) {
59
+ return promise && promise.hasOwnProperty('then');
60
+ };
61
+
62
+ var loadUntilScroll = function () {
63
+ var result;
64
+ if (getScrollHeight() < $element.height()) {
65
+ result = $scope.loadMoreFunction();
66
+ if (isPromise(result)) {
67
+ result.then(function () {
68
+ if (getScrollHeight() < $element.height()) {
69
+ loadUntilScroll();
70
+ }
71
+ });
72
+ }
73
+ }
74
+ };
75
+
76
+ if (!$scope.skipInitialLoad && ($scope.data === undefined || $scope.data.length === 0)) {
77
+ result = $scope.loadMoreFunction();
78
+ if (isPromise(result)) {
79
+ result.then(loadUntilScroll);
80
+ }
81
+ }
82
+ }
83
+ };
84
+ }]);
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @ngdoc directive
3
+ * @name alchemy.directive:alchMenu
4
+ * @restrict EA
5
+ * @requires $window
6
+ *
7
+ * @description
8
+ * Provides a menu.
9
+ */
10
+ angular.module('alchemy').directive('alchMenu', ['$window', function ($window) {
11
+ return {
12
+ restrict: 'EA',
13
+ replace: true,
14
+ scope: {
15
+ 'menu': '=alchMenu',
16
+ 'compact' : '@'
17
+ },
18
+ templateUrl: 'incubator/views/alch-menu.html',
19
+ controller: ['$scope', function ($scope) {
20
+ $scope.dropdown = {};
21
+
22
+ $scope.handleHover = function (item, mousein) {
23
+ if (item.type === 'dropdown' && mousein) {
24
+ item.active = true;
25
+ $scope.dropdown = item.items;
26
+ $scope.dropdown.show = true;
27
+ $scope.dropdown.direction = $scope.menu.location;
28
+ } else {
29
+ $scope.dropdown.show = false;
30
+
31
+ if (item !== $scope.menu.activeItem) {
32
+ item.active = false;
33
+ }
34
+ }
35
+ };
36
+
37
+ }],
38
+ link: function (scope, element, attrs) {
39
+ var elementOriginalOffset;
40
+
41
+ if (attrs.compact !== undefined) {
42
+ elementOriginalOffset = $(element).offset().top;
43
+
44
+ angular.element($window).bind('scroll', function () {
45
+ var windowScrollTop = $($window).scrollTop();
46
+
47
+ if (windowScrollTop > elementOriginalOffset + 2) {
48
+ element.parent().addClass('compact');
49
+ } else if (windowScrollTop < elementOriginalOffset) {
50
+ element.parent().removeClass('compact');
51
+ }
52
+ });
53
+ }
54
+ }
55
+ };
56
+ }]);
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Copyright 2014 Red Hat, Inc.
3
+ *
4
+ * This software is licensed to you under the GNU General Public
5
+ * License as published by the Free Software Foundation; either version
6
+ * 2 of the License (GPLv2) or (at your option) any later version.
7
+ * There is NO WARRANTY for this software, express or implied,
8
+ * including the implied warranties of MERCHANTABILITY,
9
+ * NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
10
+ * have received a copy of GPLv2 along with this software; if not, see
11
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12
+ */
13
+
14
+ /**
15
+ * @ngdoc directive
16
+ * @name alchemy.directive:alchConfirm
17
+ * @restrict A
18
+ *
19
+ * @requires $templateCache
20
+ * @requires $modal
21
+ *
22
+ * @description
23
+ * Provides a wrapper around angular-ui's modal dialog service.
24
+ */
25
+ angular.module('alchemy').directive('alchModal',
26
+ ['$templateCache', '$modal', function ($templateCache, $modal) {
27
+ return {
28
+ // To be expanded when we add additional type of modals
29
+ templateUrl: 'incubator/views/alch-modal-remove.html',
30
+ replace: true,
31
+ scope: {
32
+ action: '&alchModal',
33
+ modelName: '@model',
34
+ model: '=',
35
+ modalHeader: '@',
36
+ modalBody: '@'
37
+ },
38
+ compile: function (element) {
39
+ return function (scope) {
40
+ var modalInstance, modalController, modalId;
41
+
42
+ modalId = 'alchModal%d.html'.replace('%d', Math.random().toString());
43
+
44
+ modalController = ['$scope', '$modalInstance', 'model', function ($scope, $modalInstance, model) {
45
+ $scope[scope.modelName] = model;
46
+ $scope['modalHeader'] = scope.modalHeader;
47
+ $scope['modalBody'] = scope.modalBody;
48
+
49
+ $scope.ok = function () {
50
+ $modalInstance.close();
51
+ };
52
+
53
+ $scope.cancel = function () {
54
+ $modalInstance.dismiss('cancel');
55
+ };
56
+ }];
57
+
58
+ scope.openModal = function () {
59
+ modalInstance = $modal.open({
60
+ templateUrl: modalId,
61
+ controller: modalController,
62
+ resolve: {
63
+ model: function () {
64
+ return scope[scope.modelName];
65
+ }
66
+ }
67
+ });
68
+
69
+ modalInstance.result.then(function () {
70
+ scope.action();
71
+ });
72
+ };
73
+
74
+ scope.$parent.openModal = scope.openModal;
75
+
76
+ $templateCache.put(modalId, element.html());
77
+ };
78
+ }
79
+ };
80
+ }]);
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Copyright 2014 Red Hat, Inc.
3
+ *
4
+ * This software is licensed to you under the GNU General Public
5
+ * License as published by the Free Software Foundation; either version
6
+ * 2 of the License (GPLv2) or (at your option) any later version.
7
+ * There is NO WARRANTY for this software, express or implied,
8
+ * including the implied warranties of MERCHANTABILITY,
9
+ * NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
10
+ * have received a copy of GPLv2 along with this software; if not, see
11
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12
+ **/
13
+
14
+ /**
15
+ * @ngdoc directive
16
+ * @name alchemy.directive:alchSaveButton
17
+ *
18
+ * @description
19
+ * Simple directive for encapsulating create and cancel buttons. This includes states
20
+ * for disabling buttons and setting a visual working state.
21
+ *
22
+ * @example
23
+ * <pre>
24
+ * <div alch-save-control
25
+ * on-cancel="closeItem()"
26
+ * on-save="save(product)"
27
+ * invalid="productForm.$invalid">
28
+ * </div>
29
+ */
30
+ angular.module('alchemy').directive('alchSaveControl', function () {
31
+ return {
32
+ restrict: 'AE',
33
+ replace: true,
34
+ templateUrl: 'incubator/views/alch-save-control.html',
35
+ scope: {
36
+ handleSave: '&onSave',
37
+ handleCancel: '&onCancel',
38
+ invalid: '=',
39
+ working: '='
40
+ }
41
+ };
42
+ });
@@ -0,0 +1,295 @@
1
+ /**
2
+ * @ngdoc directive
3
+ * @name alchemy.directive:alchTable
4
+ * @restrict A
5
+ *
6
+ * @description
7
+ *
8
+ * @example
9
+ */
10
+ angular.module('alchemy')
11
+ .directive('alchTable', [function () {
12
+ return {
13
+ restrict: 'A',
14
+ replace: true,
15
+ scope: {
16
+ 'table': '=alchTable',
17
+ 'rowSelect': '@',
18
+ 'rowChoice': '@'
19
+ },
20
+ controller: 'AlchTableController'
21
+ };
22
+ }])
23
+ .controller('AlchTableController', ['$scope', function ($scope) {
24
+ var rows = $scope.rows = [],
25
+ headers = $scope.headers = [],
26
+ self = this;
27
+
28
+ this.selection = {allSelected: false, selectAllDisabled: false};
29
+
30
+ $scope.table.numSelected = 0;
31
+ $scope.table.chosenRow = null;
32
+
33
+ $scope.table.getSelected = function () {
34
+ var selectedRows = [];
35
+ angular.forEach($scope.table.rows, function (row, rowIndex) {
36
+ if (row.selected === true) {
37
+ selectedRows.push($scope.table.rows[rowIndex]);
38
+ }
39
+ });
40
+ return selectedRows;
41
+ };
42
+
43
+ $scope.table.selectAllDisabled = false;
44
+
45
+ this.disableSelectAll = $scope.table.disableSelectAll = function () {
46
+ self.selection.selectAllDisabled = true;
47
+ };
48
+
49
+ this.enableSelectAll = $scope.table.enableSelectAll = function () {
50
+ self.selection.selectAllDisabled = false;
51
+ };
52
+
53
+ $scope.table.allSelected = function () {
54
+ return self.selection.allSelected;
55
+ };
56
+
57
+ this.addRow = function (row) {
58
+ rows.push(row);
59
+
60
+ if (headers.length) {
61
+ angular.forEach(headers[0].columns, function (column, columnIndex) {
62
+ if (row.cells[columnIndex]) {
63
+ row.cells[columnIndex].show = column.show;
64
+ }
65
+ });
66
+ }
67
+ };
68
+
69
+ this.addHeader = function (columns) {
70
+ headers.push(columns);
71
+ };
72
+
73
+ this.itemSelected = function (row) {
74
+ $scope.table.numSelected += row.selected ? 1 : -1;
75
+ self.selection.allSelected = false;
76
+ };
77
+
78
+ this.itemChosen = function (row) {
79
+ $scope.table.chosenRow = row;
80
+ };
81
+
82
+ this.selectAll = $scope.table.selectAll = function (selected) {
83
+ var table = $scope.table,
84
+ rowsSelected = 0;
85
+
86
+ self.selection.allSelected = selected;
87
+ angular.forEach(table.rows, function (row) {
88
+ if (!row.unselectable) {
89
+ row.selected = self.selection.allSelected;
90
+ rowsSelected = rowsSelected + 1;
91
+ }
92
+ });
93
+ $scope.table.numSelected = selected ? rowsSelected : 0;
94
+ };
95
+
96
+ }])
97
+ .directive('alchTableHead', [function () {
98
+ var rowSelectTemplate = function () {
99
+ return '<th class="row-select">' +
100
+ '<input type="checkbox"' +
101
+ 'ng-model="selection.allSelected"' +
102
+ 'ng-disabled="selection.selectAllDisabled"' +
103
+ 'ng-change="allSelected()">' +
104
+ '</th>';
105
+ }, rowChoiceTemplate = function () {
106
+ return '<th translate class="row-select"></th>';
107
+ };
108
+
109
+ return {
110
+ require: '^alchTable',
111
+ restrict: 'A',
112
+ scope: true,
113
+ controller: 'AlchTableHeadController',
114
+ compile: function (tElement, tAttrs) {
115
+ if (tAttrs.rowSelect !== undefined) {
116
+ tElement.prepend(rowSelectTemplate());
117
+ } else if (tAttrs.rowChoice !== undefined) {
118
+ tElement.prepend(rowChoiceTemplate());
119
+ }
120
+
121
+ return function (scope, element, attrs, alchTableController) {
122
+ if (tAttrs.rowSelect !== undefined) {
123
+ scope.table.rowSelect = true;
124
+ } else if (tAttrs.rowChoice !== undefined) {
125
+ scope.table.rowChoice = true;
126
+ }
127
+
128
+ alchTableController.addHeader(scope.header);
129
+
130
+ scope.selection = alchTableController.selection;
131
+
132
+ scope.allSelected = function () {
133
+ alchTableController.selectAll(scope.selection.allSelected);
134
+ };
135
+ };
136
+ }
137
+ };
138
+ }])
139
+ .controller('AlchTableHeadController', ['$scope', function ($scope) {
140
+ $scope.header = {
141
+ columns: []
142
+ };
143
+
144
+ this.addColumn = function (column) {
145
+ $scope.header.columns.push(column);
146
+ };
147
+ }])
148
+ .directive('alchTableColumn', ['$compile', function ($compile) {
149
+ var sortIconTemplate = '<th ng-click="table.sortBy(column)">' +
150
+ '<i class="sort-icon" ng-show="table.resource.sort.by == column.id" ng-class="{\'icon-sort-down\': column.sortOrder == \'DESC\', \'icon-sort-up\': column.sortOrder == \'ASC\'}"></i>' +
151
+ '</th>';
152
+ return {
153
+ require: '^alchTableHead',
154
+ restrict: 'A',
155
+ scope: true,
156
+ controller: ['$scope', function ($scope) {
157
+ $scope.column = { show: true };
158
+ }],
159
+ compile: function (element, attributes) {
160
+ if (attributes.hasOwnProperty("sortable")) {
161
+ var newElement = angular.element(sortIconTemplate);
162
+ newElement.find('.sort-icon').before(element.html());
163
+ newElement.addClass('sortable');
164
+ newElement.addClass(element.attr('class'));
165
+ element.replaceWith(newElement);
166
+ }
167
+ return function (scope, element, attributes, alchTableHeadController) {
168
+ if (attributes.hasOwnProperty("sortable")) {
169
+ $compile(element)(scope);
170
+ }
171
+ scope.column.id = attributes["alchTableColumn"];
172
+ alchTableHeadController.addColumn(scope.column);
173
+
174
+ scope.$watch('column.show', function (show) {
175
+ var display = show ? '' : 'none';
176
+ element.css('display', display);
177
+ });
178
+ };
179
+ }
180
+ };
181
+ }])
182
+ .directive('alchTableRow', ['$parse', function ($parse) {
183
+ var rowSelectTemplate, rowChoiceTemplate, activeRowTemplate;
184
+
185
+ rowSelectTemplate = function (model) {
186
+ return '<td class="row-select">' +
187
+ '<input type="checkbox"' +
188
+ 'ng-model="' + model + '.selected"' +
189
+ 'ng-disabled="' + model + '.unselectable"' +
190
+ 'ng-change="itemSelected(' + model + ')">' +
191
+ '</td>';
192
+ };
193
+
194
+ rowChoiceTemplate = function (model) {
195
+ return '<td class="row-choice">' +
196
+ '<input type="radio"' +
197
+ 'ng-model="table.chosenRow"' +
198
+ 'ng-value="' + model + '"' +
199
+ 'ng-click="itemChosen(' + model + ')">' +
200
+ '</td>';
201
+ };
202
+
203
+ activeRowTemplate = function (activeTest) {
204
+ return '<i class="icon-chevron-right selected-icon" ' +
205
+ 'ng-show="' + activeTest + ' "></i>';
206
+ };
207
+
208
+ return {
209
+ require: '^alchTable',
210
+ restrict: 'A',
211
+ scope: true,
212
+ controller: 'AlchTableRowController',
213
+ compile: function (tElement, tAttrs) {
214
+
215
+ if (tAttrs.activeRow !== undefined) {
216
+ tElement.find('td:first-child').append(activeRowTemplate(tAttrs.activeRow));
217
+ }
218
+
219
+ if (tAttrs.rowSelect !== undefined) {
220
+ tElement.prepend(rowSelectTemplate(tAttrs.rowSelect));
221
+ }
222
+
223
+ if (tAttrs.rowChoice !== undefined) {
224
+ tElement.prepend(rowChoiceTemplate(tAttrs.rowChoice));
225
+ }
226
+
227
+ if (tAttrs.activeRow !== undefined) {
228
+ tElement.find('td').attr('ng-class', '{ "active-row": ' + tAttrs.activeRow + ' }');
229
+ }
230
+
231
+ return function (scope, element, attrs, alchTableController) {
232
+ alchTableController.addRow(scope.row);
233
+
234
+ if (attrs.rowSelect) {
235
+ scope.model = $parse(attrs.rowSelect)(scope);
236
+
237
+ if ($parse(attrs.rowSelectIf)(scope)) {
238
+ scope.model.unselectable = true;
239
+ }
240
+
241
+ scope.$watch('model.selected', function (selected) {
242
+ if (selected) {
243
+ element.addClass('selected-row');
244
+ } else {
245
+ element.removeClass('selected-row');
246
+ }
247
+ });
248
+ } else if (attrs.rowChoice) {
249
+ scope.model = $parse(attrs.rowChoice)(scope);
250
+ }
251
+
252
+ if (attrs.activeRow) {
253
+ scope.activeTest = $parse(attrs.activeRow)(scope);
254
+ }
255
+
256
+ scope.itemSelected = function (row) {
257
+ alchTableController.itemSelected(row);
258
+ };
259
+
260
+ scope.itemChosen = function (row) {
261
+ element.parent().find('.selected-row').removeClass('selected-row');
262
+ element.addClass('selected-row');
263
+ alchTableController.itemChosen(row);
264
+ };
265
+ };
266
+ }
267
+ };
268
+ }])
269
+ .controller('AlchTableRowController', ['$scope', function ($scope) {
270
+ $scope.row = {
271
+ cells: []
272
+ };
273
+
274
+ this.addCell = function (cell) {
275
+ $scope.row.cells.push(cell);
276
+ };
277
+ }])
278
+ .directive('alchTableCell', [function () {
279
+ return {
280
+ require: '^alchTableRow',
281
+ restrict: 'A',
282
+ scope: true,
283
+ controller: ['$scope', function ($scope) {
284
+ $scope.cell = { show: true };
285
+ }],
286
+ link: function (scope, element, attrs, alchTableRowController) {
287
+ alchTableRowController.addCell(scope.cell);
288
+
289
+ scope.$watch('cell.show', function (show) {
290
+ var display = show ? '' : 'none';
291
+ element.css('display', display);
292
+ });
293
+ }
294
+ };
295
+ }]);