11< div class ="admin-nav-gap ">
2- < mat-toolbar color ="primary ">
3- < span > < mat-icon > dashboard</ mat-icon > Dashboard</ span >
4- </ mat-toolbar >
2+ < div class ="container-fluid ">
3+ < ol class ="breadcrumb ">
4+ < li class ="active "> < i class ="fa fa-dashboard "> </ i > Dashboard</ li >
5+ </ ol >
6+ </ div >
57</ div >
68
7- < div class ="admin-content p-4 ">
8- < mat-card class ="mb-4 ">
9- < mat-card-title >
10- MAGE Access
11- </ mat-card-title >
12-
13- < div fxLayout ="row " fxLayoutGap ="24px " fxLayoutAlign ="start stretch ">
14-
15- <!-- Inactive Users Section -->
16- < div fxFlex ="50 ">
17- < mat-card >
18- < mat-card-title >
19- Inactive Users
20- < sup > < mat-badge [content] ="count() " matBadgeColor ="accent "> </ mat-badge > </ sup >
21- </ mat-card-title >
22-
23- < mat-form-field appearance ="fill " class ="w-100 mb-3 ">
24- < mat-label > Search</ mat-label >
25- < input matInput [(ngModel)] ="userSearch " (ngModelChange) ="search() " />
26- </ mat-form-field >
27-
28- < mat-list >
29- < mat-list-item *ngFor ="let user of inactiveUsers " (click) ="gotoUser(user) " class ="clickable ">
30- < mat-icon matListIcon > person</ mat-icon >
31- < div matLine > {{ user.displayName }}</ div >
32- < button mat-mini-button color ="primary " *ngIf ="hasPermission('UPDATE_USER') " (click) ="activateUser($event, user) ">
33- < mat-icon > check</ mat-icon > Activate
34- </ button >
35- </ mat-list-item >
36- </ mat-list >
9+ < div class ="admin-content ">
10+ < div class ="container-fluid bottom-gap-l ">
11+
12+ < h4 class ="bottom-gap "> MAGE Access</ h4 >
13+ < div class ="row ">
14+ < div class ="col-md-6 ">
15+ < div class ="row ">
16+ < div class ="col-md-12 ">
17+ < nav class ="navbar navbar-default admin-dashboard-navbar ">
18+ < div class ="container-fluid ">
19+ < div class ="navbar-header ">
20+ < a class ="navbar-brand "> Inactive Users < sup > < span class ="badge badge-accent "> {{$ctrl.count()}}</ span > </ sup > </ a >
21+ </ div >
22+
23+ < form class ="navbar-form navbar-left ">
24+ < div class ="form-group ">
25+ <!-- Triggers search method -->
26+ < input type ="text " class ="form-control " placeholder ="Search " ng-model ="$ctrl.userSearch "
27+ ng-model-options ="{ debounce: 1000 } " ng-change ="$ctrl.search() ">
28+ </ div >
29+ </ form >
30+ </ div >
31+ </ nav >
32+ </ div >
33+ </ div >
3734
38- < div class ="d-flex justify-content-end mt-3 ">
39- < button mat-button (click) ="previous() " [disabled] ="!hasPrevious() "> ← Previous User</ button >
40- < button mat-button (click) ="next() " [disabled] ="!hasNext() "> Next User →</ button >
35+ < div class ="row ">
36+ < div class ="col-sm-12 ">
37+ < div class ="admin-table ">
38+ < div class ="well-item "
39+ ng-repeat ="user in $ctrl.inactiveUsers ">
40+ < div class ="row pointer " ng-click ="$ctrl.gotoUser(user) ">
41+ < div class ="col-md-12 ">
42+ < div class ="right-gap pull-left ">
43+ < i class ="fa fa-user "> </ i >
44+ </ div >
45+ < span >
46+ {{user.displayName}}
47+ </ span >
48+ < span class ="pull-right " ng-if ="$ctrl.hasPermission('UPDATE_USER') ">
49+ < a class ="btn btn-xs btn-success " ng-click ="$ctrl.activateUser($event, user) "> < i
50+ class ="fa fa-check "> </ i > Activate</ a >
51+ </ span >
52+ </ div >
53+ </ div >
54+ </ div >
55+ </ div >
56+ </ div >
57+ </ div >
58+ < div class ="row ">
59+ < div class ="col-md-12 ">
60+ < ul class ="pager pull-right ">
61+ < li ng-class ="{'disabled': $ctrl.hasPrevious() == false} ">
62+ < a href ="javascript:void(0); " ng-click ="$ctrl.previous() "> ← Previous User</ a >
63+ </ li >
64+ < li ng-class ="{'disabled': $ctrl.hasNext() == false} ">
65+ < a href ="javascript:void(0); " ng-click ="$ctrl.next() "> Next User→</ a >
66+ </ li >
67+ </ ul >
4168 </ div >
42- </ mat-card >
69+ </ div >
4370 </ div >
44-
45- <!-- Unregistered Devices Section -->
46- < div fxFlex ="50 ">
47- < mat-card >
48- < mat-card-title >
49- Unregistered Devices
50- < sup > < mat-badge [content] ="deviceCount() " matBadgeColor ="accent "> </ mat-badge > </ sup >
51- </ mat-card-title >
52-
53- < mat-form-field appearance ="fill " class ="w-100 mb-3 ">
54- < mat-label > Search</ mat-label >
55- < input matInput [(ngModel)] ="deviceSearch " (ngModelChange) ="searchDevices() " />
56- </ mat-form-field >
57-
58- < mat-list >
59- < mat-list-item *ngFor ="let d of unregisteredDevices " (click) ="gotoDevice(d) " class ="clickable ">
60- < mat-icon matListIcon [ngClass] ="iconClass(d) "> </ mat-icon >
61- < div matLine *ngIf ="d.user "> {{ d.user.displayName }}</ div >
62- < div matLine class ="text-muted " *ngIf ="d.user "> ({{ d.uid }})</ div >
63- < button mat-mini-button color ="primary " *ngIf ="hasPermission('UPDATE_DEVICE') " (click) ="registerDevice($event, d) ">
64- < mat-icon > check</ mat-icon > Register
65- </ button >
66- </ mat-list-item >
67- </ mat-list >
68-
69- < div class ="d-flex justify-content-end mt-3 ">
70- < button mat-button (click) ="previousDevice() " [disabled] ="!hasPreviousDevice() "> ← Previous Device</ button >
71- < button mat-button (click) ="nextDevice() " [disabled] ="!hasNextDevice() "> Next Device →</ button >
71+ < div class ="col-md-6 ">
72+ < div class ="row ">
73+ < div class ="col-md-12 ">
74+ < nav class ="navbar navbar-default admin-dashboard-navbar ">
75+ < div class ="container-fluid ">
76+ < div class ="navbar-header ">
77+ < a class ="navbar-brand "> Unregistered Devices < sup > < span class ="badge badge-accent "> {{$ctrl.deviceCount()}}</ span > </ sup > </ a >
78+ </ div >
79+
80+ < form class ="navbar-form navbar-left ">
81+ < div class ="form-group ">
82+ < input type ="text " class ="form-control " placeholder ="Search " ng-model ="$ctrl.deviceSearch "
83+ ng-model-options ="{ debounce: 1000 } " ng-change ="$ctrl.searchDevices() ">
84+ </ div >
85+ </ form >
86+ </ div >
87+ </ nav >
88+ </ div >
89+ </ div >
90+ < div class ="row ">
91+ < div class ="col-sm-12 ">
92+ < div class ="admin-table ">
93+ < div class ="well-item "
94+ ng-repeat ="d in $ctrl.unregisteredDevices ">
95+ < div class ="row pointer " ng-click ="$ctrl.gotoDevice(d) ">
96+ < div class ="col-md-12 ">
97+ < div class ="right-gap pull-left ">
98+ < i class ="fa " ng-class ="iconClass(d) "> </ i >
99+ </ div >
100+
101+ < span class ="strong " ng-if ="d.user "> {{d.user.displayName}}</ span >
102+ < span class ="muted " ng-if ="d.user "> ({{d.uid}})</ span >
103+
104+ < span class ="pull-right " ng-if ="$ctrl.hasPermission('UPDATE_DEVICE') ">
105+ < a class ="btn btn-xs btn-success " ng-click ="$ctrl.registerDevice($event, d) "> < i
106+ class ="fa fa-check "> </ i > Register</ a >
107+ </ span >
108+ </ div >
109+ </ div >
110+ </ div >
111+ </ div >
72112 </ div >
73- </ mat-card >
113+ </ div >
114+ < div class ="row ">
115+ < div class ="col-md-12 ">
116+ < ul class ="pager pull-right ">
117+ < ul class ="pager pull-right ">
118+ < li ng-class ="{'disabled': $ctrl.hasPreviousDevice() == false} ">
119+ < a href ="javascript:void(0); " ng-click ="$ctrl.previous() "> ← Previous Device</ a >
120+ </ li >
121+ < li ng-class ="{'disabled': $ctrl.hasNextDevice() == false} ">
122+ < a href ="javascript:void(0); " ng-click ="$ctrl.next() "> Next Device→</ a >
123+ </ li >
124+ </ ul >
125+ </ div >
126+ </ div >
74127 </ div >
75128 </ div >
76- </ mat-card >
77-
78- <!-- Logins Section -->
79- < mat-card class ="mt-5 ">
80- < mat-card-title > Logins</ mat-card-title >
81-
82- < div fxLayout ="row " fxLayoutGap ="24px " fxLayoutAlign ="start stretch ">
83- < mat-form-field appearance ="fill " fxFlex >
84- < mat-label > Filter on User</ mat-label >
85- < input matInput [matAutocomplete] ="userAuto " [(ngModel)] ="user " (ngModelChange) ="filterLogins() " />
86- < mat-autocomplete #userAuto ="matAutocomplete ">
87- < mat-option *ngFor ="let u of loginSearchResults " [value] ="u ">
88- {{ u.displayName }}
89- </ mat-option >
90- </ mat-autocomplete >
91- </ mat-form-field >
92-
93- < mat-form-field appearance ="fill " fxFlex >
94- < mat-label > Filter on Device</ mat-label >
95- < input matInput [matAutocomplete] ="deviceAuto " [(ngModel)] ="device " (ngModelChange) ="filterLogins() " />
96- < mat-autocomplete #deviceAuto ="matAutocomplete ">
97- < mat-option *ngFor ="let d of loginDeviceSearchResults " [value] ="d ">
98- {{ d.uid }}
99- </ mat-option >
100- </ mat-autocomplete >
101- </ mat-form-field >
102129
103- < mat-form-field appearance ="fill ">
104- < mat-label > Start Date</ mat-label >
105- < input matInput [matDatepicker] ="startPicker " [(ngModel)] ="login.startDate " (dateChange) ="dateFilterChanged() " />
106- < mat-datepicker-toggle matSuffix [for] ="startPicker "> </ mat-datepicker-toggle >
107- < mat-datepicker #startPicker > </ mat-datepicker >
108- </ mat-form-field >
109-
110- < mat-form-field appearance ="fill ">
111- < mat-label > End Date</ mat-label >
112- < input matInput [matDatepicker] ="endPicker " [(ngModel)] ="login.endDate " (dateChange) ="dateFilterChanged() " />
113- < mat-datepicker-toggle matSuffix [for] ="endPicker "> </ mat-datepicker-toggle >
114- < mat-datepicker #endPicker > </ mat-datepicker >
115- </ mat-form-field >
130+ < hr >
131+
132+ < div class ="row top-gap-xl ">
133+ < div class ="col-md-12 ">
134+ < nav class ="navbar navbar-default admin-dashboard-navbar ">
135+ < div class ="container-fluid ">
136+ < div class ="navbar-header ">
137+ < button type ="button " class ="admin-navbar-toggle navbar-toggle collapsed " data-toggle ="collapse "
138+ data-target ="#login-nav " aria-expanded ="false ">
139+ < span class ="sr-only "> Toggle navigation</ span >
140+ < span class ="icon-bar "> </ span >
141+ < span class ="icon-bar "> </ span >
142+ < span class ="icon-bar "> </ span >
143+ </ button >
144+ < a class ="navbar-brand "> Logins</ a >
145+ </ div >
146+
147+ < div class ="collapse navbar-collapse admin-navbar-collapse " id ="login-nav ">
148+ < form class ="navbar-form navbar-left fixed-width-navbar " id ="login-nav ">
149+ < div class ="form-group ">
150+ < input type ="text " ng-model ="$ctrl.user " placeholder ="Filter on user "
151+ uib-typeahead ="user as user.displayName for user in $ctrl.searchLoginsAgainstUsers($viewValue) "
152+ typeahead-loading ="$ctrl.loginSearchResults " class ="form-control " ng-model-options ="{ debounce: 1000 } "
153+ typeahead-min-length ="0 " typeahead-on-select ='$ctrl.filterLogins() '>
154+ </ div >
155+
156+ < div class ="form-group ">
157+ < div class ="form-group ">
158+ < input type ="text " ng-model ="$ctrl.device " placeholder ="Filter on device "
159+ uib-typeahead ="device as device.uid for device in $ctrl.searchLoginsAgainstDevices($viewValue) "
160+ typeahead-loading ="$ctrl.loginDeviceSearchResults " class ="form-control " ng-model-options ="{ debounce: 1000 } "
161+ typeahead-min-length ="0 " typeahead-on-select ='$ctrl.filterLogins() '>
162+ </ div >
163+ </ div >
164+
165+ < div class ="form-group ">
166+ < div class ="input-group ">
167+ < input type ="text " placeholder ="Start Date " class ="form-control " uib-datepicker-popup ="MM-dd-yyyy "
168+ ng-model ="$ctrl.login.startDate " ng-change ="$ctrl.dateFilterChanged() "
169+ is-open ="$ctrl.login.startDateOpened " close-text ="Close " />
170+ < span class ="input-group-btn ">
171+ < button type ="button " class ="btn btn-default " ng-click ="$ctrl.openLoginStart($event) "> < i
172+ class ="glyphicon glyphicon-calendar "> </ i > </ button >
173+ </ span >
174+ </ div >
175+ </ div >
176+ < div class ="form-group ">
177+ < span class ="navbar-text-inverse "> to </ span >
178+ </ div >
179+ < div class ="form-group ">
180+ < div class ="input-group ">
181+ < input type ="text " placeholder ="End Date " class ="form-control " uib-datepicker-popup ="MM-dd-yyyy "
182+ ng-model ="$ctrl.login.endDate " ng-change ="$ctrl.dateFilterChanged() "
183+ is-open ="$ctrl.login.endDateOpened " close-text ="Close " />
184+ < span class ="input-group-btn ">
185+ < button type ="button " class ="btn btn-default " ng-click ="$ctrl.openLoginEnd($event) "> < i
186+ class ="glyphicon glyphicon-calendar "> </ i > </ button >
187+ </ span >
188+ </ div >
189+ </ div >
190+ </ form >
191+ < form class ="navbar-form navbar-right ">
192+ < div class ="form-group ">
193+ < span class ="navbar-text-inverse "> Results: </ span >
194+ < select class ="form-control " ng-init ="$ctrl.loginResultsLimit = 10 " ng-model ="$ctrl.loginResultsLimit "
195+ ng-change ="$ctrl.loginResultsLimitChanged() "
196+ ng-options ="o as o for o in [10, 25, 50, 100] "> </ select >
197+ </ div >
198+ </ form >
199+ </ div >
116200
117- < mat-form-field appearance ="fill ">
118- < mat-label > Results</ mat-label >
119- < mat-select [(ngModel)] ="loginResultsLimit " (selectionChange) ="loginResultsLimitChanged() ">
120- < mat-option *ngFor ="let opt of [10, 25, 50, 100] " [value] ="opt "> {{ opt }}</ mat-option >
121- </ mat-select >
122- </ mat-form-field >
201+ </ div >
202+ </ nav >
203+ </ div >
123204 </ div >
124-
125- < mat-list class ="mt-4 ">
126- < mat-list-item *ngFor ="let login of loginPage?.logins ">
127- < mat-icon matListIcon [ngClass] ="iconClass(login.device) "> </ mat-icon >
128- < div matLine >
129- < a (click) ="gotoUser(login.user) "> {{ login.user.displayName }}</ a >
130- < span class ="muted "> (< a (click) ="gotoDevice(login.device) "> {{ login.device.uid }}</ a > )</ span >
131- </ div >
132- < div matLine >
133- {{ login.timestamp | date:'short' }} ({{ login.timestamp | date:'shortTime' }})
205+ < div class ="row ">
206+ < div class ="col-sm-12 ">
207+ < div class ="admin-table ">
208+ < div class ="well-item " ng-repeat ="login in $ctrl.loginPage.logins ">
209+ < div class ="row ">
210+ < div class ="col-md-12 ">
211+ < div class ="right-gap pull-left ">
212+ < i class ="fa fa-fw " ng-class ="$ctrl.iconClass(login.device) "> </ i >
213+ </ div >
214+ < strong class ="right-gap "> < a href ="javascript:void(0); "
215+ ng-click ="$ctrl.gotoUser(login.user) "> {{login.user.displayName}}</ a > </ strong >
216+ < span class ="muted "> < a href ="javascript:void(0); "
217+ ng-click ="$ctrl.gotoDevice(login.device) "> {{login.device.uid}}</ a > </ span >
218+ </ div >
219+ </ div >
220+ < div class ="row ">
221+ < div class ="col-md-12 ">
222+ < div class ="right-gap pull-left ">
223+ < i class ="fa fa-fw "> </ i >
224+ </ div >
225+ < span > {{login.timestamp | moment:'fromNow'}}
226+ ({{login.timestamp | moment:'MMM D YYYY hh:mm:ss A'}})</ span >
227+ </ div >
228+ </ div >
229+ </ div >
134230 </ div >
135- </ mat-list-item >
136- </ mat-list >
137-
138- < div class ="d-flex justify-content-end mt-3 ">
139- < button mat-button (click) ="pageLogin(loginPage.prev) " [disabled] ="!showPrevious "> ← Previous</ button >
140- < button mat-button (click) ="pageLogin(loginPage.next) " [disabled] ="!showNext "> Next →</ button >
231+ </ div >
141232 </ div >
142- </ mat-card >
143- </ div >
233+ < div class ="row ">
234+ < div class ="col-md-12 ">
235+ < ul class ="pager pull-right ">
236+ < li ng-class ="{'disabled': !$ctrl.showPrevious} ">
237+ < a href ="javascript:void(0); " ng-click ="!$ctrl.showPrevious || $ctrl.pageLogin($ctrl.loginPage.prev) "> ←
238+ Previous</ a >
239+ </ li >
240+ < li ng-class ="{'disabled': !$ctrl.showNext} ">
241+ < a href ="javascript:void(0); " ng-click ="!$ctrl.showNext || $ctrl.pageLogin($ctrl.loginPage.next) "> Next
242+ →</ a >
243+ </ li >
244+ </ ul >
245+ </ div >
246+ </ div >
247+ </ div >
248+ </ div >
0 commit comments