diff --git a/res/app/device-list/details/battery-level.jade b/res/app/device-list/details/battery-level.jade new file mode 100644 index 00000000..6ebd1a2b --- /dev/null +++ b/res/app/device-list/details/battery-level.jade @@ -0,0 +1,2 @@ +progressbar(value='device.battery.level', max='device.battery.scale', type='success') + span {{ device.enhancedBatteryPercentage }} diff --git a/res/app/device-list/details/model.jade b/res/app/device-list/details/model.jade new file mode 100644 index 00000000..fa415c4c --- /dev/null +++ b/res/app/device-list/details/model.jade @@ -0,0 +1,6 @@ +.device-list-product + span.device-small-image + img(ng-src='{{device.enhancedImage24}}') + + span(ng-if='device.state !== "using"') {{device.enhancedModel}} + a(ng-if='device.state === "using"', ng-href='/#!/control/{{ device.serial }}') {{device.enhancedModel}} diff --git a/res/app/device-list/details/status.jade b/res/app/device-list/details/status.jade new file mode 100644 index 00000000..84281b93 --- /dev/null +++ b/res/app/device-list/details/status.jade @@ -0,0 +1,2 @@ +button(ng-class='device.enhancedButtonClass', ng-dblclick='tryToKick(device)', + ng-click='device.usable && toggle(device)').btn.btn-xs.device-status {{device.enhancedStateAction | translate }} diff --git a/res/app/device-list/details/user.jade b/res/app/device-list/details/user.jade new file mode 100644 index 00000000..b7a8653d --- /dev/null +++ b/res/app/device-list/details/user.jade @@ -0,0 +1,2 @@ +a(ng-if='device.owner', ng-href='{{ device.enhancedUserContactUrl }}', role='button', target='_href') {{ device.enhancedUserName }} + a(ng-if='!device.owner') - diff --git a/res/app/device-list/device-list-details-controller.js b/res/app/device-list/device-list-details-controller.js index 3d6e5a9b..b6c3e65b 100644 --- a/res/app/device-list/device-list-details-controller.js +++ b/res/app/device-list/device-list-details-controller.js @@ -1,4 +1,6 @@ -module.exports = function DeviceListCtrlDetails($scope, DeviceService, GroupService, ControlService, ngTableParams, SettingsService, $filter, $location, gettext, $q) { +module.exports = function DeviceListCtrlDetails($scope, DeviceService, GroupService, ControlService, ngTableParams, SettingsService, $filter, $location, gettext, $q, $timeout) { + + $scope.ngTableEnabled = true // TODO: this is not working, why? $scope.filterEnabled = false @@ -7,37 +9,11 @@ module.exports = function DeviceListCtrlDetails($scope, DeviceService, GroupServ }) - $scope.statusFilter = function () { - var def = $q.defer() - var statuses = [ - { id: true, title: gettext('Available') - } - , - { id: false, title: gettext('N/A') - } - ] - def.resolve(statuses) - return def - } - - $scope.tableFilter = { - usable: '' - } // SettingsService.bind($scope, { // key: 'tableFilter', // storeName: 'DeviceList.tableFilter' // }) - var initialSorting = { - enhancedStateSorting: 'asc', - enhancedName: 'asc' - } - $scope.tableSorting = initialSorting - - $scope.clearSorting = function () { - $scope.tableParams.sorting(initialSorting) - $scope.tableParams.filter({}) - } // SettingsService.bind($scope, { // key: 'tableSorting', @@ -52,28 +28,99 @@ module.exports = function DeviceListCtrlDetails($scope, DeviceService, GroupServ // $scope.tableFilter = data // }) - $scope.tableParams = new ngTableParams( - { filter: $scope.tableFilter, sorting: $scope.tableSorting + if ($scope.ngTableEnabled) { + + $scope.statusFilter = function () { + var def = $q.defer() + var statuses = [ + { id: true, title: gettext('Available') + } + , + { id: false, title: gettext('N/A') + } + ] + def.resolve(statuses) + return def } - , { total: 1, counts: [], filterDelay: 0, getData: function ($defer, params) { - var data = $scope.tracker.devices - var filteredData = params.filter() ? - $filter('filter')(data, params.filter()) : - data - - var orderedData = params.sorting() ? - $filter('orderBy')(filteredData, params.orderBy()) : - data - - $defer.resolve(orderedData) + $scope.tableFilter = { + usable: '' } + + var initialSorting = { + enhancedStateSorting: 'asc', + enhancedName: 'asc' + } + $scope.tableSorting = initialSorting + + $scope.clearSorting = function () { + $scope.tableParams.sorting(initialSorting) + $scope.tableParams.filter({}) + } + + $scope.tableParams = new ngTableParams( + { filter: $scope.tableFilter, sorting: $scope.tableSorting } + , { total: 1, counts: [], filterDelay: 0, getData: function ($defer, params) { + var data = $scope.tracker.devices + + var filteredData = params.filter() ? + $filter('filter')(data, params.filter()) : + data + + var orderedData = params.sorting() ? + $filter('orderBy')(filteredData, params.orderBy()) : + data + + $defer.resolve(orderedData) + } + }) + + $scope.$on('devices.update', function () { + $scope.tableParams.reload() }) + } - $scope.$on('devices.update', function () { - $scope.tableParams.reload() - }) + if (!$scope.ngTableEnabled) { + $scope.tableLimit = 1000 + $scope.dynamicColumns = [ + { title: gettext('Status'), field: 'enhancedStateSorting', templateUrl: 'device-list/details/status.jade', visible: true }, + { title: gettext('Model'), field: 'enhancedModel', templateUrl: 'device-list/details/model.jade', visible: true }, + { title: gettext('Product'), field: 'enhancedName', visible: true }, + { title: gettext('Carrier'), field: 'operator', visible: true }, + { title: gettext('Released'), field: 'enhancedReleasedAt', visible: true }, + { title: gettext('OS'), field: 'version', visible: true }, + { title: gettext('Network'), field: 'phone.network', visible: true }, + { title: gettext('Screen'), field: 'enhanceDisplayRes', visible: true }, + { title: gettext('Serial'), field: 'serial', visible: true }, + { title: gettext('Manufacturer'), field: 'manufacturer', visible: true }, + { title: gettext('SDK'), field: 'sdk', visible: true }, + { title: gettext('ABI'), field: 'abi', visible: true }, + { title: gettext('Phone'), field: 'phone.phoneNumber', visible: true }, + { title: gettext('Phone IMEI'), field: 'phone.imei', visible: true }, + { title: gettext('Phone ICCID'), field: 'phone.iccid', visible: true }, + { title: gettext('Battery Health'), field: 'enhancedBatteryHealth', visible: true }, + { title: gettext('Battery Source'), field: 'enhancedBatterySource', visible: true }, + { title: gettext('Battery Status'), field: 'enhancedBatteryStatus', visible: true }, + { title: gettext('Battery Level'), field: 'enhancedBatteryPercentage', templateUrl: 'device-list/details/battery-level.jade', visible: true }, + { title: gettext('Battery Temperature'), field: 'enhancedBatteryTemp', visible: true }, + { title: gettext('Location'), field: 'provider.name', visible: true }, + { title: gettext('User'), field: 'enhancedUserName', templateUrl: 'device-list/details/user.jade', visible: true } + ] + + //$scope.selectedColumns = [$scope.dynamicColumns[1], $scope.dynamicColumns[2]] + $scope.selectedColumns = [ + $scope.dynamicColumns[0], + $scope.dynamicColumns[1], + $scope.dynamicColumns[2], + $scope.dynamicColumns[3], + $scope.dynamicColumns[4], + $scope.dynamicColumns[5], + $scope.dynamicColumns[6], + $scope.dynamicColumns[20], + $scope.dynamicColumns[21] + ] + } $scope.tryToKick = function (device) { @@ -92,20 +139,4 @@ module.exports = function DeviceListCtrlDetails($scope, DeviceService, GroupServ } - - // TODO: Implement real dynamic colums! Using showAll is too slow - - - $scope.dynamicColumns = [ - { title: 'Model', field: 'enhancedModel', sortable: 'enhancedModel', filter: {enhancedModel: 'text'}, visible: true - } - , - { title: 'Product', field: 'enhancedName', sortable: 'enhancedName', filter: {enhancedName: 'text'}, visible: true - } - , - { title: 'Carrier', field: 'operator', sortable: 'operator', filter: {operator: 'text'}, visible: true - } - ] - - $scope.selectedColumns = [$scope.dynamicColumns[1]] } diff --git a/res/app/device-list/device-list.css b/res/app/device-list/device-list.css index 93a5c26e..ed920995 100644 --- a/res/app/device-list/device-list.css +++ b/res/app/device-list/device-list.css @@ -122,12 +122,12 @@ ul.devices-icon-view .device-is-busy .device-photo-small img { .stf-device-list .device-small-image { margin-right: 8px; } + .stf-device-list .device-small-image img { height: 20px; min-width: 10px; } - .device-list-active-tabs.ng-enter { -webkit-transition: 250ms; transition: 250ms; @@ -154,7 +154,6 @@ ul.devices-icon-view .device-is-busy .device-photo-small img { height: 17px !important; } - .stf-stats-container .fa { font-size: 0.8em; } @@ -170,3 +169,13 @@ ul.devices-icon-view .device-is-busy .device-photo-small img { .stf-stats-container.ng-enter-active { opacity: 1; } + +.device-list-details-content .stf-device-details-customize { + white-space: nowrap; + padding-left: 10px; + padding-right: 10px; +} + +.device-list-details-content { + min-height: 300px; +} diff --git a/res/app/device-list/device-list.jade b/res/app/device-list/device-list.jade index afde5d5b..078638c4 100644 --- a/res/app/device-list/device-list.jade +++ b/res/app/device-list/device-list.jade @@ -85,98 +85,111 @@ div.stf-device-list nothing-to-show(message='{{"No devices connected"|translate}}', icon='fa-sitemap', ng-show='!tracker.devices.length') .filtering-buttons - clear-button(ng-click="clearSorting()") - filter-button(ng-model='filterEnabled') - .button-spacer.pull-right + span(ng-if='ngTableEnabled') + clear-button(ng-click="clearSorting()") + filter-button(ng-model='filterEnabled') + .button-spacer.pull-right - //.btn-group(dropdown).pull-right - button.btn.btn-sm.btn-primary-outline.dropdown-toggle + button(btn-checkbox, ng-model='showAll').btn.btn-sm.btn-primary-outline.pull-right i.fa.fa-list-alt - span {{"Customize"|translate}} + span {{"Show All"|translate}} - ul.dropdown-menu(role='menu', data-toggle='dropdown').pointer.unselectable - li(ng-repeat='column in dynamicColumns', ng-click='$event.stopPropagation()') - label.checkbox - input(type='checkbox', checklist-model='selectedColumns', checklist-value='column') - span(ng-bind='column.title') + span(ng-if='!ngTableEnabled') + .btn-group(dropdown).pull-right + button.btn.btn-sm.btn-primary-outline.dropdown-toggle + i.fa.fa-list-alt + span {{"Customize"|translate}} - button(btn-checkbox, ng-model='showAll').btn.btn-sm.btn-primary-outline.pull-right - i.fa.fa-list-alt - span {{"Show All"|translate}} + ul.dropdown-menu(role='menu', data-toggle='dropdown').pointer.unselectable.stf-device-details-customize + li(ng-repeat='column in dynamicColumns', ng-click='$event.stopPropagation()') + label.checkbox.pointer + input(type='checkbox', checklist-model='selectedColumns', checklist-value='column') + span(ng-bind='column.title | translate') + div(ng-if='!ngTableEnabled') + table.table.table-hover.dataTable + thead + tr + th(ng-repeat='column in selectedColumns', ng-show='column.visible') + div {{ column.title | translate }} + tbody + tr(ng-repeat='device in tracker.devices | limitTo:tableLimit', ng-class='{ "device-not-usable": !device.usable }') + td(ng-repeat='column in selectedColumns', ng-if='column.visible', sortable='column.field') + span(ng-if='column.templateUrl', ng-include='column.templateUrl') + span(ng-if='!column.templateUrl') {{ device[column.field] }} - //table.table.table-hover.dataTable(ng-table='tableParams', show-filter='filterEnabled') + //table.table.table-hover.dataTable(ng-table='tableParams') thead tr - th(ng-repeat='column in columns', ng-show='column.visible', - ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'), 'sort-desc': tableParams.isSortBy(column.field, 'desc')}", - ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')").text-center.sortable {{column.title}} + th(ng-repeat='column in $parent.selectedColumns', ng-show='column.visible') + div PEPE tbody - tr(ng-repeat='device in $data', ng-class='{ "device-not-usable": !device.usable }') - td(ng-repeat='column in columns', ng-show='column.visible', sortable='column.sortable', filter='column.filter') + tr(ng-repeat='device in $data | limitTo:5', ng-class='{ "device-not-usable": !device.usable }') + td(ng-repeat='column in selectedColumns', ng-show='column.visible', sortable='column.field') span {{ device[column.field] }} - table.table.table-hover.dataTable(ng-table='tableParams', show-filter='filterEnabled', ng-show='tracker.devices.length').device-list-details - tr(ng-repeat='device in $data', ng-class='{ "device-not-usable": !device.usable }') + div(ng-if='ngTableEnabled') + table.table.table-hover.dataTable(ng-table='tableParams', show-filter='filterEnabled', ng-show='tracker.devices.length').device-list-details + tr(ng-repeat='device in $data', ng-class='{ "device-not-usable": !device.usable }') - td(data-title="'Status'|translate", sortable='"enhancedStateSorting"', filter="{ 'usable': 'select' }", filter-data="statusFilter($column)") + td(data-title="'Status'|translate", sortable='"enhancedStateSorting"', filter="{ 'usable': 'select' }", filter-data="statusFilter($column)") - button(ng-class='device.enhancedButtonClass', - ng-dblclick='tryToKick(device)', - ng-click='device.usable && toggle(device)').btn.btn-xs.device-status {{device.enhancedStateAction | translate}} + button(ng-class='device.enhancedButtonClass', + ng-dblclick='tryToKick(device)', + ng-click='device.usable && toggle(device)').btn.btn-xs.device-status {{device.enhancedStateAction | translate}} - td(data-title="::'Model'|translate", sortable='"model"', filter='{"model": "text"}') - span.device-small-image - img(ng-src='{{device.enhancedImage24}}') + td(data-title="::'Model'|translate", sortable='"model"', filter='{"model": "text"}') + span.device-small-image + img(ng-src='{{device.enhancedImage24}}') - span(ng-if='device.state !== "using"') {{device.enhancedModel}} - a(ng-if='device.state === "using"', ng-href='/#!/control/{{ device.serial }}') {{device.enhancedModel}} + span(ng-if='device.state !== "using"') {{device.enhancedModel}} + a(ng-if='device.state === "using"', ng-href='/#!/control/{{ device.serial }}') {{device.enhancedModel}} - td(data-title="'Product'|translate", sortable='"enhancedName"', filter='{"enhancedName": "text"}').device-list-product - span {{::device.enhancedName}} - td(data-title="'Carrier'|translate", sortable='"operator"', filter='{"operator": "text"}').device-list-carrier - span {{::device.operator}} - td(data-title="'Released'|translate", sortable='"enhancedReleasedAt"', filter='{"enhancedReleasedAt": "text"}') - span {{::device.enhancedReleasedAt}} - td(data-title="'OS'|translate", sortable='"version"', filter='{"version": "text"}') - span {{::device.version}} - td(data-title="'Network'|translate", sortable='"phone.network"', filter='{"phone": "text"}') - span {{device.phone.network}} + td(data-title="'Product'|translate", sortable='"enhancedName"', filter='{"enhancedName": "text"}').device-list-product + span {{::device.enhancedName}} + td(data-title="'Carrier'|translate", sortable='"operator"', filter='{"operator": "text"}').device-list-carrier + span {{::device.operator}} + td(data-title="'Released'|translate", sortable='"enhancedReleasedAt"', filter='{"enhancedReleasedAt": "text"}') + span {{::device.enhancedReleasedAt}} + td(data-title="'OS'|translate", sortable='"version"', filter='{"version": "text"}') + span {{::device.version}} + td(data-title="'Network'|translate", sortable='"phone.network"', filter='{"phone": "text"}') + span {{device.phone.network}} - td(ng-show='showAll', data-title="'Screen'|translate", sortable='"enhanceDisplayRes"', filter='{"enhanceDisplayRes": "text"}') - span {{device.enhanceDisplayRes }} - td(ng-show='showAll', data-title="'Serial'|translate", sortable='"serial"', filter='{"serial": "text"}') - span {{::device.serial}} - td(ng-show='showAll', data-title="'Manufacturer'|translate", sortable='"manufacturer"', filter='{"manufacturer": "text"}') - span {{::device.manufacturer}} - td(ng-show='showAll', data-title="'SDK'|translate", sortable='"sdk"', filter='{"sdk": "text"}') - span {{::device.sdk}} - td(ng-show='showAll', data-title="'ABI'|translate", sortable='"abi"', filter='{"abi": "text"}') - span {{::device.abi}} - td(ng-show='showAll', data-title="'Phone'|translate", sortable='"phone.phoneNumber"') - span {{device.phone.phoneNumber }} - td(ng-show='showAll', data-title="'Phone IMEI'|translate", sortable='"phone.imei"') - span {{device.phone.imei}} - td(ng-show='showAll', data-title="'Phone ICCID'|translate", sortable='"phone.iccid"') - span {{device.phone.iccid}} + td(ng-show='showAll', data-title="'Screen'|translate", sortable='"enhanceDisplayRes"', filter='{"enhanceDisplayRes": "text"}') + span {{device.enhanceDisplayRes }} + td(ng-show='showAll', data-title="'Serial'|translate", sortable='"serial"', filter='{"serial": "text"}') + span {{::device.serial}} + td(ng-show='showAll', data-title="'Manufacturer'|translate", sortable='"manufacturer"', filter='{"manufacturer": "text"}') + span {{::device.manufacturer}} + td(ng-show='showAll', data-title="'SDK'|translate", sortable='"sdk"', filter='{"sdk": "text"}') + span {{::device.sdk}} + td(ng-show='showAll', data-title="'ABI'|translate", sortable='"abi"', filter='{"abi": "text"}') + span {{::device.abi}} + td(ng-show='showAll', data-title="'Phone'|translate", sortable='"phone.phoneNumber"') + span {{device.phone.phoneNumber }} + td(ng-show='showAll', data-title="'Phone IMEI'|translate", sortable='"phone.imei"') + span {{device.phone.imei}} + td(ng-show='showAll', data-title="'Phone ICCID'|translate", sortable='"phone.iccid"') + span {{device.phone.iccid}} - td(ng-show='showAll', data-title="'Battery Health'|translate", sortable='"enhancedBatteryHealth"') - span {{ device.enhancedBatteryHealth | translate }} - td(ng-show='showAll', data-title="'Battery Source'|translate", sortable='"enhancedBatterySource"') - span {{ device.enhancedBatterySource | translate }} - td(ng-show='showAll', data-title="'Battery Status'|translate", sortable='"enhancedBatteryStatus"') - span {{ device.enhancedBatteryStatus | translate }} - td(ng-show='showAll', data-title="'Battery Level'|translate", sortable='"battery.level"') - progressbar(value='device.battery.level', max='device.battery.scale', type='success') - span {{ device.enhancedBatteryPercentage }} - td(ng-show='showAll', data-title="'Battery Temperature'|translate", sortable='"battery.temp"') - span {{ device.enhancedBatteryTem }} + td(ng-show='showAll', data-title="'Battery Health'|translate", sortable='"enhancedBatteryHealth"') + span {{ device.enhancedBatteryHealth | translate }} + td(ng-show='showAll', data-title="'Battery Source'|translate", sortable='"enhancedBatterySource"') + span {{ device.enhancedBatterySource | translate }} + td(ng-show='showAll', data-title="'Battery Status'|translate", sortable='"enhancedBatteryStatus"') + span {{ device.enhancedBatteryStatus | translate }} + td(ng-show='showAll', data-title="'Battery Level'|translate", sortable='"battery.level"') + progressbar(value='device.battery.level', max='device.battery.scale', type='success') + span {{ device.enhancedBatteryPercentage }} + td(ng-show='showAll', data-title="'Battery Temperature'|translate", sortable='"battery.temp"') + span {{ device.enhancedBatteryTem }} - td(data-title="'Location'|translate", sortable='"provider.name"', filter='{"provider": "text"}') - span {{::device.provider.name}} - td(data-title="'User'|translate", sortable='"owner.name"', filter='{"owner": "text"}') - a(ng-if='device.owner', ng-href='{{ device.enhancedUserContactUrl }}', role='button', target='_href') {{ device.enhancedUserName }} - a(ng-if='!device.owner') - + td(data-title="'Location'|translate", sortable='"provider.name"', filter='{"provider": "text"}') + span {{::device.provider.name}} + td(data-title="'User'|translate", sortable='"owner.name"', filter='{"owner": "text"}') + a(ng-if='device.owner', ng-href='{{ device.enhancedUserContactUrl }}', role='button', target='_href') {{ device.enhancedUserName }} + a(ng-if='!device.owner') - //p strong Sorting pre {{tableParams.sorting() | json}} diff --git a/res/app/device-list/index.js b/res/app/device-list/index.js index ffead286..363d1fbe 100644 --- a/res/app/device-list/index.js +++ b/res/app/device-list/index.js @@ -9,10 +9,17 @@ module.exports = angular.module('device-list', [ 'checklist-model' ]) .config(['$routeProvider', function ($routeProvider) { - $routeProvider.when('/devices', { - template: require('./device-list.jade'), - controller: 'DeviceListCtrl' - }) + $routeProvider + .when('/devices', { + template: require('./device-list.jade'), + controller: 'DeviceListCtrl' + }) + }]) + .run(["$templateCache", function ($templateCache) { + $templateCache.put('device-list/details/battery-level.jade', require('./details/battery-level.jade')) + $templateCache.put('device-list/details/model.jade', require('./details/model.jade')) + $templateCache.put('device-list/details/status.jade', require('./details/status.jade')) + $templateCache.put('device-list/details/user.jade', require('./details/user.jade')) }]) .controller('DeviceListCtrl', require('./device-list-controller')) .controller('DeviceListDetailsCtrl',