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.
- checksums.yaml +15 -0
- data/.jshintrc +35 -0
- data/Gruntfile.js +24 -0
- data/LICENSE +339 -0
- data/README.md +8 -0
- data/Rakefile +53 -0
- data/app/assets/javascripts/bastion/auth/auth.module.js +87 -0
- data/app/assets/javascripts/bastion/auth/authorization.service.js +48 -0
- data/app/assets/javascripts/bastion/bastion-bootstrap.js +32 -0
- data/app/assets/javascripts/bastion/bastion-resource.factory.js +39 -0
- data/app/assets/javascripts/bastion/bastion.js +52 -0
- data/app/assets/javascripts/bastion/bastion.module.js +213 -0
- data/app/assets/javascripts/bastion/i18n/README +9 -0
- data/app/assets/javascripts/bastion/i18n/i18n.module.js +24 -0
- data/app/assets/javascripts/bastion/i18n/katello.pot +968 -0
- data/app/assets/javascripts/bastion/i18n/locale/README +1 -0
- data/app/assets/javascripts/bastion/i18n/translate.service.js +14 -0
- data/app/assets/javascripts/bastion/i18n/translations.js +3 -0
- data/app/assets/javascripts/bastion/i18n/zanata.xml +28 -0
- data/app/assets/javascripts/bastion/incubator/alch-alert.directive.js +67 -0
- data/app/assets/javascripts/bastion/incubator/alch-container-scroll.directive.js +44 -0
- data/app/assets/javascripts/bastion/incubator/alch-dropdown.directive.js +28 -0
- data/app/assets/javascripts/bastion/incubator/alch-edit.directive.js +361 -0
- data/app/assets/javascripts/bastion/incubator/alch-flyout.directive.js +19 -0
- data/app/assets/javascripts/bastion/incubator/alch-form-buttons.directive.js +60 -0
- data/app/assets/javascripts/bastion/incubator/alch-form-group.directive.js +87 -0
- data/app/assets/javascripts/bastion/incubator/alch-infinite-scroll.directive.js +84 -0
- data/app/assets/javascripts/bastion/incubator/alch-menu.directive.js +56 -0
- data/app/assets/javascripts/bastion/incubator/alch-modal.directive.js +80 -0
- data/app/assets/javascripts/bastion/incubator/alch-save-control.directive.js +42 -0
- data/app/assets/javascripts/bastion/incubator/alch-table.directive.js +295 -0
- data/app/assets/javascripts/bastion/incubator/format/alch-format.module.js +21 -0
- data/app/assets/javascripts/bastion/incubator/format/array-to-string.filter.js +30 -0
- data/app/assets/javascripts/bastion/incubator/format/boolean-to-yes-no.filter.js +34 -0
- data/app/assets/javascripts/bastion/incubator/format/capitalize.filter.js +32 -0
- data/app/assets/javascripts/bastion/incubator/format/key-value-to-string.filter.js +40 -0
- data/app/assets/javascripts/bastion/incubator/format/unlimitedFilter.filter.js +35 -0
- data/app/assets/javascripts/bastion/incubator/stylesheets/alch-edit.scss +34 -0
- data/app/assets/javascripts/bastion/incubator/stylesheets/header.scss +207 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-alert.html +6 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-dropdown.html +19 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-add-item.html +21 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-add-remove-cancel.html +28 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-checkbox.html +6 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-custom.html +8 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-multiselect.html +17 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-save-cancel.html +20 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-select.html +10 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-text.html +6 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit-textarea.html +6 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-edit.html +18 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-flyout.html +10 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-form-buttons.html +10 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-form-group.html +9 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-menu.html +18 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-modal-remove.html +13 -0
- data/app/assets/javascripts/bastion/incubator/views/alch-save-control.html +18 -0
- data/app/assets/javascripts/bastion/layouts/details-nutupane.html +73 -0
- data/app/assets/javascripts/bastion/layouts/nutupane.html +63 -0
- data/app/assets/javascripts/bastion/layouts/select-all-results.html +9 -0
- data/app/assets/javascripts/bastion/menu/menu-expander.service.js +51 -0
- data/app/assets/javascripts/bastion/menu/menu.module.js +26 -0
- data/app/assets/javascripts/bastion/utils/as.filter.js +33 -0
- data/app/assets/javascripts/bastion/utils/form-utils.service.js +53 -0
- data/app/assets/javascripts/bastion/utils/utils.module.js +21 -0
- data/app/assets/javascripts/bastion/widgets/current-tasks.directive.js +67 -0
- data/app/assets/javascripts/bastion/widgets/nutupane-table.directive.js +59 -0
- data/app/assets/javascripts/bastion/widgets/nutupane.factory.js +316 -0
- data/app/assets/javascripts/bastion/widgets/page-title.directive.js +61 -0
- data/app/assets/javascripts/bastion/widgets/page-title.service.js +42 -0
- data/app/assets/javascripts/bastion/widgets/path-selector.directive.js +109 -0
- data/app/assets/javascripts/bastion/widgets/views/current-tasks.html +23 -0
- data/app/assets/javascripts/bastion/widgets/views/path-selector.html +11 -0
- data/app/assets/javascripts/bastion/widgets/widgets.module.js +24 -0
- data/app/assets/stylesheets/bastion/animations.less +15 -0
- data/app/assets/stylesheets/bastion/bastion.less +160 -0
- data/app/assets/stylesheets/bastion/forms.less +41 -0
- data/app/assets/stylesheets/bastion/gpg-keys.less +36 -0
- data/app/assets/stylesheets/bastion/helpers.less +6 -0
- data/app/assets/stylesheets/bastion/mixins.less +15 -0
- data/app/assets/stylesheets/bastion/nutupane.less +382 -0
- data/app/assets/stylesheets/bastion/overrides.less +54 -0
- data/app/assets/stylesheets/bastion/path-selector.less +123 -0
- data/app/assets/stylesheets/bastion/systems.less +35 -0
- data/app/assets/stylesheets/bastion/tasks.less +23 -0
- data/app/assets/stylesheets/bastion/typography.less +31 -0
- data/app/assets/stylesheets/bastion/variables.less +3 -0
- data/app/controllers/bastion/bastion_controller.rb +24 -0
- data/app/views/bastion/layouts/application.html.erb +32 -0
- data/app/views/bastion/layouts/application_ie.html.erb +5 -0
- data/bastion.js +26 -0
- data/bower.json +94 -0
- data/config/routes.rb +25 -0
- data/config/routes/mount_engine.rb +3 -0
- data/grunt/bower.js +20 -0
- data/grunt/htmlhint.js +15 -0
- data/grunt/jshint.js +9 -0
- data/grunt/karma.js +83 -0
- data/lib/bastion.rb +17 -0
- data/lib/bastion/engine.rb +37 -0
- data/lib/bastion/version.rb +3 -0
- data/package.json +29 -0
- data/test/auth/authorization.service.test.js +63 -0
- data/test/bastion/bastion-resource.factory.test.js +31 -0
- data/test/bastion/test-constants.js +30 -0
- data/test/i18n/translate.service.test.js +31 -0
- data/test/incubator/alch-alert.directive.test.js +84 -0
- data/test/incubator/alch-container-scroll.directive.test.js +68 -0
- data/test/incubator/alch-dropdown.directive.test.js +113 -0
- data/test/incubator/alch-edit.directive.test.js +320 -0
- data/test/incubator/alch-flyout.directive.test.js +73 -0
- data/test/incubator/alch-form-buttons.directive.test.js +55 -0
- data/test/incubator/alch-form-group.directive.test.js +76 -0
- data/test/incubator/alch-infinite-scroll.directive.test.js +123 -0
- data/test/incubator/alch-menu.directive.test.js +94 -0
- data/test/incubator/alch-modal.directive.test.js +81 -0
- data/test/incubator/alch-table.directive.test.js +270 -0
- data/test/incubator/format/array-to-string.filter.test.js +38 -0
- data/test/incubator/format/boolean-to-yes-no.filter.test.js +41 -0
- data/test/incubator/format/capitalize.filter.test.js +35 -0
- data/test/incubator/format/key-value-to-string.filter.test.js +60 -0
- data/test/incubator/format/unlimited-filter.filter.test.js +31 -0
- data/test/incubator/nutupane-table.directive.test.js +69 -0
- data/test/incubator/nutupane.factory.test.js +307 -0
- data/test/menu/menu-expander.service.test.js +74 -0
- data/test/test-mocks.module.js +268 -0
- data/test/utils/as.filter.test.js +33 -0
- data/test/utils/form-utils.service.test.js +52 -0
- data/test/widgets/page-title.directive.test.js +54 -0
- data/test/widgets/page-title.service.test.js +51 -0
- data/test/widgets/path-selector.directive.test.js +136 -0
- data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.svg +229 -0
- data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/fonts/bastion/bootstrap/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/fonts/bastion/font-awesome/FontAwesome.otf +0 -0
- data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.svg +399 -0
- data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.svg +146 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.svg +454 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.woff +0 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.eot +0 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.svg +454 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.ttf +0 -0
- data/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.woff +0 -0
- data/vendor/assets/javascripts/bastion/alchemy/alchemy.js +20 -0
- data/vendor/assets/javascripts/bastion/angular-animate/angular-animate.js +1226 -0
- data/vendor/assets/javascripts/bastion/angular-blocks/angular-blocks.js +79 -0
- data/vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap-tpls.js +3677 -0
- data/vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap.js +3427 -0
- data/vendor/assets/javascripts/bastion/angular-gettext/angular-gettext.js +345 -0
- data/vendor/assets/javascripts/bastion/angular-resource/angular-resource.js +594 -0
- data/vendor/assets/javascripts/bastion/angular-route/angular-route.js +920 -0
- data/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +622 -0
- data/vendor/assets/javascripts/bastion/angular-ui-bootstrap/datepicker.js +447 -0
- data/vendor/assets/javascripts/bastion/angular-ui-bootstrap/timepicker.js +232 -0
- data/vendor/assets/javascripts/bastion/angular-ui-router/angular-ui-router.js +3223 -0
- data/vendor/assets/javascripts/bastion/angular-uuid4/angular-uuid4.js +21 -0
- data/vendor/assets/javascripts/bastion/angular/angular.js +20560 -0
- data/vendor/assets/javascripts/bastion/es5-shim/es5-shim.js +1216 -0
- data/vendor/assets/javascripts/bastion/json3/json3.js +861 -0
- data/vendor/assets/javascripts/bastion/ngUpload/ng-upload.js +205 -0
- data/vendor/assets/javascripts/bastion/underscore/underscore.js +1276 -0
- data/vendor/assets/stylesheets/bastion/alchemy/_colors.scss +99 -0
- data/vendor/assets/stylesheets/bastion/alchemy/_media_object.scss +22 -0
- data/vendor/assets/stylesheets/bastion/alchemy/_mixins.scss +24 -0
- data/vendor/assets/stylesheets/bastion/alchemy/_normalize.scss +396 -0
- data/vendor/assets/stylesheets/bastion/alchemy/_vars.scss +31 -0
- data/vendor/assets/stylesheets/bastion/alchemy/alchemy.scss +8 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/alerts.less +67 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/badges.less +51 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/bootstrap.less +49 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/breadcrumbs.less +23 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/button-groups.less +227 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/buttons.less +155 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/carousel.less +232 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/close.less +33 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/code.less +53 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/component-animations.less +29 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/dropdowns.less +187 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/forms.less +375 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/glyphicons.less +237 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/grid.less +79 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/input-groups.less +136 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/jumbotron.less +46 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/labels.less +64 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/list-group.less +88 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/media.less +56 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/mixins.less +845 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/modals.less +129 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/navbar.less +612 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/navs.less +242 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/normalize.less +406 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/pager.less +55 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/pagination.less +85 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/panels.less +182 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/popovers.less +133 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/print.less +105 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/progress-bars.less +80 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/responsive-utilities.less +209 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/scaffolding.less +119 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/tables.less +231 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/theme.less +247 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/thumbnails.less +36 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/tooltip.less +95 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/type.less +281 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/utilities.less +56 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/variables.less +642 -0
- data/vendor/assets/stylesheets/bastion/bootstrap/wells.less +29 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/bootstrap.less +84 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/core.less +129 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/extras.less +93 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/font-awesome-ie7.less +1953 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/font-awesome.less +33 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/icons.less +381 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/mixins.less +48 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/path.less +14 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/less/variables.less +735 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_bootstrap.scss +84 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_core.scss +129 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_extras.scss +93 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_icons.scss +381 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_mixins.scss +48 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_path.scss +14 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/_variables.scss +734 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/font-awesome-ie7.scss +1953 -0
- data/vendor/assets/stylesheets/bastion/font-awesome/scss/font-awesome.scss +33 -0
- data/vendor/assets/stylesheets/bastion/rcue/buttons.less +44 -0
- data/vendor/assets/stylesheets/bastion/rcue/fonts.less +52 -0
- data/vendor/assets/stylesheets/bastion/rcue/forms.less +19 -0
- data/vendor/assets/stylesheets/bastion/rcue/mixins.less +50 -0
- data/vendor/assets/stylesheets/bastion/rcue/navbar.less +481 -0
- data/vendor/assets/stylesheets/bastion/rcue/rcue.less +15 -0
- data/vendor/assets/stylesheets/bastion/rcue/variables.less +47 -0
- metadata +376 -0
|
@@ -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 module
|
|
16
|
+
* @name Bastion.auth
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* Module for auth functionality.
|
|
20
|
+
*/
|
|
21
|
+
angular.module('Bastion.auth', ['Bastion']);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @ngdoc object
|
|
25
|
+
* @name Bastion.auth.config
|
|
26
|
+
*
|
|
27
|
+
* @requires $httpProvider
|
|
28
|
+
* @requires $provide
|
|
29
|
+
*
|
|
30
|
+
* @description
|
|
31
|
+
* Set up the UnauthorizedInterceptor
|
|
32
|
+
*/
|
|
33
|
+
angular.module('Bastion.auth').config(['$httpProvider', '$provide',
|
|
34
|
+
function ($httpProvider, $provide) {
|
|
35
|
+
$provide.factory('UnauthorizedInterceptor', ['$injector',
|
|
36
|
+
function ($injector) {
|
|
37
|
+
return {
|
|
38
|
+
responseError: function (response) {
|
|
39
|
+
var message,
|
|
40
|
+
$q = $injector.get('$q'),
|
|
41
|
+
$window = $injector.get('$window'),
|
|
42
|
+
translate = $injector.get('translate');
|
|
43
|
+
|
|
44
|
+
if (response.status === 401) {
|
|
45
|
+
$window.location.href = '/users/login';
|
|
46
|
+
} else if (response.status === 403) {
|
|
47
|
+
// Add unauthorized display message to response
|
|
48
|
+
message = translate('You are not authorized to perform this action.');
|
|
49
|
+
response.data.errors = [message];
|
|
50
|
+
response.data.displayMessage = message;
|
|
51
|
+
return $q.reject(response);
|
|
52
|
+
} else {
|
|
53
|
+
return $q.reject(response);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}]
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
$httpProvider.interceptors.push('UnauthorizedInterceptor');
|
|
61
|
+
}
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @ngdoc run
|
|
66
|
+
* @name Bastion.auth.run
|
|
67
|
+
*
|
|
68
|
+
* @requires $rootScope
|
|
69
|
+
* @requires $window
|
|
70
|
+
* @requires Authorization
|
|
71
|
+
*
|
|
72
|
+
* @description
|
|
73
|
+
* Check current user permissions and redirect to the 403 page if appropriate
|
|
74
|
+
*/
|
|
75
|
+
angular.module('Bastion.auth').run(['$rootScope', '$window', 'Authorization',
|
|
76
|
+
function ($rootScope, $window, Authorization) {
|
|
77
|
+
$rootScope.$on('$stateChangeStart', function (event, toState) {
|
|
78
|
+
var permission = toState.permission;
|
|
79
|
+
if (permission !== false && (permission === undefined || Authorization.denied(permission))) {
|
|
80
|
+
$window.location.href = '/katello/403';
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
$rootScope.permitted = Authorization.permitted;
|
|
85
|
+
$rootScope.denied = Authorization.denied;
|
|
86
|
+
}
|
|
87
|
+
]);
|
|
@@ -0,0 +1,48 @@
|
|
|
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 service
|
|
16
|
+
* @name Bastion.auth:Authorization
|
|
17
|
+
*
|
|
18
|
+
* @requires CurrentUser
|
|
19
|
+
* @requires Permissions
|
|
20
|
+
*
|
|
21
|
+
* @description
|
|
22
|
+
* A service for authorization related functionality.
|
|
23
|
+
*/
|
|
24
|
+
angular.module('Bastion.auth').service('Authorization', ['CurrentUser', 'Permissions', function (CurrentUser, Permissions) {
|
|
25
|
+
|
|
26
|
+
this.permitted = function (permissionName, model) {
|
|
27
|
+
var allowedTo = false;
|
|
28
|
+
|
|
29
|
+
if (CurrentUser.admin) {
|
|
30
|
+
allowedTo = true;
|
|
31
|
+
} else {
|
|
32
|
+
if (model && model.hasOwnProperty('permissions') && model.permissions.hasOwnProperty(permissionName)) {
|
|
33
|
+
allowedTo = model.permissions[permissionName];
|
|
34
|
+
} else {
|
|
35
|
+
angular.forEach(Permissions, function (permission) {
|
|
36
|
+
if (permission.permission.name === permissionName) {
|
|
37
|
+
allowedTo = true;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return allowedTo;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
this.denied = function (permissionName, model) {
|
|
46
|
+
return !this.permitted(permissionName, model);
|
|
47
|
+
};
|
|
48
|
+
}]);
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
angular.element(document).ready(function () {
|
|
15
|
+
angular.bootstrap(document, BASTION_MODULES);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
BASTION_MODULES = [
|
|
19
|
+
'alchemy',
|
|
20
|
+
'alchemy.format',
|
|
21
|
+
'alch-templates',
|
|
22
|
+
'angular-blocks',
|
|
23
|
+
'ngAnimate',
|
|
24
|
+
'ngSanitize',
|
|
25
|
+
'templates',
|
|
26
|
+
'ui.bootstrap',
|
|
27
|
+
'ui.bootstrap.tpls',
|
|
28
|
+
'Bastion.auth',
|
|
29
|
+
'Bastion.menu',
|
|
30
|
+
'Bastion.i18n',
|
|
31
|
+
'Bastion.widgets'
|
|
32
|
+
];
|
|
@@ -0,0 +1,39 @@
|
|
|
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 factory
|
|
16
|
+
* @name Bastion.factory:BastionResource
|
|
17
|
+
*
|
|
18
|
+
* @requires BastionResource
|
|
19
|
+
*
|
|
20
|
+
* @description
|
|
21
|
+
* Base module that defines the Katello module namespace and includes any thirdparty
|
|
22
|
+
* modules used by the application.
|
|
23
|
+
*/
|
|
24
|
+
angular.module('Bastion').factory('BastionResource', ['$resource', function ($resource) {
|
|
25
|
+
|
|
26
|
+
return function (url, paramDefaults, actions) {
|
|
27
|
+
var defaultActions;
|
|
28
|
+
|
|
29
|
+
defaultActions = {
|
|
30
|
+
queryPaged: {method: 'GET', isArray: false},
|
|
31
|
+
queryUnpaged: {method: 'GET', isArray: false, params: {'full_result': true}}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
actions = angular.extend({}, defaultActions, actions);
|
|
35
|
+
|
|
36
|
+
return $resource(url, paramDefaults, actions);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
}]);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* Copyright 2014 Red Hat, Inc.
|
|
2
|
+
*
|
|
3
|
+
* This software is licensed to you under the GNU General Public
|
|
4
|
+
* License as published by the Free Software Foundation; either version
|
|
5
|
+
* 2 of the License (GPLv2) or (at your option) any later version.
|
|
6
|
+
* There is NO WARRANTY for this software, express or implied,
|
|
7
|
+
* including the implied warranties of MERCHANTABILITY,
|
|
8
|
+
* NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
|
|
9
|
+
* have received a copy of GPLv2 along with this software; if not, see
|
|
10
|
+
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
//= require "bastion/underscore/underscore"
|
|
14
|
+
|
|
15
|
+
//= require "bastion/angular/angular"
|
|
16
|
+
//= require "bastion/angular-resource/angular-resource"
|
|
17
|
+
//= require "bastion/angular-sanitize/angular-sanitize"
|
|
18
|
+
//= require "bastion/angular-ui-router/angular-ui-router"
|
|
19
|
+
//= require "bastion/angular-uuid4/angular-uuid4.js"
|
|
20
|
+
//= require "bastion/ngUpload/ng-upload"
|
|
21
|
+
//= require "bastion/angular-gettext/angular-gettext"
|
|
22
|
+
//= require "bastion/angular-blocks/angular-blocks"
|
|
23
|
+
//= require_tree "../../../../vendor/assets/javascripts/bastion/angular-bootstrap"
|
|
24
|
+
//= require "bastion/angular-animate/angular-animate"
|
|
25
|
+
//= require "bastion/alchemy/alchemy"
|
|
26
|
+
|
|
27
|
+
//= require "bastion/bastion.module"
|
|
28
|
+
//= require "bastion/bastion-resource.factory"
|
|
29
|
+
|
|
30
|
+
//= require_tree "./incubator"
|
|
31
|
+
|
|
32
|
+
//= require "bastion/incubator/format/alch-format.module.js"
|
|
33
|
+
//= require "bastion/incubator/format/array-to-string.filter.js"
|
|
34
|
+
//= require "bastion/incubator/format/key-value-to-string.filter.js"
|
|
35
|
+
|
|
36
|
+
//= require "bastion/i18n/i18n.module"
|
|
37
|
+
//= require "bastion/i18n/translate.service.js"
|
|
38
|
+
//= require "bastion/i18n/translations"
|
|
39
|
+
|
|
40
|
+
//= require "bastion/auth/auth.module"
|
|
41
|
+
//= require_tree "./auth"
|
|
42
|
+
|
|
43
|
+
//= require "bastion/menu/menu.module"
|
|
44
|
+
//= require_tree "./menu"
|
|
45
|
+
|
|
46
|
+
//= require "bastion/widgets/widgets.module"
|
|
47
|
+
//= require_tree "./widgets"
|
|
48
|
+
|
|
49
|
+
//= require "bastion/utils/utils.module"
|
|
50
|
+
//= require_tree "./utils"
|
|
51
|
+
|
|
52
|
+
//= require "bastion/bastion-bootstrap"
|
|
@@ -0,0 +1,213 @@
|
|
|
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 module
|
|
16
|
+
* @name Bastion
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* Base module that defines the Katello module namespace and includes any thirdparty
|
|
20
|
+
* modules used by the application.
|
|
21
|
+
*/
|
|
22
|
+
angular.module('Bastion', [
|
|
23
|
+
'ui.router',
|
|
24
|
+
'ngResource',
|
|
25
|
+
'Bastion.i18n',
|
|
26
|
+
'Bastion.widgets'
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @ngdoc constant
|
|
31
|
+
* @name Bastion.constant:RootURL
|
|
32
|
+
*
|
|
33
|
+
* @description
|
|
34
|
+
* Provides a configurable URL root for all requests.
|
|
35
|
+
*/
|
|
36
|
+
angular.module('Bastion').constant('RootURL', '/katello');
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @ngdoc config
|
|
40
|
+
* @name Bastion.config
|
|
41
|
+
*
|
|
42
|
+
* @requires $httpProvider
|
|
43
|
+
* @requires $urlRouterProvider
|
|
44
|
+
* @requires $locationProvider
|
|
45
|
+
* @requires $provide
|
|
46
|
+
* @requires BastionConfig
|
|
47
|
+
* @requires RootURL
|
|
48
|
+
*
|
|
49
|
+
* @description
|
|
50
|
+
* Used for establishing application wide configuration such as adding the Rails CSRF token
|
|
51
|
+
* to every request and adding Xs to translated strings.
|
|
52
|
+
*/
|
|
53
|
+
angular.module('Bastion').config(
|
|
54
|
+
['$httpProvider', '$urlRouterProvider', '$locationProvider', '$provide', 'BastionConfig', 'RootURL',
|
|
55
|
+
function ($httpProvider, $urlRouterProvider, $locationProvider, $provide, BastionConfig, RootURL) {
|
|
56
|
+
var oldBrowserBastionPath = '/bastion#';
|
|
57
|
+
|
|
58
|
+
$httpProvider.defaults.headers.common = {
|
|
59
|
+
Accept: 'application/json, text/plain, version=2; */*',
|
|
60
|
+
'X-CSRF-TOKEN': $('meta[name=csrf-token]').attr('content')
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
$urlRouterProvider.rule(function ($injector, $location) {
|
|
64
|
+
var $sniffer = $injector.get('$sniffer'),
|
|
65
|
+
$window = $injector.get('$window'),
|
|
66
|
+
path = $location.path();
|
|
67
|
+
|
|
68
|
+
if (!$sniffer.history) {
|
|
69
|
+
$window.location.href = oldBrowserBastionPath + $location.path();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (path.slice(0, '/katello'.length) === '/katello') {
|
|
73
|
+
$window.location.href = $location.url();
|
|
74
|
+
$window.location.reload();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// removing trailing slash to prevent endless redirect
|
|
78
|
+
if (path[path.length - 1] === '/') {
|
|
79
|
+
return path.slice(0, -1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
$urlRouterProvider.otherwise(function ($injector, $location) {
|
|
84
|
+
var $window = $injector.get('$window');
|
|
85
|
+
$window.location.href = $location.absUrl().replace(oldBrowserBastionPath, '');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
$locationProvider.html5Mode(true);
|
|
89
|
+
|
|
90
|
+
$provide.factory('PrefixInterceptor', ['$q', '$templateCache', function ($q, $templateCache) {
|
|
91
|
+
return {
|
|
92
|
+
request: function (config) {
|
|
93
|
+
if (config.url.indexOf('.html') !== -1) {
|
|
94
|
+
if ($templateCache.get(config.url) === undefined) {
|
|
95
|
+
config.url = '/' + config.url;
|
|
96
|
+
}
|
|
97
|
+
} else if (!config.url.match(/^\/foreman_tasks/)) {
|
|
98
|
+
config.url = RootURL + config.url;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return config || $q.when(config);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}]);
|
|
105
|
+
|
|
106
|
+
// Add Xs around translated strings if the config value mark_translated is set.
|
|
107
|
+
if (BastionConfig.markTranslated) {
|
|
108
|
+
$provide.decorator('gettextCatalog', ["$delegate", function ($delegate) {
|
|
109
|
+
var getString = $delegate.getString;
|
|
110
|
+
|
|
111
|
+
$delegate.getString = function (string, n) {
|
|
112
|
+
return 'X' + getString.apply($delegate, [string, n]) + 'X';
|
|
113
|
+
};
|
|
114
|
+
return $delegate;
|
|
115
|
+
}]);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
$httpProvider.interceptors.push('PrefixInterceptor');
|
|
119
|
+
}]
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @ngdoc run
|
|
125
|
+
* @name Bastion.run
|
|
126
|
+
*
|
|
127
|
+
* @requires $rootScope
|
|
128
|
+
* @requires $state
|
|
129
|
+
* @requires $stateParams
|
|
130
|
+
* @requires gettextCatalog
|
|
131
|
+
* @requires currentLocale
|
|
132
|
+
* @requires $location
|
|
133
|
+
* @requires $window
|
|
134
|
+
* @requires PageTitle
|
|
135
|
+
* @requires markActiveMenu
|
|
136
|
+
* @requires RootURL
|
|
137
|
+
*
|
|
138
|
+
* @description
|
|
139
|
+
* Set up some common state related functionality and set the current language.
|
|
140
|
+
*/
|
|
141
|
+
angular.module('Bastion').run(['$rootScope', '$state', '$stateParams', 'gettextCatalog', 'currentLocale', '$location', '$window', 'PageTitle', 'markActiveMenu', 'RootURL',
|
|
142
|
+
function ($rootScope, $state, $stateParams, gettextCatalog, currentLocale, $location, $window, PageTitle, markActiveMenu, RootURL) {
|
|
143
|
+
var fromState, fromParams, orgSwitcherRegex;
|
|
144
|
+
|
|
145
|
+
$rootScope.$state = $state;
|
|
146
|
+
$rootScope.$stateParams = $stateParams;
|
|
147
|
+
$rootScope.transitionTo = $state.transitionTo;
|
|
148
|
+
$rootScope.RootURL = RootURL;
|
|
149
|
+
|
|
150
|
+
$rootScope.isState = function (stateName) {
|
|
151
|
+
return $state.is(stateName);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
$rootScope.stateIncludes = function (state, params) {
|
|
155
|
+
if (params !== undefined) {
|
|
156
|
+
angular.forEach(params, function (value, key) {
|
|
157
|
+
params[key] = value.toString();
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return $state.includes(state, params);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
$rootScope.transitionBack = function () {
|
|
165
|
+
if (fromState) {
|
|
166
|
+
$state.transitionTo(fromState, fromParams);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
$rootScope.taskUrl = function (taskId) {
|
|
171
|
+
return "/foreman_tasks/tasks/" + taskId;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Set the current language
|
|
175
|
+
gettextCatalog.currentLanguage = currentLocale;
|
|
176
|
+
|
|
177
|
+
$rootScope.$on('$stateChangeStart',
|
|
178
|
+
function () {
|
|
179
|
+
//save location.search so we can add it back after transition is done
|
|
180
|
+
this.locationSearch = $location.search();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
$rootScope.$on('$stateChangeSuccess',
|
|
184
|
+
function (event, toState, toParams, fromStateIn, fromParamsIn) {
|
|
185
|
+
//restore all query string parameters back to $location.search
|
|
186
|
+
$location.search(this.locationSearch);
|
|
187
|
+
|
|
188
|
+
//Record our from state, so we can transition back there
|
|
189
|
+
if (!fromStateIn.abstract) {
|
|
190
|
+
fromState = fromStateIn;
|
|
191
|
+
fromParams = fromParamsIn;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
//Pop the last page title if it's not the outermost title (i.e. parent state)
|
|
195
|
+
if (PageTitle.titles.length > 1) {
|
|
196
|
+
PageTitle.resetToFirst();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
//Set the active menu item in Foreman
|
|
200
|
+
markActiveMenu();
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Prevent angular from handling org/location switcher URLs
|
|
205
|
+
orgSwitcherRegex = new RegExp("/(organizations|locations)/(.+/)*(select|clear)");
|
|
206
|
+
$rootScope.$on('$locationChangeStart', function (event, newUrl) {
|
|
207
|
+
if (newUrl.match(orgSwitcherRegex)) {
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
$window.location.href = newUrl;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
]);
|