Browse Source

Add Access token, progress bar and change text

pull/1776/head
Vladyslav_Prykhodko 7 years ago
parent
commit
d4744f6594
  1. 51
      ui/src/app/api/device.service.js
  2. 4
      ui/src/app/common/types.constant.js
  3. 30
      ui/src/app/import-export/import-dialog-csv.controller.js
  4. 46
      ui/src/app/import-export/import-dialog-csv.tpl.html
  5. 4
      ui/src/app/import-export/import-dialog.scss
  6. 21
      ui/src/app/import-export/import-export.service.js
  7. 12
      ui/src/app/import-export/table-columns-assignment.directive.js
  8. 11
      ui/src/app/import-export/table-columns-assignment.tpl.html
  9. 3
      ui/src/app/locale/locale.constant-en_US.json

51
ui/src/app/api/device.service.js

@ -177,36 +177,28 @@ function DeviceService($http, $q, $window, userService, attributeService, custom
let attributesType = Object.keys(types.attributesScope);
let allPromise = [];
let promise = "";
let statisticalInfo = {};
if (deviceRelation.accessToken !== "") {
promise = getDeviceCredentials(deviceId.id,null,config).then(function (response){
response.credentialsId = deviceRelation.accessToken;
response.credentialsType = "ACCESS_TOKEN";
response.credentialsValue = null;
return saveDeviceCredentials(response, config).catch(function(){});
});
allPromise.push(promise)
}
for (let i = 0; i < attributesType.length; i++) {
let attribute = attributesType[i];
if (deviceRelation.attributes[attribute] && deviceRelation.attributes[attribute].length !== 0) {
promise = attributeService.saveEntityAttributes(types.entityType.device, deviceId, types.attributesScope[attribute].value, deviceRelation.attributes[attribute], config).then(function () {
statisticalInfo.create = {
[attribute]: deviceRelation.attributes[attribute].length
};
}, function () {
statisticalInfo.error = {
[attribute]: deviceRelation.attributes[attribute].length
};
});
promise = attributeService.saveEntityAttributes(types.entityType.device, deviceId.id, types.attributesScope[attribute].value, deviceRelation.attributes[attribute], config).catch(function () {});
allPromise.push(promise);
}
}
if (deviceRelation.timeseries.length !== 0) {
promise = attributeService.saveEntityTimeseries(types.entityType.device, deviceId, "time", deviceRelation.timeseries, config).then(function () {
statisticalInfo.create = {
timeseries: deviceRelation.timeseries.length
};
}, function () {
statisticalInfo.error = {
timeseries: deviceRelation.timeseries.length
};
});
promise = attributeService.saveEntityTimeseries(types.entityType.device, deviceId.id, "time", deviceRelation.timeseries, config).catch(function(){});
allPromise.push(promise);
}
$q.all(allPromise).then(function success() {
deferred.resolve(statisticalInfo);
deferred.resolve();
});
return deferred.promise;
}
@ -223,8 +215,7 @@ function DeviceService($http, $q, $window, userService, attributeService, custom
statisticalInfo.create={
device: 1
};
saveDeviceRelarion(response.id.id, deviceParameters, config).then(function success(response) {
angular.merge(statisticalInfo, response, statisticalInfo);
saveDeviceRelarion(response.id, deviceParameters, config).then(function success() {
deferred.resolve(statisticalInfo);
});
}, function fail() {
@ -233,11 +224,7 @@ function DeviceService($http, $q, $window, userService, attributeService, custom
statisticalInfo.update = {
device: 1
};
saveDeviceRelarion(response.id.id, deviceParameters, config).then(function success(response) {
if(response.create) {
delete Object.assign(response, {update: response.create}).create;
}
angular.merge(statisticalInfo, response);
saveDeviceRelarion(response.id, deviceParameters, config).then(function success() {
deferred.resolve(statisticalInfo);
});
}, function fail() {
@ -267,7 +254,8 @@ function DeviceService($http, $q, $window, userService, attributeService, custom
return deferred.promise;
}
function getDeviceCredentials(deviceId, sync) {
function getDeviceCredentials(deviceId, sync, config) {
config = config || {};
var deferred = $q.defer();
var url = '/api/device/' + deviceId + '/credentials';
if (sync) {
@ -282,7 +270,7 @@ function DeviceService($http, $q, $window, userService, attributeService, custom
deferred.reject();
}
} else {
$http.get(url, null).then(function success(response) {
$http.get(url, config).then(function success(response) {
deferred.resolve(response.data);
}, function fail() {
deferred.reject();
@ -291,10 +279,11 @@ function DeviceService($http, $q, $window, userService, attributeService, custom
return deferred.promise;
}
function saveDeviceCredentials(deviceCredentials) {
function saveDeviceCredentials(deviceCredentials, config) {
config = config || {};
var deferred = $q.defer();
var url = '/api/device/credentials';
$http.post(url, deviceCredentials).then(function success(response) {
$http.post(url, deviceCredentials, config).then(function success(response) {
deferred.resolve(response.data);
}, function fail() {
deferred.reject();

4
ui/src/app/common/types.constant.js

@ -371,6 +371,10 @@ export default angular.module('thingsboard.types', [])
entityField: {
name: 'entity-group.column-type.entity-field',
value: 'ENTITY_FIELD'
},
accessToken: {
name: 'entity-group.column-type.access-token',
value: 'ACCESS_TOKEN'
}
},
entityField: {

30
ui/src/app/import-export/import-dialog-csv.controller.js

@ -28,7 +28,7 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
vm.previousStep = previousStep;
vm.addDevices = addDevices;
vm.importParams = {
vm.importParameters = {
delim: ',',
isUpdate: true,
isHeader: true
@ -43,7 +43,6 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
vm.isAlternative = false;
vm.isMobileStepText = true;
vm.columnsParam = [];
vm.parseData = [];
vm.delimiters = [{
@ -60,6 +59,12 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
value: 'Tab'
}];
vm.progressCreate = 0;
$scope.$on('importCSV-completed', function (event, completed) {
vm.progressCreate = completed.progress;
});
var parseData = {};
function fileAdded($file) {
@ -88,16 +93,17 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
function parseCSV(importData) {
var config = {
delim: vm.importParams.delim,
header: vm.importParams.isHeader
delim: vm.importParameters.delim,
header: vm.importParameters.isHeader
};
return importExport.convertCSVToJson(importData, config);
}
function createColumnsData(parseData) {
vm.columnsParam = [];
var columnParam = {};
for (var i = 0; i < parseData.headers.length; i++) {
if (vm.importParams.isHeader && parseData.headers[i].search(/^(name|type)$/im) === 0) {
if (vm.importParameters.isHeader && parseData.headers[i].search(/^(name|type)$/im) === 0) {
columnParam = {
type: types.entityGroup.columnType.entityField.value,
key: parseData.headers[i].toLowerCase(),
@ -106,7 +112,7 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
} else {
columnParam = {
type: types.entityGroup.columnType.serverAttribute.value,
key: vm.importParams.isHeader ? parseData.headers[i] : "",
key: vm.importParameters.isHeader ? parseData.headers[i] : "",
sampleData: parseData.rows[0][i]
};
}
@ -124,6 +130,7 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
var entityData = {
name: "",
type: "",
accessToken: "",
attributes: {
server: [],
shared: []
@ -150,6 +157,9 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
value: importData.rows[i][j]
});
break;
case types.entityGroup.columnType.accessToken.value:
entityData.accessToken = importData.rows[i][j];
break;
case types.entityGroup.columnType.entityField.value:
switch (parameterColumns[j].key) {
case types.entityGroup.entityField.name.value:
@ -164,7 +174,7 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
}
entitysData.push(entityData);
}
importExport.createMultiEntity(entitysData, vm.entityType, vm.importParams.isUpdate, config).then(function (response) {
importExport.createMultiEntity(entitysData, vm.entityType, vm.importParameters.isUpdate, config).then(function (response) {
vm.statistical = response;
$mdStepper('import-stepper').next();
});
@ -206,7 +216,11 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
}
function cancel() {
$mdDialog.cancel();
if($mdStepper('import-stepper').currentStep > 2){
$mdDialog.hide();
} else {
$mdDialog.cancel();
}
}
function finishExport() {

46
ui/src/app/import-export/import-dialog-csv.tpl.html

@ -15,19 +15,20 @@
limitations under the License.
-->
<md-dialog aria-label="{{ vm.importTitle | translate }}" class="tb-import-stepper">
<md-dialog aria-label="{{ vm.importTitle | translate }}" class="tb-import-stepper" tb-help="'import-csv'" help-container-id="help-container">
<md-toolbar>
<div class="md-toolbar-tools">
<h2 translate>{{ vm.importTitle }}</h2>
<span flex></span>
<div id="help-container"></div>
<md-button class="md-icon-button" ng-click="vm.cancel()">
<ng-md-icon icon="close" aria-label="{{ 'dialog.close' | translate }}"></ng-md-icon>
</md-button>
</div>
</md-toolbar>
<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading"
ng-show="$root.loading"></md-progress-linear>
<span style="max-height: 5px; height: 5px;" flex ng-show="!$root.loading"></span>
<!--<md-progress-linear class="md-warn" md-mode="indeterminate" ng-disabled="!$root.loading"-->
<!--ng-show="$root.loading"></md-progress-linear>-->
<span style="max-height: 5px; height: 5px;" flex></span>
<md-dialog-content>
<md-stepper id="import-stepper" md-mobile-step-text="vm.isMobileStepText" md-vertical="vm.isVertical"
md-linear="vm.isLinear" md-alternative="vm.isAlternative">
@ -85,25 +86,21 @@
<md-step md-label="Import configuration">
<md-step-body>
<div flex layout="row" layout-xs="column">
<md-input-container class="md-block" style="min-width: 120px">
<div layout="column">
<md-input-container>
<label translate>CSV delimiter</label>
<md-select ng-model="vm.importParams.delim">
<md-select ng-model="vm.importParameters.delim">
<md-option ng-repeat="delimiter in vm.delimiters" ng-value="delimiter.key">
{{delimiter.value}}
</md-option>
</md-select>
</md-input-container>
<md-input-container class="md-block">
<md-checkbox ng-model="vm.importParams.isHeader" aria-label="First line is header">
First line is header
</md-checkbox>
</md-input-container>
<md-input-container class="md-block">
<md-checkbox ng-model="vm.importParams.isUpdate" aria-label="Update attributes/telemetry">
Update attributes/telemetry
</md-checkbox>
</md-input-container>
<md-checkbox ng-model="vm.importParameters.isHeader" aria-label="First line contains column names">
First line contains column names
</md-checkbox>
<md-checkbox ng-model="vm.importParameters.isUpdate" aria-label="Update attributes/telemetry">
Update attributes/telemetry
</md-checkbox>
</div>
</md-step-body>
@ -145,18 +142,15 @@
<md-step md-label="Creating new entities">
<md-step-body>
<md-progress-linear md-mode="determinate" value="{{vm.determinateValue}}"></md-progress-linear>
<md-progress-linear class="md-warn tb-import-progress" md-mode="determinate" value="{{vm.progressCreate}}"></md-progress-linear>
</md-step-body>
</md-step>
<md-step md-label="Done">
<md-step-body layout="row">
<div flex ng-repeat="(key, value) in vm.statistical">
<div flex layout="column">
<div class="md-subhead" style="font-weight: 500; margin: 0.4em 0 0.6em;">{{key}}</div>
<div class="md-body-1" ng-repeat="(info, infoValue) in vm.statistical[key]">
{{ info }}: {{ infoValue }}
</div>
</div>
<md-step-body layout="column">
<div>
<p class="md-body-1" ng-if="vm.statistical.create && vm.statistical.create.device">{{vm.statistical.create.device}} new devices were successfully created.</p>
<p class="md-body-1" ng-if="vm.statistical.update && vm.statistical.update.device">{{vm.statistical.update.device}} devices were successfully updated.</p>
<p class="md-body-1" ng-if="vm.statistical.error && vm.statistical.error.device">There was an error creating {{vm.statistical.error.device}} devices.</p>
</div>
</md-step-body>
<md-step-actions layout="row">

4
ui/src/app/import-export/import-dialog.scss

@ -56,6 +56,10 @@ $previewSize: 100px !default;
.md-stepper-indicator-wrapper{
background-color: transparent;
}
.tb-import-progress{
margin: 7px 0;
}
//
//.md-stepper-indicator.md-THEME_NAME-theme.md-completed .md-stepper-number,
//.md-stepper-indicator.md-THEME_NAME-theme.md-active .md-stepper-number{

21
ui/src/app/import-export/import-export.service.js

@ -25,7 +25,7 @@ import entityAliasesTemplate from '../entity/alias/entity-aliases.tpl.html';
/* eslint-disable no-undef, angular/window-service, angular/document-service */
/*@ngInject*/
export default function ImportExport($log, $translate, $q, $mdDialog, $document, $http, itembuffer, utils, types, $timeout, deviceService,
export default function ImportExport($log, $translate, $q, $mdDialog, $document, $http, itembuffer, utils, types, $timeout, deviceService, $rootScope,
dashboardUtils, entityService, dashboardService, ruleChainService, widgetService, toast, attributeService) {
@ -585,7 +585,7 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
deferred.resolve();
},
function fail() {
deferred.resolve();
deferred.reject();
}
);
return deferred.promise;
@ -827,6 +827,18 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
});
return obj1;
}
function qAllWithProgress(promises, progress) {
var total = promises.length;
var now = 0;
promises.forEach(function(p) {
p.then(function() {
now++;
progress(now / total);
});
});
return $q.all(promises);
}
function createMultiEntity(arrayData, entityType, update, config) {
let deferred = $q.defer();
@ -840,7 +852,10 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
}
break;
}
$q.all(allPromise).then(function success(response) {
qAllWithProgress(allPromise, function(progress) {
progress = Math.round(progress * 100);
$rootScope.$broadcast('importCSV-completed', {progress: progress});
}).then(function success(response) {
for (let i = 0; i < response.length; i++){
statisticalInfo = sumObject(statisticalInfo, response[i]);
}

12
ui/src/app/import-export/table-columns-assignment.directive.js

@ -50,6 +50,7 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
vm.columnTypes.serverAttribute = types.entityGroup.columnType.serverAttribute;
vm.columnTypes.timeseries = types.entityGroup.columnType.timeseries;
vm.columnTypes.entityField = types.entityGroup.columnType.entityField;
vm.columnTypes.accessToken = types.entityGroup.columnType.accessToken;
break;
}
@ -66,6 +67,7 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
if (newVal) {
var isSelectName = false;
var isSelectType = false;
var isSelectCredentials = false;
for (var i = 0; i < newVal.length; i++) {
if (newVal[i].type === types.entityGroup.columnType.entityField.value &&
newVal[i].key === types.entityGroup.entityField.name.value) {
@ -75,10 +77,14 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
newVal[i].key === types.entityGroup.entityField.type.value) {
isSelectType = true;
}
if (newVal[i].type === types.entityGroup.columnType.accessToken.value) {
isSelectCredentials = true;
}
}
$timeout(function () {
vm.entityField.name.disable = isSelectName;
vm.entityField.type.disable = isSelectType;
vm.columnTypes.accessToken.disable = isSelectCredentials;
});
if(isSelectName && isSelectType) {
vm.theForm.$setDirty();
@ -87,10 +93,4 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
}
}
}, true);
//
// $scope.$watch('vm.columns', function(newVal, prevVal) {
// if (newVal && !angular.equals(newVal, prevVal)) {
// vm.theForm.$setDirty();
// }
// }, true);
}

11
ui/src/app/import-export/table-columns-assignment.tpl.html

@ -15,14 +15,14 @@
limitations under the License.
-->
<md-table-container layout="column" class="tb-table-select">
<md-table-container class="tb-table-select">
<table md-table>
<thead md-head>
<tr md-row>
<th md-column>&nbsp</th>
<th md-column>Example value data</th>
<th md-column style="min-width: 140px">Column type</th>
<th md-column style="min-width: 140px">Value</th>
<th md-column>Column type</th>
<th md-column>Value</th>
</tr>
</thead>
<tbody md-body>
@ -32,7 +32,7 @@
<td md-cell>
<md-select ng-model="column.type" required name="columnType"
aria-label="{{ 'entity-group.column-type' | translate }}">
<md-option ng-repeat="type in vm.columnTypes" ng-value="type.value">
<md-option ng-repeat="type in vm.columnTypes" ng-value="type.value" ng-disabled="type.disable">
{{type.name | translate}}
</md-option>
</md-select>
@ -47,8 +47,7 @@
</md-select>
<md-input-container md-no-float
ng-if="column.type != vm.columnTypes.entityField.value &&
column.type != vm.columnTypes.name.value &&
column.type != vm.columnTypes.type.value">
column.type != vm.columnTypes.accessToken.value">
<input required name="columnKeyName"
placeholder="{{ 'entity-group.column-value' | translate }}"
ng-model="column.key"

3
ui/src/app/locale/locale.constant-en_US.json

@ -789,7 +789,8 @@
"shared-attribute": "Shared attribute",
"server-attribute": "Server attribute",
"timeseries": "Timeseries",
"entity-field": "Entity field"
"entity-field": "Entity field",
"access-token": "Access token"
},
"entity-field": {
"name": "Name",

Loading…
Cancel
Save