diff --git a/res/app/components/stf/admin-mode/admin-mode-directive.js b/res/app/components/stf/admin-mode/admin-mode-directive.js new file mode 100644 index 00000000..758e0f72 --- /dev/null +++ b/res/app/components/stf/admin-mode/admin-mode-directive.js @@ -0,0 +1,11 @@ +module.exports = function adminModeDirective($rootScope, SettingsService) { + return { + restrict: 'AE', + link: function (scope) { + SettingsService.bind($rootScope, { + target: 'adminMode', + defaultValue: false + }) + } + } +} diff --git a/res/app/components/stf/admin-mode/admin-mode-spec.js b/res/app/components/stf/admin-mode/admin-mode-spec.js new file mode 100644 index 00000000..2197cf02 --- /dev/null +++ b/res/app/components/stf/admin-mode/admin-mode-spec.js @@ -0,0 +1,11 @@ +describe('AdminModeService', function() { + + beforeEach(module('stf.admin-mode')); + + it('should ...', inject(function(AdminModeService) { + + //expect(AdminModeService.doSomething()).toEqual('something'); + + })); + +}) \ No newline at end of file diff --git a/res/app/components/stf/admin-mode/index.js b/res/app/components/stf/admin-mode/index.js new file mode 100644 index 00000000..6f1a9cd1 --- /dev/null +++ b/res/app/components/stf/admin-mode/index.js @@ -0,0 +1,4 @@ +module.exports = angular.module('stf.admin-mode', [ + +]) + .directive('adminMode', require('./admin-mode-directive')) diff --git a/res/app/device-list/device-column-service.js b/res/app/device-list/device-column-service.js index 8e334884..edb6f8a3 100644 --- a/res/app/device-list/device-column-service.js +++ b/res/app/device-list/device-column-service.js @@ -1,5 +1,23 @@ var _ = require('lodash') +var filterOps = { + '<': function(a, filterValue) { + return a < filterValue + } + , '<=': function(a, filterValue) { + return a <= filterValue + } + , '>': function(a, filterValue) { + return a > filterValue + } + , '>=': function(a, filterValue) { + return a >= filterValue + } + , '=': function(a, filterValue) { + return a === filterValue + } +} + module.exports = function DeviceColumnService($filter, gettext) { // Definitions for all possible values. return { @@ -134,24 +152,28 @@ module.exports = function DeviceColumnService($filter, gettext) { }) , phone: TextCell({ title: gettext('Phone') + , admin: true , value: function(device) { return device.phone ? device.phone.phoneNumber : '' } }) , imei: TextCell({ title: gettext('Phone IMEI') + , admin: true , value: function(device) { return device.phone ? device.phone.imei : '' } }) , iccid: TextCell({ title: gettext('Phone ICCID') + , admin: true , value: function(device) { return device.phone ? device.phone.iccid : '' } }) , batteryHealth: TextCell({ title: gettext('Battery Health') + , admin: true , value: function(device) { return device.battery ? $filter('translate')(device.enhancedBatteryHealth) @@ -160,6 +182,7 @@ module.exports = function DeviceColumnService($filter, gettext) { }) , batterySource: TextCell({ title: gettext('Battery Source') + , admin: true , value: function(device) { return device.battery ? $filter('translate')(device.enhancedBatterySource) @@ -168,6 +191,7 @@ module.exports = function DeviceColumnService($filter, gettext) { }) , batteryStatus: TextCell({ title: gettext('Battery Status') + , admin: true , value: function(device) { return device.battery ? $filter('translate')(device.enhancedBatteryStatus) @@ -176,6 +200,7 @@ module.exports = function DeviceColumnService($filter, gettext) { }) , batteryLevel: TextCell({ title: gettext('Battery Level') + , admin: true , value: function(device) { return device.battery ? Math.floor(device.battery.level / device.battery.scale * 100) + '%' @@ -184,6 +209,7 @@ module.exports = function DeviceColumnService($filter, gettext) { }) , batteryTemp: TextCell({ title: gettext('Battery Temp') + , admin: true , value: function(device) { return device.battery ? device.battery.temp + '°C' : '' } @@ -227,27 +253,12 @@ function compareRespectCase(a, b) { return a === b ? 0 : (a < b ? -1 : 1) } -var filterOps = { - '<': function(a, filterValue) { - return a < filterValue - } -, '<=': function(a, filterValue) { - return a <= filterValue - } -, '>': function(a, filterValue) { - return a > filterValue - } -, '>=': function(a, filterValue) { - return a >= filterValue - } -, '=': function(a, filterValue) { - return a === filterValue - } -} + function TextCell(options) { return _.defaults(options, { title: options.title + , admin: options.admin , defaultOrder: 'asc' , build: function () { var td = document.createElement('td') diff --git a/res/app/device-list/device-list-details-directive.js b/res/app/device-list/device-list-details-directive.js index 6cac65fa..2946995b 100644 --- a/res/app/device-list/device-list-details-directive.js +++ b/res/app/device-list/device-list-details-directive.js @@ -38,7 +38,11 @@ module.exports = function DeviceListDetailsDirective( var id = e.target.parentNode.parentNode.id var device = mapping[id] - if (device.using) { + if (scope.adminMode && device.state === 'busy') { + kickDevice(device, true) + e.preventDefault() + } + else if (device.using) { kickDevice(device) e.preventDefault() } @@ -126,6 +130,13 @@ module.exports = function DeviceListDetailsDirective( // Check what we're supposed to show now columnSettings.forEach(function(column) { + + var skipColumn = scope.adminMode && scope.columnDefinitions[column.name].admin + if (skipColumn) { + column.selected = false + return + } + if (column.selected) { newActiveColumns.push(column.name) } diff --git a/res/app/device-list/device-list-stats.jade b/res/app/device-list/device-list-stats.jade index d5321a9b..b0ec8113 100644 --- a/res/app/device-list/device-list-stats.jade +++ b/res/app/device-list/device-list-stats.jade @@ -16,6 +16,6 @@ .text(translate) Busy devices .col-md-3 .number - .icon.fa.fa-user.visitors + .icon.fa.fa-user.visitors(ng-class='{"fa-trophy": $root.adminMode, "fa-user": !$root.adminMode}') span(counter, count-from='0', count-to='{{counter.using}}', duration='100') .text(ng-bind='currentUser.name') diff --git a/res/app/device-list/device-list.jade b/res/app/device-list/device-list.jade index ee66aac8..f413bb83 100644 --- a/res/app/device-list/device-list.jade +++ b/res/app/device-list/device-list.jade @@ -47,7 +47,9 @@ span {{"Customize"|translate}} ul.dropdown-menu(role='menu', data-toggle='dropdown').pointer.stf-device-details-customize - li(ng-repeat='column in columns track by column.name', ng-click='$event.stopPropagation()') + li(ng-repeat='column in columns track by column.name', + ng-hide='!adminMode && columnDefinitions[column.name].admin', + ng-click='$event.stopPropagation()') label.checkbox.pointer input(type='checkbox', ng-model='column.selected') span(ng-bind='columnDefinitions[column.name].title | translate') diff --git a/res/app/device-list/index.js b/res/app/device-list/index.js index 9a647f2d..2dd49307 100644 --- a/res/app/device-list/index.js +++ b/res/app/device-list/index.js @@ -6,6 +6,7 @@ module.exports = angular.module('device-list', [ require('stf/device').name, require('stf/user/group').name, require('stf/common-ui').name, + require('stf/admin-mode').name, 'checklist-model' ]) .config(['$routeProvider', function ($routeProvider) { diff --git a/res/app/layout/layout-controller.js b/res/app/layout/layout-controller.js index 57e23981..d1dcaa65 100644 --- a/res/app/layout/layout-controller.js +++ b/res/app/layout/layout-controller.js @@ -1,3 +1,19 @@ -module.exports = function LayoutCtrl(LanguageService) { - LanguageService.updateLanguage() -} +module.exports = + function LayoutCtrl(LanguageService, $rootScope, hotkeys, $filter, gettext) { + LanguageService.updateLanguage() + + + function toggleAdminMode() { + var enabled = $filter('translate')(gettext('Admin mode has been enabled.')) + var disabled = $filter('translate')(gettext('Admin mode has been disabled.')) + + $rootScope.adminMode = !$rootScope.adminMode + + alert($rootScope.adminMode ? enabled : disabled) + } + + hotkeys.add({ + combo: 'up up down down left right left right enter', + callback: toggleAdminMode + }) + } diff --git a/res/app/views/index.jade b/res/app/views/index.jade index 248c2a40..c418a78f 100644 --- a/res/app/views/index.jade +++ b/res/app/views/index.jade @@ -12,7 +12,7 @@ html title STF body(ng-app='app', ng-cloak).bg-1.fill-height - div(ng-controller='LayoutCtrl', basic-mode, landscape).fill-height + div(ng-controller='LayoutCtrl', basic-mode, admin-mode, landscape).fill-height .pane-top(fa-pane).fill-height .pane-top-bar(fa-pane, pane-id='menu', pane-anchor='north', pane-size='44px', pane-min='44px', pane-max='44px', pane-handle='') div(ng-include='"menu.jade"')