##// END OF EJS Templates
components: user and alert channels components
ergo -
Show More
@@ -48,6 +48,10 b" angular.module('appenlight.components', ["
48 'appenlight.components.eventBrowserView',
48 'appenlight.components.eventBrowserView',
49 'appenlight.components.userProfileView',
49 'appenlight.components.userProfileView',
50 'appenlight.components.userIdentitiesView',
50 'appenlight.components.userIdentitiesView',
51 'appenlight.components.userPasswordView',
52 'appenlight.components.userAuthTokensView',
53 'appenlight.components.userAlertChannelsListView',
54 'appenlight.components.userAlertChannelsEmailNewView',
51 'appenlight.components.settingsView'
55 'appenlight.components.settingsView'
52 ]);
56 ]);
53 angular.module('appenlight.directives', [
57 angular.module('appenlight.directives', [
@@ -23,8 +23,9 b" angular.module('appenlight.components.settingsView', [])"
23 controller: SettingsViewController
23 controller: SettingsViewController
24 });
24 });
25
25
26 SettingsViewController.$inject = [];
26 SettingsViewController.$inject = ['$state'];
27
27
28 function SettingsViewController() {
28 function SettingsViewController($state) {
29 this.$state = $state;
29 console.info('SettingsViewController');
30 console.info('SettingsViewController');
30 }
31 }
@@ -1,20 +1,20 b''
1 <ng-include src="'templates/loader.html'" ng-if="email.loading.email"></ng-include>
1 <ng-include src="'templates/loader.html'" ng-if="$ctrl.loading.email"></ng-include>
2
2
3 <div ng-show="!email.loading.email">
3 <div ng-show="!$ctrl.loading.email">
4
4
5 <div class="panel panel-default">
5 <div class="panel panel-default">
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
7 <div class="panel-body">
7 <div class="panel-body">
8 <p>Adding email alert channel - after you authorize your email in the system we can send alerts directly to this mailbox.</p>
8 <p>Adding email alert channel - after you authorize your email in the system we can send alerts directly to this mailbox.</p>
9 <form class="form-horizontal" name="email.channelForm" ng-submit="email.createChannel()">
9 <form class="form-horizontal" name="$ctrl.channelForm" ng-submit="$ctrl.createChannel()">
10 <div class="form-group" id="row-email">
10 <div class="form-group" id="row-email">
11 <data-form-errors errors="email.channelForm.ae_validation.email"></data-form-errors>
11 <data-form-errors errors="$ctrl.channelForm.ae_validation.email"></data-form-errors>
12 <label id="label-email" class="control-label col-sm-4 col-lg-3">
12 <label id="label-email" class="control-label col-sm-4 col-lg-3">
13 Email Address
13 Email Address
14 <span class="required">*</span>
14 <span class="required">*</span>
15 </label>
15 </label>
16 <div class="col-sm-8 col-lg-9">
16 <div class="col-sm-8 col-lg-9">
17 <input class="form-control" type="text" ng-model="email.form.email">
17 <input class="form-control" type="text" ng-model="$ctrl.form.email">
18 </div>
18 </div>
19 </div>
19 </div>
20 <div class="form-group">
20 <div class="form-group">
@@ -17,8 +17,11 b''
17 // # services, and proprietary license terms, please see
17 // # services, and proprietary license terms, please see
18 // # https://rhodecode.com/licenses/
18 // # https://rhodecode.com/licenses/
19
19
20 angular.module('appenlight.controllers')
20 angular.module('appenlight.components.userAlertChannelsEmailNewView', [])
21 .controller('AlertChannelsEmailController', AlertChannelsEmailController)
21 .component('userAlertChannelsEmailNewView', {
22 templateUrl: 'components/views/user-alert-channel-email-new-view/user-alert-channel-email-new-view.html',
23 controller: AlertChannelsEmailController
24 });
22
25
23 AlertChannelsEmailController.$inject = ['$state','userSelfPropertyResource'];
26 AlertChannelsEmailController.$inject = ['$state','userSelfPropertyResource'];
24
27
@@ -1,19 +1,19 b''
1 <ng-include src="'templates/loader.html'" ng-if="channels.loading.channels || channels.loading.applications"></ng-include>
1 <ng-include src="'templates/loader.html'" ng-if="$ctrl.loading.channels || $ctrl.loading.applications"></ng-include>
2
2
3 <div ng-if="!channels.loading.channels && !channels.loading.applications && !channels.loading.actions">
3 <div ng-if="!$ctrl.loading.channels && !$ctrl.loading.applications && !$ctrl.loading.actions">
4
4
5 <div class="panel panel-default">
5 <div class="panel panel-default">
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
7 <div class="panel-body">
7 <div class="panel-body">
8 <h1>Report alert rules</h1>
8 <h1>Report alert rules</h1>
9 <p>
9 <p>
10 <a class="btn btn-info" ng-click="channels.addAction()"><span class="fa fa-plus-circle"></span> Add top-level rule</a>
10 <a class="btn btn-info" ng-click="$ctrl.addAction()"><span class="fa fa-plus-circle"></span> Add top-level rule</a>
11 </p>
11 </p>
12
12
13 <report-alert-action action="action" rule-definitions="channels.ruleDefinitions"
13 <report-alert-action action="action" rule-definitions="$ctrl.ruleDefinitions"
14 possible-channels="channels.alertChannels"
14 possible-channels="$ctrl.alertChannels"
15 actions="channels.alertActions" applications="channels.applications"
15 actions="$ctrl.alertActions" applications="$ctrl.applications"
16 ng-repeat="action in channels.alertActions | filter: {type:'report'}"></report-alert-action>
16 ng-repeat="action in $ctrl.alertActions | filter: {type:'report'}"></report-alert-action>
17
17
18 </div>
18 </div>
19 </div>
19 </div>
@@ -29,7 +29,7 b''
29 <div class="alert alert-success">You can add more integrations that support different alert channels via application management panel.</div>
29 <div class="alert alert-success">You can add more integrations that support different alert channels via application management panel.</div>
30
30
31 <table class="table table-striped">
31 <table class="table table-striped">
32 <tr ng-repeat="channel in channels.alertChannels" class="animate-repeat">
32 <tr ng-repeat="channel in $ctrl.alertChannels" class="animate-repeat">
33 <td><strong>{{ channel.channel_visible_value }}</strong></td>
33 <td><strong>{{ channel.channel_visible_value }}</strong></td>
34 <td class="text-right">
34 <td class="text-right">
35 <span class="btn btn-default" data-uib-tooltip="Channel is {{ channel.channel_validated? '' :'NOT' }} validated" tooltip-append-to-body="true"
35 <span class="btn btn-default" data-uib-tooltip="Channel is {{ channel.channel_validated? '' :'NOT' }} validated" tooltip-append-to-body="true"
@@ -37,11 +37,11 b''
37 <span class="fa" ng-class="{'fa-check-circle':channel.channel_validated, 'fa-times-circle':!channel.channel_validated}"></span>
37 <span class="fa" ng-class="{'fa-check-circle':channel.channel_validated, 'fa-times-circle':!channel.channel_validated}"></span>
38 </span>
38 </span>
39 <a class="btn btn-default" data-uib-tooltip="Press to turn {{ channel.send_alerts ? 'OFF' : 'ON' }} alerting on this chanel"
39 <a class="btn btn-default" data-uib-tooltip="Press to turn {{ channel.send_alerts ? 'OFF' : 'ON' }} alerting on this chanel"
40 ng-click="channels.updateChannel(channel,'send_alerts')" ng-class="{dim:!channel.send_alerts}" tooltip-append-to-body="true">
40 ng-click="$ctrl.updateChannel(channel,'send_alerts')" ng-class="{dim:!channel.send_alerts}" tooltip-append-to-body="true">
41 <span class="fa fa-rss"></span> Alerts
41 <span class="fa fa-rss"></span> Alerts
42 </a>
42 </a>
43 <a class="btn btn-default" data-uib-tooltip="Press to turn {{ channel.daily_digest ? 'OFF' : 'ON' }} daily digests on this channel"
43 <a class="btn btn-default" data-uib-tooltip="Press to turn {{ channel.daily_digest ? 'OFF' : 'ON' }} daily digests on this channel"
44 ng-click="channels.updateChannel(channel,'daily_digest')" ng-class="{dim:!channel.daily_digest}" tooltip-append-to-body="true">
44 ng-click="$ctrl.updateChannel(channel,'daily_digest')" ng-class="{dim:!channel.daily_digest}" tooltip-append-to-body="true">
45 <span class="fa fa-envelope"></span> Daily digests
45 <span class="fa fa-envelope"></span> Daily digests
46 </a>
46 </a>
47
47
@@ -49,7 +49,7 b''
49 <a class="btn btn-default" data-uib-dropdown-toggle><span class="fa fa-trash-o"></span> Remove</a>
49 <a class="btn btn-default" data-uib-dropdown-toggle><span class="fa fa-trash-o"></span> Remove</a>
50 <ul class="dropdown-menu">
50 <ul class="dropdown-menu">
51 <li><a>No</a></li>
51 <li><a>No</a></li>
52 <li><a ng-click="channels.removeChannel(channel)">Yes</a></li>
52 <li><a ng-click="$ctrl.removeChannel(channel)">Yes</a></li>
53 </ul>
53 </ul>
54 </span>
54 </span>
55
55
@@ -17,11 +17,15 b''
17 // # services, and proprietary license terms, please see
17 // # services, and proprietary license terms, please see
18 // # https://rhodecode.com/licenses/
18 // # https://rhodecode.com/licenses/
19
19
20 angular.module('appenlight.controllers').controller('AlertChannelsController', AlertChannelsController);
20 angular.module('appenlight.components.userAlertChannelsListView', [])
21 .component('userAlertChannelsListView', {
22 templateUrl: 'components/views/user-alert-channels-list-view/user-alert-channels-list-view.html',
23 controller: userAlertChannelsListViewController
24 });
21
25
22 AlertChannelsController.$inject = ['userSelfPropertyResource', 'applicationsNoIdResource'];
26 userAlertChannelsListViewController.$inject = ['userSelfPropertyResource', 'applicationsNoIdResource'];
23
27
24 function AlertChannelsController(userSelfPropertyResource, applicationsNoIdResource) {
28 function userAlertChannelsListViewController(userSelfPropertyResource, applicationsNoIdResource) {
25 console.debug('AlertChannelsController');
29 console.debug('AlertChannelsController');
26 var vm = this;
30 var vm = this;
27 vm.loading = {channels: true, applications: true, actions:true};
31 vm.loading = {channels: true, applications: true, actions:true};
@@ -1,6 +1,6 b''
1 <ng-include src="'templates/loader.html'" ng-if="auth_tokens.loading.tokens"></ng-include>
1 <ng-include src="'templates/loader.html'" ng-if="$ctrl.loading.tokens"></ng-include>
2
2
3 <div ng-show="!auth_tokens.loading.tokens">
3 <div ng-show="!$ctrl.loading.tokens">
4
4
5 <div class="panel panel-default">
5 <div class="panel panel-default">
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
@@ -11,20 +11,20 b''
11
11
12 <hr/>
12 <hr/>
13
13
14 <form method="post" class="form-inline" name="auth_tokens.TokenForm" ng-submit="auth_tokens.addToken()" novalidate>
14 <form method="post" class="form-inline" name="$ctrl.TokenForm" ng-submit="$ctrl.addToken()" novalidate>
15 <data-form-errors errors="auth_tokens.TokenForm.ae_validation.description"></data-form-errors>
15 <data-form-errors errors="$ctrl.TokenForm.ae_validation.description"></data-form-errors>
16 <data-form-errors errors="auth_tokens.TokenForm.ae_validation.expires"></data-form-errors>
16 <data-form-errors errors="$ctrl.TokenForm.ae_validation.expires"></data-form-errors>
17 <div class="form-group">
17 <div class="form-group">
18 <label>
18 <label>
19 Description
19 Description
20 </label>
20 </label>
21 <input class="form-control" name="description" placeholder="Token description" type="text" ng-model="auth_tokens.form.description">
21 <input class="form-control" name="description" placeholder="Token description" type="text" ng-model="$ctrl.form.description">
22 </div>
22 </div>
23 <div class="form-group">
23 <div class="form-group">
24 <label>
24 <label>
25 Expires
25 Expires
26 </label>
26 </label>
27 <select class="form-control" ng-model="auth_tokens.form.expires" ng-options="i.key as i.label for i in auth_tokens.expireOptions | objectToOrderedArray:'minutes'">
27 <select class="form-control" ng-model="$ctrl.form.expires" ng-options="i.key as i.label for i in $ctrl.expireOptions | objectToOrderedArray:'minutes'">
28 <option value="">Never</option>
28 <option value="">Never</option>
29 </select>
29 </select>
30 </div>
30 </div>
@@ -41,7 +41,7 b''
41 </div>
41 </div>
42
42
43 <div class="panel panel-default">
43 <div class="panel panel-default">
44 <table st-table="displayedCollection" st-safe-src="auth_tokens.tokens" class="table table-striped">
44 <table st-table="displayedCollection" st-safe-src="$ctrl.tokens" class="table table-striped">
45 <caption>Your current tokens</caption>
45 <caption>Your current tokens</caption>
46 <thead>
46 <thead>
47 <tr>
47 <tr>
@@ -71,7 +71,7 b''
71 <a class="btn btn-danger" data-uib-dropdown-toggle><span class="fa fa-trash-o"></span></a>
71 <a class="btn btn-danger" data-uib-dropdown-toggle><span class="fa fa-trash-o"></span></a>
72 <ul class="dropdown-menu">
72 <ul class="dropdown-menu">
73 <li><a>No</a></li>
73 <li><a>No</a></li>
74 <li><a ng-click="auth_tokens.removeToken(token)">Yes</a></li>
74 <li><a ng-click="$ctrl.removeToken(token)">Yes</a></li>
75 </ul>
75 </ul>
76 </span>
76 </span>
77 </td>
77 </td>
@@ -17,12 +17,16 b''
17 // # services, and proprietary license terms, please see
17 // # services, and proprietary license terms, please see
18 // # https://rhodecode.com/licenses/
18 // # https://rhodecode.com/licenses/
19
19
20 angular.module('appenlight.controllers').controller('UserAuthTokensController', UserAuthTokensController);
20 angular.module('appenlight.components.userAuthTokensView', [])
21 .component('userAuthTokensView', {
22 templateUrl: 'components/views/user-auth-tokens-view/user-auth-tokens-view.html',
23 controller: userAuthTokensViewController
24 });
21
25
22 UserAuthTokensController.$inject = ['$filter', 'userSelfPropertyResource', 'AeConfig'];
26 userAuthTokensViewController.$inject = ['userSelfPropertyResource', 'AeConfig'];
23
27
24 function UserAuthTokensController($filter, userSelfPropertyResource, AeConfig) {
28 function userAuthTokensViewController(userSelfPropertyResource, AeConfig) {
25 console.debug('UserAuthTokensController');
29 console.debug('userAuthTokensViewController');
26 var vm = this;
30 var vm = this;
27 vm.loading = {tokens: true};
31 vm.loading = {tokens: true};
28
32
@@ -48,11 +52,13 b' function UserAuthTokensController($filter, userSelfPropertyResource, AeConfig) {'
48 setServerValidation(vm.TokenForm, response.data);
52 setServerValidation(vm.TokenForm, response.data);
49 }
53 }
50 })
54 })
51 }
55 };
52
56
53 vm.removeToken = function (token) {
57 vm.removeToken = function (token) {
54 userSelfPropertyResource.delete({key: 'auth_tokens',
58 userSelfPropertyResource.delete({
55 token:token.token},
59 key: 'auth_tokens',
60 token: token.token
61 },
56 function () {
62 function () {
57 var index = vm.tokens.indexOf(token);
63 var index = vm.tokens.indexOf(token);
58 if (index !== -1) {
64 if (index !== -1) {
@@ -1,40 +1,40 b''
1 <ng-include src="'templates/loader.html'" ng-if="password.loading.password"></ng-include>
1 <ng-include src="'templates/loader.html'" ng-if="$ctrl.loading.password"></ng-include>
2
2
3 <div ng-show="!password.loading.password">
3 <div ng-show="!$ctrl.loading.password">
4
4
5 <div class="panel panel-default">
5 <div class="panel panel-default">
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
6 <div class="panel-heading" ng-include="'templates/user/breadcrumbs.html'"></div>
7 <div class="panel-body">
7 <div class="panel-body">
8
8
9 <form class="form-horizontal" name="password.passwordForm" ng-submit="password.updatePassword()">
9 <form class="form-horizontal" name="$ctrl.passwordForm" ng-submit="$ctrl.updatePassword()">
10 <div class="form-group" id="row-old_password">
10 <div class="form-group" id="row-old_password">
11 <data-form-errors errors="password.passwordForm.ae_validation.old_password"></data-form-errors>
11 <data-form-errors errors="$ctrl.passwordForm.ae_validation.old_password"></data-form-errors>
12 <label for="old_password" id="label-old_password" class="control-label col-sm-4 col-lg-3">
12 <label for="old_password" id="label-old_password" class="control-label col-sm-4 col-lg-3">
13 Old Password
13 Old Password
14 <span class="required">*</span>
14 <span class="required">*</span>
15 </label>
15 </label>
16 <div class="col-sm-8 col-lg-9">
16 <div class="col-sm-8 col-lg-9">
17 <input class="form-control" id="old_password" name="old_password" type="password" ng-model="password.form.old_password">
17 <input class="form-control" id="old_password" name="old_password" type="password" ng-model="$ctrl.form.old_password">
18 </div>
18 </div>
19 </div>
19 </div>
20 <div class="form-group" id="row-new_password">
20 <div class="form-group" id="row-new_password">
21 <data-form-errors errors="password.passwordForm.ae_validation.new_password"></data-form-errors>
21 <data-form-errors errors="$ctrl.passwordForm.ae_validation.new_password"></data-form-errors>
22 <label for="new_password" id="label-new_password" class="control-label col-sm-4 col-lg-3">
22 <label for="new_password" id="label-new_password" class="control-label col-sm-4 col-lg-3">
23 New Password
23 New Password
24 <span class="required">*</span>
24 <span class="required">*</span>
25 </label>
25 </label>
26 <div class="col-sm-8 col-lg-9">
26 <div class="col-sm-8 col-lg-9">
27 <input class="form-control" id="new_password" name="new_password" type="password" ng-model="password.form.new_password">
27 <input class="form-control" id="new_password" name="new_password" type="password" ng-model="$ctrl.form.new_password">
28 </div>
28 </div>
29 </div>
29 </div>
30 <div class="form-group" id="row-new_password_confirm">
30 <div class="form-group" id="row-new_password_confirm">
31 <data-form-errors errors="password.passwordForm.ae_validation.new_password_confirm"></data-form-errors>
31 <data-form-errors errors="$ctrl.passwordForm.ae_validation.new_password_confirm"></data-form-errors>
32 <label for="new_password_confirm" id="label-new_password_confirm" class="control-label col-sm-4 col-lg-3">
32 <label for="new_password_confirm" id="label-new_password_confirm" class="control-label col-sm-4 col-lg-3">
33 Confirm Password
33 Confirm Password
34 <span class="required">*</span>
34 <span class="required">*</span>
35 </label>
35 </label>
36 <div class="col-sm-8 col-lg-9">
36 <div class="col-sm-8 col-lg-9">
37 <input class="form-control" id="new_password_confirm" name="new_password_confirm" type="password" ng-model="password.form.new_password_confirm">
37 <input class="form-control" id="new_password_confirm" name="new_password_confirm" type="password" ng-model="$ctrl.form.new_password_confirm">
38 </div>
38 </div>
39 </div>
39 </div>
40 <div class="form-group" id="row-submit">
40 <div class="form-group" id="row-submit">
@@ -17,13 +17,16 b''
17 // # services, and proprietary license terms, please see
17 // # services, and proprietary license terms, please see
18 // # https://rhodecode.com/licenses/
18 // # https://rhodecode.com/licenses/
19
19
20 angular.module('appenlight.controllers')
20 angular.module('appenlight.components.userPasswordView', [])
21 .controller('UserPasswordController', UserPasswordController)
21 .component('userPasswordView', {
22 templateUrl: 'components/views/user-password-view/user-password-view.html',
23 controller: UserPasswordViewController
24 });
22
25
23 UserPasswordController.$inject = ['userSelfPropertyResource'];
26 UserPasswordViewController.$inject = ['userSelfPropertyResource'];
24
27
25 function UserPasswordController(userSelfPropertyResource) {
28 function UserPasswordViewController(userSelfPropertyResource) {
26 console.debug('UserPasswordController');
29 console.debug('UserPasswordViewController');
27 var vm = this;
30 var vm = this;
28 vm.loading = {password: false};
31 vm.loading = {password: false};
29 vm.form = {};
32 vm.form = {};
@@ -37,7 +40,7 b' function UserPasswordController(userSelfPropertyResource) {'
37 setServerValidation(vm.passwordForm);
40 setServerValidation(vm.passwordForm);
38 }, function (response) {
41 }, function (response) {
39 if (response.status == 422) {
42 if (response.status == 422) {
40 console.log('vm',vm);
43 console.log('vm', vm);
41 setServerValidation(vm.passwordForm, response.data);
44 setServerValidation(vm.passwordForm, response.data);
42 console.log(response.data);
45 console.log(response.data);
43 }
46 }
@@ -162,8 +162,7 b" angular.module('appenlight').config(['$stateProvider', '$urlRouterProvider', fun"
162
162
163 $stateProvider.state('user.profile.password', {
163 $stateProvider.state('user.profile.password', {
164 url: '/password',
164 url: '/password',
165 templateUrl: 'templates/user/profile_password.html',
165 component: 'userPasswordView'
166 controller: 'UserPasswordController as password'
167 });
166 });
168
167
169 $stateProvider.state('user.profile.identities', {
168 $stateProvider.state('user.profile.identities', {
@@ -173,26 +172,23 b" angular.module('appenlight').config(['$stateProvider', '$urlRouterProvider', fun"
173
172
174 $stateProvider.state('user.profile.auth_tokens', {
173 $stateProvider.state('user.profile.auth_tokens', {
175 url: '/auth_tokens',
174 url: '/auth_tokens',
176 templateUrl: 'templates/user/auth_tokens.html',
175 component: 'userAuthTokensView'
177 controller: 'UserAuthTokensController as auth_tokens'
178 });
176 });
179
177
180 $stateProvider.state('user.alert_channels', {
178 $stateProvider.state('user.alert_channels', {
181 abstract: true,
179 abstract: true,
182 url: '/alert_channels',
180 url: '/alert_channels',
183 templateUrl: 'templates/user/alert_channels.html'
181 template: '<ui-view></ui-view>'
184 });
182 });
185
183
186 $stateProvider.state('user.alert_channels.list', {
184 $stateProvider.state('user.alert_channels.list', {
187 url: '/list',
185 url: '/list',
188 templateUrl: 'templates/user/alert_channels_list.html',
186 component: 'userAlertChannelsListView'
189 controller: 'AlertChannelsController as channels'
190 });
187 });
191
188
192 $stateProvider.state('user.alert_channels.email', {
189 $stateProvider.state('user.alert_channels.email', {
193 url: '/email',
190 url: '/email',
194 templateUrl: 'templates/user/alert_channels_email.html',
191 component: 'userAlertChannelsEmailNewView'
195 controller: 'AlertChannelsEmailController as email'
196 });
192 });
197
193
198 $stateProvider.state('applications', {
194 $stateProvider.state('applications', {
@@ -4,7 +4,6 b''
4 <li ng-show="$state.includes('user.profile.password')" ng-class="{bold:$state.is('user.profile.password')}">Password</li>
4 <li ng-show="$state.includes('user.profile.password')" ng-class="{bold:$state.is('user.profile.password')}">Password</li>
5 <li ng-show="$state.includes('user.profile.identities')" ng-class="{bold:$state.is('user.profile.identities')}">Identities</li>
5 <li ng-show="$state.includes('user.profile.identities')" ng-class="{bold:$state.is('user.profile.identities')}">Identities</li>
6 </ol>
6 </ol>
7
8 <ol class="breadcrumb" ng-show="$state.includes('user.alert_channels')">
7 <ol class="breadcrumb" ng-show="$state.includes('user.alert_channels')">
9 <li>Notifications</li>
8 <li>Notifications</li>
10 <li ng-show="$state.includes('user.alert_channels.list')" ng-class="{bold:$state.is('user.alert_channels.list')}">Alert Channels</li>
9 <li ng-show="$state.includes('user.alert_channels.list')" ng-class="{bold:$state.is('user.alert_channels.list')}">Alert Channels</li>
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now