diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/widgets/type/DefaultWidgetTypeService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/widgets/type/DefaultWidgetTypeService.java index 650f92ac20..1d40e9630c 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/widgets/type/DefaultWidgetTypeService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/widgets/type/DefaultWidgetTypeService.java @@ -18,6 +18,7 @@ package org.thingsboard.server.service.entitiy.widgets.type; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.id.TenantId; @@ -42,7 +43,7 @@ public class DefaultWidgetTypeService extends AbstractTbEntityService implements @Override public WidgetTypeDetails save(WidgetTypeDetails widgetTypeDetails, boolean updateExistingByFqn, User user) throws Exception { TenantId tenantId = widgetTypeDetails.getTenantId(); - if (widgetTypeDetails.getId() == null && updateExistingByFqn) { + if (widgetTypeDetails.getId() == null && StringUtils.isNotEmpty(widgetTypeDetails.getFqn()) && updateExistingByFqn) { WidgetType widgetType = widgetTypeService.findWidgetTypeByTenantIdAndFqn(tenantId, widgetTypeDetails.getFqn()); if (widgetType != null) { widgetTypeDetails.setId(widgetType.getId()); diff --git a/ui-ngx/src/app/modules/home/components/import-export/import-export.service.ts b/ui-ngx/src/app/modules/home/components/import-export/import-export.service.ts index 7ffcaae8e3..e91375e75e 100644 --- a/ui-ngx/src/app/modules/home/components/import-export/import-export.service.ts +++ b/ui-ngx/src/app/modules/home/components/import-export/import-export.service.ts @@ -398,7 +398,9 @@ export class ImportExportService { const widgetTypesDetails = widgetsBundleItem.widgetTypes; const saveWidgetTypesObservables: Array> = []; for (const widgetTypeDetails of widgetTypesDetails) { - saveWidgetTypesObservables.push(this.widgetService.saveImportedWidgetTypeDetails(widgetTypeDetails)); + saveWidgetTypesObservables.push( + this.widgetService.saveImportedWidgetTypeDetails(this.prepareWidgetType(widgetTypeDetails, savedWidgetsBundle)) + ); } widgetTypesObservable = forkJoin(saveWidgetTypesObservables); } else { @@ -432,6 +434,15 @@ export class ImportExportService { ); } + private prepareWidgetType(widgetType: WidgetTypeDetails & {alias?: string}, widgetsBundle: WidgetsBundle): WidgetTypeDetails { + if (!widgetType.fqn) { + widgetType.fqn = `${widgetsBundle.alias}.${widgetType.alias + ? widgetType.alias + : widgetType.name.toLowerCase().replace(/\W/g, '_')}`; + } + return widgetType; + } + public bulkImportEntities(entitiesData: BulkImportRequest, entityType: EntityType, config?: RequestConfig): Observable { switch (entityType) { case EntityType.DEVICE: diff --git a/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html b/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html index fd427923f7..06528041ab 100644 --- a/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/wizard/device-wizard-dialog.component.html @@ -75,6 +75,7 @@ diff --git a/ui-ngx/src/app/shared/components/image-input.component.scss b/ui-ngx/src/app/shared/components/image-input.component.scss index b7d05bef8d..ee4f6451c4 100644 --- a/ui-ngx/src/app/shared/components/image-input.component.scss +++ b/ui-ngx/src/app/shared/components/image-input.component.scss @@ -22,7 +22,7 @@ $previewSize: 78px !default; .tb-container { margin-top: 0; - padding: 0; + padding: 0 0 16px; label.tb-title { display: block; padding-bottom: 8px; @@ -121,6 +121,7 @@ $previewSize: 78px !default; .tb-hint{ margin-top: 8px; + padding-bottom: 0; } }