Commit 3a48b90d84cebe5f9d0a6a789e13beebeeffce28

Authored by deaflynx
1 parent 8945f5b3

Fixed Edge devices page

@@ -90,11 +90,13 @@ export class AssetService { @@ -90,11 +90,13 @@ export class AssetService {
90 } 90 }
91 91
92 public assignAssetToEdge(edgeId: string, assetId: string, config?: RequestConfig): Observable<Asset> { 92 public assignAssetToEdge(edgeId: string, assetId: string, config?: RequestConfig): Observable<Asset> {
93 - return this.http.post<Asset>(`/api/edge/${edgeId}/asset/${assetId}`, null, defaultHttpOptionsFromConfig(config)); 93 + return this.http.post<Asset>(`/api/edge/${edgeId}/asset/${assetId}`, null,
  94 + defaultHttpOptionsFromConfig(config));
94 } 95 }
95 96
96 - public unassignAssetFromEdge(assetId: string, config?: RequestConfig) {  
97 - return this.http.delete(`/api/edge/asset/${assetId}`, defaultHttpOptionsFromConfig(config)); 97 + public unassignAssetFromEdge(edgeId: string, assetId: string,
  98 + config?: RequestConfig) {
  99 + return this.http.delete(`/api/edge/${edgeId}/asset/${assetId}`, defaultHttpOptionsFromConfig(config));
98 } 100 }
99 101
100 public getEdgeAssets(edgeId, pageLink: PageLink, type: string = '', 102 public getEdgeAssets(edgeId, pageLink: PageLink, type: string = '',
@@ -76,23 +76,23 @@ export class AddEntitiesToEdgeDialogComponent extends @@ -76,23 +76,23 @@ export class AddEntitiesToEdgeDialogComponent extends
76 }); 76 });
77 switch (this.data.entityType) { 77 switch (this.data.entityType) {
78 case EntityType.DEVICE: 78 case EntityType.DEVICE:
79 - this.assignToEdgeTitle = 'device.assign-device-to-edge'; 79 + this.assignToEdgeTitle = 'device.assign-device-to-edge-title';
80 this.assignToEdgeText = 'device.assign-device-to-edge-text'; 80 this.assignToEdgeText = 'device.assign-device-to-edge-text';
81 break; 81 break;
82 case EntityType.RULE_CHAIN: 82 case EntityType.RULE_CHAIN:
83 - this.assignToEdgeTitle = 'rulechain.assign-rulechain-to-edge'; 83 + this.assignToEdgeTitle = 'rulechain.assign-rulechain-to-edge-title';
84 this.assignToEdgeText = 'rulechain.assign-rulechain-to-edge-text'; 84 this.assignToEdgeText = 'rulechain.assign-rulechain-to-edge-text';
85 break; 85 break;
86 case EntityType.ASSET: 86 case EntityType.ASSET:
87 - this.assignToEdgeTitle = 'asset.assign-asset-to-edge'; 87 + this.assignToEdgeTitle = 'asset.assign-asset-to-edge-title';
88 this.assignToEdgeText = 'asset.assign-asset-to-edge-text'; 88 this.assignToEdgeText = 'asset.assign-asset-to-edge-text';
89 break; 89 break;
90 case EntityType.ENTITY_VIEW: 90 case EntityType.ENTITY_VIEW:
91 - this.assignToEdgeTitle = 'entity-view.assign-entity-view-to-edge'; 91 + this.assignToEdgeTitle = 'entity-view.assign-entity-view-to-edge-title';
92 this.assignToEdgeText = 'entity-view.assign-entity-view-to-edge-text'; 92 this.assignToEdgeText = 'entity-view.assign-entity-view-to-edge-text';
93 break; 93 break;
94 case EntityType.DASHBOARD: 94 case EntityType.DASHBOARD:
95 - this.assignToEdgeTitle = 'dashboard.assign-dashboard-to-edge'; 95 + this.assignToEdgeTitle = 'dashboard.assign-dashboard-to-edge-title';
96 this.assignToEdgeText = 'dashboard.assign-dashboard-to-edge-text'; 96 this.assignToEdgeText = 'dashboard.assign-dashboard-to-edge-text';
97 break; 97 break;
98 } 98 }
@@ -136,13 +136,10 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -136,13 +136,10 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
136 } else { 136 } else {
137 this.config.tableTitle = parentCustomer.title + ': ' + this.translate.instant('asset.assets'); 137 this.config.tableTitle = parentCustomer.title + ': ' + this.translate.instant('asset.assets');
138 } 138 }
139 - } else if (this.edgeId) { // TODO: deaflynx: find better way - out of parentCustomer map  
140 - this.edgeService.getEdge(this.edgeId)  
141 - .pipe(map(edge =>  
142 - this.config.tableTitle = edge.name + ': ' + this.translate.instant('asset.assets') ),  
143 - ).subscribe();  
144 - }  
145 - else { 139 + } else if (this.config.componentsData.assetScope === 'edge') {
  140 + this.edgeService.getEdge(this.edgeId).pipe(map(edge =>
  141 + this.config.tableTitle = edge.name + ': ' + this.translate.instant('asset.assets'))).subscribe();
  142 + } else {
146 this.config.tableTitle = this.translate.instant('asset.assets'); 143 this.config.tableTitle = this.translate.instant('asset.assets');
147 } 144 }
148 this.config.columns = this.configureColumns(this.config.componentsData.assetScope); 145 this.config.columns = this.configureColumns(this.config.componentsData.assetScope);
@@ -242,9 +239,9 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -242,9 +239,9 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
242 if (assetScope === 'edge') { 239 if (assetScope === 'edge') {
243 actions.push( 240 actions.push(
244 { 241 {
245 - name: this.translate.instant('asset.unassign-from-edge'), 242 + name: this.translate.instant('edge.unassign-from-edge'),
246 icon: 'portable_wifi_off', 243 icon: 'portable_wifi_off',
247 - isEnabled: (entity) => (entity.edgeId && entity.edgeId.id !== NULL_UUID), 244 + isEnabled: (entity) => true,
248 onAction: ($event, entity) => this.unassignFromEdge($event, entity) 245 onAction: ($event, entity) => this.unassignFromEdge($event, entity)
249 } 246 }
250 ); 247 );
@@ -264,23 +261,23 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -264,23 +261,23 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
264 } 261 }
265 ); 262 );
266 } 263 }
267 - if (assetScope === 'edge') { 264 + if (assetScope === 'customer') {
268 actions.push( 265 actions.push(
269 { 266 {
270 - name: this.translate.instant('asset.unassign-assets-from-edge'),  
271 - icon: 'portable_wifi_off', 267 + name: this.translate.instant('asset.unassign-assets'),
  268 + icon: 'assignment_return',
272 isEnabled: true, 269 isEnabled: true,
273 - onAction: ($event, entities) => this.unassignAssetsFromEdge($event, entities) 270 + onAction: ($event, entities) => this.unassignAssetsFromCustomer($event, entities)
274 } 271 }
275 ); 272 );
276 } 273 }
277 - if (assetScope === 'customer') { 274 + if (assetScope === 'edge') {
278 actions.push( 275 actions.push(
279 { 276 {
280 - name: this.translate.instant('asset.unassign-assets'),  
281 - icon: 'assignment_return', 277 + name: this.translate.instant('asset.unassign-assets-from-edge'),
  278 + icon: 'portable_wifi_off',
282 isEnabled: true, 279 isEnabled: true,
283 - onAction: ($event, entities) => this.unassignAssetsFromCustomer($event, entities) 280 + onAction: ($event, entities) => this.unassignAssetsFromEdge($event, entities)
284 } 281 }
285 ); 282 );
286 } 283 }
@@ -357,26 +354,6 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -357,26 +354,6 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
357 }); 354 });
358 } 355 }
359 356
360 - addAssetsToEdge($event: Event) {  
361 - if ($event) {  
362 - $event.stopPropagation();  
363 - }  
364 - this.dialog.open<AddEntitiesToEdgeDialogComponent, AddEntitiesToEdgeDialogData,  
365 - boolean>(AddEntitiesToEdgeDialogComponent, {  
366 - disableClose: true,  
367 - panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],  
368 - data: {  
369 - edgeId: this.edgeId,  
370 - entityType: EntityType.ASSET  
371 - }  
372 - }).afterClosed()  
373 - .subscribe((res) => {  
374 - if (res) {  
375 - this.config.table.updateData();  
376 - }  
377 - });  
378 - }  
379 -  
380 makePublic($event: Event, asset: Asset) { 357 makePublic($event: Event, asset: Asset) {
381 if ($event) { 358 if ($event) {
382 $event.stopPropagation(); 359 $event.stopPropagation();
@@ -494,6 +471,26 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -494,6 +471,26 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
494 return false; 471 return false;
495 } 472 }
496 473
  474 + addAssetsToEdge($event: Event) {
  475 + if ($event) {
  476 + $event.stopPropagation();
  477 + }
  478 + this.dialog.open<AddEntitiesToEdgeDialogComponent, AddEntitiesToEdgeDialogData,
  479 + boolean>(AddEntitiesToEdgeDialogComponent, {
  480 + disableClose: true,
  481 + panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
  482 + data: {
  483 + edgeId: this.edgeId,
  484 + entityType: EntityType.ASSET
  485 + }
  486 + }).afterClosed()
  487 + .subscribe((res) => {
  488 + if (res) {
  489 + this.config.table.updateData();
  490 + }
  491 + });
  492 + }
  493 +
497 unassignFromEdge($event: Event, asset: AssetInfo) { 494 unassignFromEdge($event: Event, asset: AssetInfo) {
498 if ($event) { 495 if ($event) {
499 $event.stopPropagation(); 496 $event.stopPropagation();
@@ -506,7 +503,7 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -506,7 +503,7 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
506 true 503 true
507 ).subscribe((res) => { 504 ).subscribe((res) => {
508 if (res) { 505 if (res) {
509 - this.assetService.unassignAssetFromEdge(asset.id.id).subscribe( 506 + this.assetService.unassignAssetFromEdge(this.edgeId, asset.id.id).subscribe(
510 () => { 507 () => {
511 this.config.table.updateData(); 508 this.config.table.updateData();
512 } 509 }
@@ -531,7 +528,7 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse @@ -531,7 +528,7 @@ export class AssetsTableConfigResolver implements Resolve<EntityTableConfig<Asse
531 const tasks: Observable<any>[] = []; 528 const tasks: Observable<any>[] = [];
532 assets.forEach( 529 assets.forEach(
533 (asset) => { 530 (asset) => {
534 - tasks.push(this.assetService.unassignAssetFromEdge(asset.id.id)); 531 + tasks.push(this.assetService.unassignAssetFromEdge(this.edgeId, asset.id.id));
535 } 532 }
536 ); 533 );
537 forkJoin(tasks).subscribe( 534 forkJoin(tasks).subscribe(
@@ -61,6 +61,11 @@ import { @@ -61,6 +61,11 @@ import {
61 } from '../../dialogs/add-entities-to-customer-dialog.component'; 61 } from '../../dialogs/add-entities-to-customer-dialog.component';
62 import { DeviceTabsComponent } from '@home/pages/device/device-tabs.component'; 62 import { DeviceTabsComponent } from '@home/pages/device/device-tabs.component';
63 import { HomeDialogsService } from '@home/dialogs/home-dialogs.service'; 63 import { HomeDialogsService } from '@home/dialogs/home-dialogs.service';
  64 +import { EdgeService } from "@core/http/edge.service";
  65 +import {
  66 + AddEntitiesToEdgeDialogComponent,
  67 + AddEntitiesToEdgeDialogData
  68 +} from "@home/dialogs/add-entities-to-edge-dialog.component";
64 69
65 @Injectable() 70 @Injectable()
66 export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<DeviceInfo>> { 71 export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<DeviceInfo>> {
@@ -68,12 +73,14 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -68,12 +73,14 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
68 private readonly config: EntityTableConfig<DeviceInfo> = new EntityTableConfig<DeviceInfo>(); 73 private readonly config: EntityTableConfig<DeviceInfo> = new EntityTableConfig<DeviceInfo>();
69 74
70 private customerId: string; 75 private customerId: string;
  76 + private edgeId: string;
71 77
72 constructor(private store: Store<AppState>, 78 constructor(private store: Store<AppState>,
73 private broadcast: BroadcastService, 79 private broadcast: BroadcastService,
74 private deviceService: DeviceService, 80 private deviceService: DeviceService,
75 private customerService: CustomerService, 81 private customerService: CustomerService,
76 private dialogService: DialogService, 82 private dialogService: DialogService,
  83 + private edgeService: EdgeService,
77 private homeDialogs: HomeDialogsService, 84 private homeDialogs: HomeDialogsService,
78 private translate: TranslateService, 85 private translate: TranslateService,
79 private datePipe: DatePipe, 86 private datePipe: DatePipe,
@@ -114,6 +121,7 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -114,6 +121,7 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
114 deviceType: '' 121 deviceType: ''
115 }; 122 };
116 this.customerId = routeParams.customerId; 123 this.customerId = routeParams.customerId;
  124 + this.edgeId = routeParams.edgeId;
117 return this.store.pipe(select(selectAuthUser), take(1)).pipe( 125 return this.store.pipe(select(selectAuthUser), take(1)).pipe(
118 tap((authUser) => { 126 tap((authUser) => {
119 if (authUser.authority === Authority.CUSTOMER_USER) { 127 if (authUser.authority === Authority.CUSTOMER_USER) {
@@ -131,6 +139,9 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -131,6 +139,9 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
131 } else { 139 } else {
132 this.config.tableTitle = parentCustomer.title + ': ' + this.translate.instant('device.devices'); 140 this.config.tableTitle = parentCustomer.title + ': ' + this.translate.instant('device.devices');
133 } 141 }
  142 + } else if (this.config.componentsData.deviceScope === 'edge') {
  143 + this.edgeService.getEdge(this.edgeId).pipe(map(edge =>
  144 + this.config.tableTitle = edge.name + ': ' + this.translate.instant('device.devices'))).subscribe();
134 } else { 145 } else {
135 this.config.tableTitle = this.translate.instant('device.devices'); 146 this.config.tableTitle = this.translate.instant('device.devices');
136 } 147 }
@@ -177,6 +188,10 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -177,6 +188,10 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
177 this.config.entitiesFetchFunction = pageLink => 188 this.config.entitiesFetchFunction = pageLink =>
178 this.deviceService.getTenantDeviceInfos(pageLink, this.config.componentsData.deviceType); 189 this.deviceService.getTenantDeviceInfos(pageLink, this.config.componentsData.deviceType);
179 this.config.deleteEntity = id => this.deviceService.deleteDevice(id.id); 190 this.config.deleteEntity = id => this.deviceService.deleteDevice(id.id);
  191 + } else if (deviceScope === 'edge') {
  192 + this.config.entitiesFetchFunction = pageLink =>
  193 + this.deviceService.getEdgeDevices(this.edgeId, pageLink, this.config.componentsData.edgeType);
  194 + this.config.deleteEntity = id => this.deviceService.deleteDevice(id.id);
180 } else { 195 } else {
181 this.config.entitiesFetchFunction = pageLink => 196 this.config.entitiesFetchFunction = pageLink =>
182 this.deviceService.getCustomerDeviceInfos(this.customerId, pageLink, this.config.componentsData.deviceType); 197 this.deviceService.getCustomerDeviceInfos(this.customerId, pageLink, this.config.componentsData.deviceType);
@@ -252,6 +267,16 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -252,6 +267,16 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
252 } 267 }
253 ); 268 );
254 } 269 }
  270 + if (deviceScope === 'edge') {
  271 + actions.push(
  272 + {
  273 + name: this.translate.instant('edge.unassign-from-edge'),
  274 + icon: 'portable_wifi_off',
  275 + isEnabled: (entity) => true,
  276 + onAction: ($event, entity) => this.unassignFromEdge($event, entity)
  277 + }
  278 + );
  279 + }
255 return actions; 280 return actions;
256 } 281 }
257 282
@@ -277,6 +302,16 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -277,6 +302,16 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
277 } 302 }
278 ); 303 );
279 } 304 }
  305 + if (deviceScope === 'edge') {
  306 + actions.push(
  307 + {
  308 + name: this.translate.instant('asset.unassign-assets-from-edge'),
  309 + icon: 'portable_wifi_off',
  310 + isEnabled: true,
  311 + onAction: ($event, entities) => this.unassignDevicesFromCustomer($event, entities)
  312 + }
  313 + );
  314 + }
280 return actions; 315 return actions;
281 } 316 }
282 317
@@ -308,6 +343,16 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -308,6 +343,16 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
308 } 343 }
309 ); 344 );
310 } 345 }
  346 + if (deviceScope === 'edge') {
  347 + actions.push(
  348 + {
  349 + name: this.translate.instant('device.assign-new-device'),
  350 + icon: 'add',
  351 + isEnabled: () => true,
  352 + onAction: ($event) => this.addDevicesToEdge($event)
  353 + }
  354 + );
  355 + }
311 return actions; 356 return actions;
312 } 357 }
313 358
@@ -475,4 +520,74 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev @@ -475,4 +520,74 @@ export class DevicesTableConfigResolver implements Resolve<EntityTableConfig<Dev
475 return false; 520 return false;
476 } 521 }
477 522
  523 + addDevicesToEdge($event: Event) {
  524 + if ($event) {
  525 + $event.stopPropagation();
  526 + }
  527 + this.dialog.open<AddEntitiesToEdgeDialogComponent, AddEntitiesToEdgeDialogData,
  528 + boolean>(AddEntitiesToEdgeDialogComponent, {
  529 + disableClose: true,
  530 + panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
  531 + data: {
  532 + edgeId: this.edgeId,
  533 + entityType: EntityType.DEVICE
  534 + }
  535 + }).afterClosed()
  536 + .subscribe((res) => {
  537 + if (res) {
  538 + this.config.table.updateData();
  539 + }
  540 + });
  541 + }
  542 +
  543 + unassignFromEdge($event: Event, device: DeviceInfo) {
  544 + if ($event) {
  545 + $event.stopPropagation();
  546 + }
  547 + this.dialogService.confirm(
  548 + this.translate.instant('device.unassign-device-from-edge-title', {deviceName: device.name}),
  549 + this.translate.instant('device.unassign-device-from-edge-text'),
  550 + this.translate.instant('action.no'),
  551 + this.translate.instant('action.yes'),
  552 + true
  553 + ).subscribe((res) => {
  554 + if (res) {
  555 + this.deviceService.unassignDeviceFromEdge(device.id.id).subscribe(
  556 + () => {
  557 + this.config.table.updateData();
  558 + }
  559 + );
  560 + }
  561 + }
  562 + );
  563 + }
  564 +
  565 + unassignDevicesFromEdge($event: Event, devices: Array<DeviceInfo>) {
  566 + if ($event) {
  567 + $event.stopPropagation();
  568 + }
  569 + this.dialogService.confirm(
  570 + this.translate.instant('device.unassign-devices-from-edge-title', {count: devices.length}),
  571 + this.translate.instant('device.unassign-devices-from-edge-text'),
  572 + this.translate.instant('action.no'),
  573 + this.translate.instant('action.yes'),
  574 + true
  575 + ).subscribe((res) => {
  576 + if (res) {
  577 + const tasks: Observable<any>[] = [];
  578 + devices.forEach(
  579 + (device) => {
  580 + tasks.push(this.deviceService.unassignDeviceFromEdge(device.id.id));
  581 + }
  582 + );
  583 + forkJoin(tasks).subscribe(
  584 + () => {
  585 + this.config.table.updateData();
  586 + }
  587 + );
  588 + }
  589 + }
  590 + );
  591 + }
  592 +
478 } 593 }
@@ -24,7 +24,6 @@ import { EdgeId } from "@shared/models/id/edge-id"; @@ -24,7 +24,6 @@ import { EdgeId } from "@shared/models/id/edge-id";
24 export interface Asset extends BaseData<AssetId> { 24 export interface Asset extends BaseData<AssetId> {
25 tenantId?: TenantId; 25 tenantId?: TenantId;
26 customerId?: CustomerId; 26 customerId?: CustomerId;
27 - edgeId?: EdgeId; //TODO: deaflynx: "edgeId?" ?  
28 name: string; 27 name: string;
29 type: string; 28 type: string;
30 label: string; 29 label: string;
@@ -266,6 +266,8 @@ @@ -266,6 +266,8 @@
266 "asset-details": "Asset details", 266 "asset-details": "Asset details",
267 "assign-assets": "Assign assets", 267 "assign-assets": "Assign assets",
268 "assign-assets-text": "Assign { count, plural, 1 {1 asset} other {# assets} } to customer", 268 "assign-assets-text": "Assign { count, plural, 1 {1 asset} other {# assets} } to customer",
  269 + "assign-asset-to-edge-title": "Assign Asset(s) To Edge",
  270 + "assign-asset-to-edge-text":"Please select the assets to assign to the edge",
269 "delete-assets": "Delete assets", 271 "delete-assets": "Delete assets",
270 "unassign-assets": "Unassign assets", 272 "unassign-assets": "Unassign assets",
271 "unassign-assets-action-title": "Unassign { count, plural, 1 {1 asset} other {# assets} } from customer", 273 "unassign-assets-action-title": "Unassign { count, plural, 1 {1 asset} other {# assets} } from customer",
@@ -284,6 +286,11 @@ @@ -284,6 +286,11 @@
284 "unassign-asset": "Unassign asset", 286 "unassign-asset": "Unassign asset",
285 "unassign-assets-title": "Are you sure you want to unassign { count, plural, 1 {1 asset} other {# assets} }?", 287 "unassign-assets-title": "Are you sure you want to unassign { count, plural, 1 {1 asset} other {# assets} }?",
286 "unassign-assets-text": "After the confirmation all selected assets will be unassigned and won't be accessible by the customer.", 288 "unassign-assets-text": "After the confirmation all selected assets will be unassigned and won't be accessible by the customer.",
  289 + "unassign-asset-from-edge-title": "Are you sure you want to unassign the asset '{{assetName}}'?",
  290 + "unassign-asset-from-edge-text": "After the confirmation the asset will be unassigned and won't be accessible by the edge.",
  291 + "unassign-assets-from-edge": "Unassign assets from edge",
  292 + "unassign-assets-from-edge-title": "Are you sure you want to unassign { count, plural, 1 {1 asset} other {# assets} }?",
  293 + "unassign-assets-from-edge-text": "After the confirmation all selected assets will be unassigned and won't be accessible by the edge.",
287 "copyId": "Copy asset Id", 294 "copyId": "Copy asset Id",
288 "idCopiedMessage": "Asset Id has been copied to clipboard", 295 "idCopiedMessage": "Asset Id has been copied to clipboard",
289 "select-asset": "Select asset", 296 "select-asset": "Select asset",
@@ -669,6 +676,8 @@ @@ -669,6 +676,8 @@
669 "assign-to-customer": "Assign to customer", 676 "assign-to-customer": "Assign to customer",
670 "assign-device-to-customer": "Assign Device(s) To Customer", 677 "assign-device-to-customer": "Assign Device(s) To Customer",
671 "assign-device-to-customer-text": "Please select the devices to assign to the customer", 678 "assign-device-to-customer-text": "Please select the devices to assign to the customer",
  679 + "assign-device-to-edge-title": "Assign Device(s) To Edge",
  680 + "assign-device-to-edge-text":"Please select the devices to assign to the edge",
672 "make-public": "Make device public", 681 "make-public": "Make device public",
673 "make-private": "Make device private", 682 "make-private": "Make device private",
674 "no-devices-text": "No devices found", 683 "no-devices-text": "No devices found",
@@ -684,6 +693,8 @@ @@ -684,6 +693,8 @@
684 "unassign-from-customer": "Unassign from customer", 693 "unassign-from-customer": "Unassign from customer",
685 "unassign-devices": "Unassign devices", 694 "unassign-devices": "Unassign devices",
686 "unassign-devices-action-title": "Unassign { count, plural, 1 {1 device} other {# devices} } from customer", 695 "unassign-devices-action-title": "Unassign { count, plural, 1 {1 device} other {# devices} } from customer",
  696 + "unassign-device-from-edge-title": "Are you sure you want to unassign the device '{{deviceName}}'?",
  697 + "unassign-device-from-edge-text": "After the confirmation the device will be unassigned and won't be accessible by the edge.",
687 "assign-new-device": "Assign new device", 698 "assign-new-device": "Assign new device",
688 "make-public-device-title": "Are you sure you want to make the device '{{deviceName}}' public?", 699 "make-public-device-title": "Are you sure you want to make the device '{{deviceName}}' public?",
689 "make-public-device-text": "After the confirmation the device and all its data will be made public and accessible by others.", 700 "make-public-device-text": "After the confirmation the device and all its data will be made public and accessible by others.",