): boolean {
switch (action.action) {
case 'open':
this.openDashboard(action.event, action.entity);
@@ -587,6 +606,9 @@ export class DashboardsTableConfigResolver {
case 'export':
this.exportDashboard(action.event, action.entity);
return true;
+ case 'import':
+ this.importDashboardFile(action.event, action.entity);
+ return true;
case 'makePublic':
this.makePublic(action.event, action.entity);
return true;
diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/import-dashboard-file-dialog.component.html b/ui-ngx/src/app/modules/home/pages/dashboard/import-dashboard-file-dialog.component.html
new file mode 100644
index 0000000000..c4db36c1bf
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/pages/dashboard/import-dashboard-file-dialog.component.html
@@ -0,0 +1,57 @@
+
+
diff --git a/ui-ngx/src/app/modules/home/pages/dashboard/import-dashboard-file-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/dashboard/import-dashboard-file-dialog.component.ts
new file mode 100644
index 0000000000..01fca78bf9
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/pages/dashboard/import-dashboard-file-dialog.component.ts
@@ -0,0 +1,89 @@
+///
+/// Copyright © 2016-2025 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { Component, Inject, OnInit } from '@angular/core';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { Store } from '@ngrx/store';
+import { AppState } from '@core/core.state';
+import { FormBuilder, FormGroup } from '@angular/forms';
+import { DashboardService } from '@core/http/dashboard.service';
+import { Dashboard } from '@app/shared/models/dashboard.models';
+import { ActionNotificationShow } from '@core/notification/notification.actions';
+import { DialogComponent } from '@shared/components/dialog.component';
+import { Router } from '@angular/router';
+
+export interface DashboardInfoDialogData {
+ dashboard: Dashboard;
+}
+
+@Component({
+ selector: 'tb-import-dashboard-file-dialog',
+ templateUrl: './import-dashboard-file-dialog.component.html',
+ styleUrls: []
+})
+export class ImportDashboardFileDialogComponent extends DialogComponent implements OnInit {
+
+ private dashboard: Dashboard;
+ currentFileName: string = '';
+ uploadFileFormGroup: FormGroup;
+
+ constructor(protected store: Store,
+ protected router: Router,
+ @Inject(MAT_DIALOG_DATA) public data: DashboardInfoDialogData,
+ private dashboardService: DashboardService,
+ protected dialogRef: MatDialogRef,
+ private fb: FormBuilder) {
+ super(store, router, dialogRef);
+ this.dashboard = data.dashboard;
+ }
+
+ ngOnInit(): void {
+ this.uploadFileFormGroup = this.fb.group({
+ file: [null]
+ });
+ }
+
+ cancel(): void {
+ this.dialogRef.close();
+ }
+
+ save() {
+ const fileControl = this.uploadFileFormGroup.get('file');
+ if (!fileControl || !fileControl.value) {
+ return;
+ }
+
+ const dashboardContent = {
+ ...fileControl.value,
+ description: this.dashboard.configuration.description
+ };
+ this.dashboard.configuration = dashboardContent;
+
+ this.dashboardService.saveDashboard(this.dashboard).subscribe(() => {
+ this.dialogRef.close(true);
+ })
+ }
+
+ loadDataFromJsonContent(content: string): any {
+ try {
+ const importData = JSON.parse(content);
+ return importData ? importData['configuration'] : importData;
+ } catch (err) {
+ this.store.dispatch(new ActionNotificationShow({message: err.message, type: 'error'}));
+ return null;
+ }
+ }
+}
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index dbacae6ad3..a982bb1c07 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -1429,6 +1429,8 @@
"mobile-order": "Dashboard order in mobile application",
"mobile-hide": "Hide dashboard in mobile application",
"update-image": "Update dashboard image",
+ "update-new-version": "Upload new version",
+ "upload-file-to-update": "Upload file to update",
"take-screenshot": "Take screenshot",
"select-widget-title": "Select widget",
"select-widget-value": "{{title}}: select widget",