From d3858d884787d9f888d9f8b9c31f3e9ede14449e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 13 Dec 2017 09:49:24 +0100 Subject: [PATCH 1/9] ux: fixed inactive view mode and removed animation --- public/sass/components/_view_states.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/public/sass/components/_view_states.scss b/public/sass/components/_view_states.scss index e528891547a..0b5c5a27ee3 100644 --- a/public/sass/components/_view_states.scss +++ b/public/sass/components/_view_states.scss @@ -17,29 +17,24 @@ .panel-info-corner--info, .panel-info-corner--links { opacity: 0; - transition: all 1.5s ease-in-out 1s; } .navbar { box-shadow: none; background: transparent; - padding-left: $side-menu-width + 20px; } .navbar-page-btn { border-color: transparent; background: transparent; transform: translate3d(-40px, 0, 0); - transition: all 1.5s ease-in-out 1s; i { opacity: 0; - transition: all 1.5s ease-in-out 1s; } } .gf-timepicker-nav-btn { transform: translate3d(40px, 0, 0); - transition: transform 1.5s ease-in-out 1s; } } From 2465fcbd6b4d9033eb20c3256e54fca61d2230fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 13 Dec 2017 10:00:54 +0100 Subject: [PATCH 2/9] fix: FolderId and IsFolder when saving dashboard --- pkg/services/dashboards/dashboards.go | 16 ++++++++-------- pkg/services/provisioning/dashboards/types.go | 3 --- .../app/core/components/search/search_results.ts | 1 - 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/pkg/services/dashboards/dashboards.go b/pkg/services/dashboards/dashboards.go index 24e9f240fd8..4bdba59b18e 100644 --- a/pkg/services/dashboards/dashboards.go +++ b/pkg/services/dashboards/dashboards.go @@ -23,14 +23,12 @@ func SetRepository(rep Repository) { } type SaveDashboardItem struct { - TitleLower string - OrgId int64 - Folder string - UpdatedAt time.Time - UserId int64 - Message string - Overwrite bool - Dashboard *models.Dashboard + OrgId int64 + UpdatedAt time.Time + UserId int64 + Message string + Overwrite bool + Dashboard *models.Dashboard } type DashboardRepository struct{} @@ -57,6 +55,8 @@ func (dr *DashboardRepository) SaveDashboard(json *SaveDashboardItem) (*models.D OrgId: json.OrgId, Overwrite: json.Overwrite, UserId: json.UserId, + FolderId: dashboard.FolderId, + IsFolder: dashboard.IsFolder, } if !json.UpdatedAt.IsZero() { diff --git a/pkg/services/provisioning/dashboards/types.go b/pkg/services/provisioning/dashboards/types.go index 002a56b5f3c..c4c4a67a755 100644 --- a/pkg/services/provisioning/dashboards/types.go +++ b/pkg/services/provisioning/dashboards/types.go @@ -1,7 +1,6 @@ package dashboards import ( - "strings" "time" "github.com/grafana/grafana/pkg/components/simplejson" @@ -23,11 +22,9 @@ func createDashboardJson(data *simplejson.Json, lastModified time.Time, cfg *Das dash := &dashboards.SaveDashboardItem{} dash.Dashboard = models.NewDashboardFromJson(data) - dash.TitleLower = strings.ToLower(dash.Dashboard.Title) dash.UpdatedAt = lastModified dash.Overwrite = true dash.OrgId = cfg.OrgId - dash.Folder = cfg.Folder dash.Dashboard.Data.Set("editable", cfg.Editable) if dash.Dashboard.Title == "" { diff --git a/public/app/core/components/search/search_results.ts b/public/app/core/components/search/search_results.ts index 02b6c9f355b..0c74600d1c3 100644 --- a/public/app/core/components/search/search_results.ts +++ b/public/app/core/components/search/search_results.ts @@ -9,7 +9,6 @@ export class SearchResultsCtrl { /** @ngInject */ constructor(private $location) { - } toggleFolderExpand(section) { From c98e15903eeb68a215ce6d1dcdce50473585a166 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Wed, 13 Dec 2017 10:54:08 +0100 Subject: [PATCH 3/9] dashfolder: settings page for folder with rename and delete. Fixes #10120 --- public/app/core/routes/routes.ts | 5 ++ public/app/features/dashboard/all.ts | 2 + .../features/dashboard/folder_page_loader.ts | 20 ++++- .../dashboard/folder_settings_ctrl.ts | 83 +++++++++++++++++++ .../dashboard/partials/folder_settings.html | 24 ++++++ 5 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 public/app/features/dashboard/folder_settings_ctrl.ts create mode 100644 public/app/features/dashboard/partials/folder_settings.html diff --git a/public/app/core/routes/routes.ts b/public/app/core/routes/routes.ts index 90612d4c4e2..9c975f6465a 100644 --- a/public/app/core/routes/routes.ts +++ b/public/app/core/routes/routes.ts @@ -83,6 +83,11 @@ function setupAngularRoutes($routeProvider, $locationProvider) { controller : 'FolderPermissionsCtrl', controllerAs: 'ctrl', }) + .when('/dashboards/folder/:folderId/:type/:slug/settings', { + templateUrl: 'public/app/features/dashboard/partials/folder_settings.html', + controller : 'FolderSettingsCtrl', + controllerAs: 'ctrl', + }) .when('/dashboards/folder/:folderId/:type/:slug', { templateUrl: 'public/app/features/dashboard/partials/folder_dashboards.html', controller : 'FolderDashboardsCtrl', diff --git a/public/app/features/dashboard/all.ts b/public/app/features/dashboard/all.ts index e9ca2a854be..9e8d034eb21 100644 --- a/public/app/features/dashboard/all.ts +++ b/public/app/features/dashboard/all.ts @@ -32,11 +32,13 @@ import coreModule from 'app/core/core_module'; import {DashboardListCtrl} from './dashboard_list_ctrl'; import {FolderDashboardsCtrl} from './folder_dashboards_ctrl'; import {FolderPermissionsCtrl} from './folder_permissions_ctrl'; +import {FolderSettingsCtrl} from './folder_settings_ctrl'; import {DashboardImportCtrl} from './dashboard_import_ctrl'; import {CreateFolderCtrl} from './create_folder_ctrl'; coreModule.controller('DashboardListCtrl', DashboardListCtrl); coreModule.controller('FolderDashboardsCtrl', FolderDashboardsCtrl); coreModule.controller('FolderPermissionsCtrl', FolderPermissionsCtrl); +coreModule.controller('FolderSettingsCtrl', FolderSettingsCtrl); coreModule.controller('DashboardImportCtrl', DashboardImportCtrl); coreModule.controller('CreateFolderCtrl', CreateFolderCtrl); diff --git a/public/app/features/dashboard/folder_page_loader.ts b/public/app/features/dashboard/folder_page_loader.ts index 98ab8f2b431..570265d8bff 100644 --- a/public/app/features/dashboard/folder_page_loader.ts +++ b/public/app/features/dashboard/folder_page_loader.ts @@ -29,12 +29,19 @@ export class FolderPageLoader { id: 'manage-folder-permissions', text: 'Permissions', url: '/dashboards/permissions' + }, + { + active: activeChildId === 'manage-folder-settings', + icon: 'fa fa-fw fa-cog', + id: 'manage-folder-settings', + text: 'Settings', + url: '/dashboards/settings' } ] } }; - this.backendSrv.getDashboard(this.$routeParams.type, this.$routeParams.slug).then(result => { + return this.backendSrv.getDashboard(this.$routeParams.type, this.$routeParams.slug).then(result => { const folderTitle = result.dashboard.title; ctrl.navModel.main.text = ''; ctrl.navModel.main.breadcrumbs = [ @@ -42,13 +49,22 @@ export class FolderPageLoader { { title: folderTitle } ]; - const folderUrl = `/dashboards/folder/${folderId}/${result.meta.type}/${result.meta.slug}`; + const folderUrl = this.createFolderUrl(folderId, result.meta.type, result.meta.slug); const dashTab = _.find(ctrl.navModel.main.children, { id: 'manage-folder-dashboards' }); dashTab.url = folderUrl; const permTab = _.find(ctrl.navModel.main.children, { id: 'manage-folder-permissions' }); permTab.url = folderUrl + '/permissions'; + + const settingsTab = _.find(ctrl.navModel.main.children, { id: 'manage-folder-settings' }); + settingsTab.url = folderUrl + '/settings'; + + return result; }); } + + createFolderUrl(folderId: number, type: string, slug: string) { + return `/dashboards/folder/${folderId}/${type}/${slug}`; + } } diff --git a/public/app/features/dashboard/folder_settings_ctrl.ts b/public/app/features/dashboard/folder_settings_ctrl.ts new file mode 100644 index 00000000000..7d846f8ec60 --- /dev/null +++ b/public/app/features/dashboard/folder_settings_ctrl.ts @@ -0,0 +1,83 @@ +import {FolderPageLoader} from './folder_page_loader'; +import appEvents from 'app/core/app_events'; + +export class FolderSettingsCtrl { + folderPageLoader: FolderPageLoader; + navModel: any; + folderId: number; + canSave = false; + dashboard: any; + meta: any; + + /** @ngInject */ + constructor(private backendSrv, navModelSrv, private $routeParams, private $location) { + if (this.$routeParams.folderId && this.$routeParams.type && this.$routeParams.slug) { + this.folderId = $routeParams.folderId; + + this.folderPageLoader = new FolderPageLoader(this.backendSrv, this.$routeParams); + this.folderPageLoader.load(this, this.folderId, 'manage-folder-settings') + .then(result => { + this.dashboard = result.dashboard; + this.meta = result.meta; + this.canSave = result.meta.canSave; + }); + } + } + + save() { + return this.backendSrv.saveDashboard(this.dashboard, {overwrite: false}) + .then(result => { + var folderUrl = this.folderPageLoader.createFolderUrl(this.folderId, this.meta.type, result.slug); + if (folderUrl !== this.$location.path()) { + this.$location.url(folderUrl + '/settings'); + } + + appEvents.emit('dashboard-saved'); + appEvents.emit('alert-success', ['Folder saved']); + }) + .catch(this.handleSaveFolderError); + } + + delete(evt) { + if (evt) { + evt.stopPropagation(); + evt.preventDefault(); + } + + appEvents.emit('confirm-modal', { + title: 'Delete', + text: `Do you want to delete this folder and all its dashboards?`, + icon: 'fa-trash', + yesText: 'Delete', + onConfirm: () => { + return this.backendSrv.delete(`/api/dashboards/${this.meta.type}/${this.meta.slug}`).then(() => { + appEvents.emit('alert-success', ['Folder deleted']); + this.$location.url('/dashboards'); + }); + } + }); + } + + handleSaveFolderError(err) { + if (err.data && err.data.status === 'version-mismatch') { + err.isHandled = true; + + appEvents.emit('confirm-modal', { + title: 'Conflict', + text: 'Someone else has updated this folder.', + text2: 'Would you still like to save this folder?', + yesText: 'Save & Overwrite', + icon: 'fa-warning', + onConfirm: () => { + this.backendSrv.saveDashboard(this.dashboard, {overwrite: true}); + } + }); + } + + if (err.data && err.data.status === 'name-exists') { + err.isHandled = true; + + appEvents.emit('alert-error', ['A folder or dashboard with this name exists already.']); + } + } +} diff --git a/public/app/features/dashboard/partials/folder_settings.html b/public/app/features/dashboard/partials/folder_settings.html new file mode 100644 index 00000000000..3d04b292ce0 --- /dev/null +++ b/public/app/features/dashboard/partials/folder_settings.html @@ -0,0 +1,24 @@ + + +
+ +
+

Folder Settings

+
+
+ + +
+
+ + +
+
+
+
From a9ba7b912f5d80972693d2ea2a60384abcacfbae Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Wed, 13 Dec 2017 10:57:39 +0100 Subject: [PATCH 4/9] dashfolders: Minor css fixes for bulk edit --- public/sass/components/_dashboard_list.scss | 1 + public/sass/components/_switch.scss | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/public/sass/components/_dashboard_list.scss b/public/sass/components/_dashboard_list.scss index e1574f46da6..ad02d4c7e1c 100644 --- a/public/sass/components/_dashboard_list.scss +++ b/public/sass/components/_dashboard_list.scss @@ -24,4 +24,5 @@ .search-results-filter-row__filters-item { width: 150px; + margin-right: 0; } \ No newline at end of file diff --git a/public/sass/components/_switch.scss b/public/sass/components/_switch.scss index 3d0da7e4579..a81501b86fb 100644 --- a/public/sass/components/_switch.scss +++ b/public/sass/components/_switch.scss @@ -124,7 +124,7 @@ } .gf-form-switch--search-result__section { - min-width: 3.3rem; + min-width: 3.1rem; margin-right: -0.3rem; input + label { @@ -141,7 +141,7 @@ } .gf-form-switch--search-result-filter-row__checkbox { - min-width: 4.7rem; + min-width: 3.8rem; input + label { height: 2.5rem; From c6a02bec81313d5257185dddb23183e508a2278d Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Wed, 13 Dec 2017 11:08:28 +0100 Subject: [PATCH 5/9] dashfolders: Minor css fixes for bulk edit --- public/sass/components/_switch.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/sass/components/_switch.scss b/public/sass/components/_switch.scss index a81501b86fb..24db4c157ca 100644 --- a/public/sass/components/_switch.scss +++ b/public/sass/components/_switch.scss @@ -124,7 +124,7 @@ } .gf-form-switch--search-result__section { - min-width: 3.1rem; + min-width: 3.05rem; margin-right: -0.3rem; input + label { @@ -133,7 +133,7 @@ } .gf-form-switch--search-result__item { - min-width: 2.6rem; + min-width: 2.7rem; input + label { height: 2.7rem; @@ -141,7 +141,7 @@ } .gf-form-switch--search-result-filter-row__checkbox { - min-width: 3.8rem; + min-width: 3.75rem; input + label { height: 2.5rem; From 60e2ba111f0afe68869173e3382c36decbdf04c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 13 Dec 2017 11:12:09 +0100 Subject: [PATCH 6/9] plugins: fixed plugin edit page and plugin page --- .../core/components/PageHeader/PageHeader.tsx | 4 +- .../app/features/dashboard/dashnav/dashnav.ts | 5 +- .../features/dashboard/folder_page_loader.ts | 2 +- .../plugins/partials/plugin_edit.html | 125 +++++++++--------- .../plugins/partials/plugin_list.html | 37 ------ .../plugins/partials/plugin_page.html | 14 +- .../app/features/plugins/plugin_edit_ctrl.ts | 80 ++++++++--- .../app/features/plugins/plugin_page_ctrl.ts | 18 ++- 8 files changed, 147 insertions(+), 138 deletions(-) diff --git a/public/app/core/components/PageHeader/PageHeader.tsx b/public/app/core/components/PageHeader/PageHeader.tsx index 3ab6cac8143..5e736332ec2 100644 --- a/public/app/core/components/PageHeader/PageHeader.tsx +++ b/public/app/core/components/PageHeader/PageHeader.tsx @@ -76,8 +76,8 @@ export default class PageHeader extends React.Component { const breadcrumbsResult = []; for (let i = 0; i < breadcrumbs.length; i++) { const bc = breadcrumbs[i]; - if (bc.uri) { - breadcrumbsResult.push({bc.title}); + if (bc.url) { + breadcrumbsResult.push({bc.title}); } else { breadcrumbsResult.push( / {bc.title}); } diff --git a/public/app/features/dashboard/dashnav/dashnav.ts b/public/app/features/dashboard/dashnav/dashnav.ts index aed803efb9a..afb7155bb55 100644 --- a/public/app/features/dashboard/dashnav/dashnav.ts +++ b/public/app/features/dashboard/dashnav/dashnav.ts @@ -14,10 +14,7 @@ export class DashNavCtrl { private $rootScope, private dashboardSrv, private $location, - public playlistSrv, - navModelSrv) { - this.navModel = navModelSrv.getDashboardNav(this.dashboard, this); - + public playlistSrv) { appEvents.on('save-dashboard', this.saveDashboard.bind(this), $scope); if (this.dashboard.meta.isSnapshot) { diff --git a/public/app/features/dashboard/folder_page_loader.ts b/public/app/features/dashboard/folder_page_loader.ts index 570265d8bff..23917aac085 100644 --- a/public/app/features/dashboard/folder_page_loader.ts +++ b/public/app/features/dashboard/folder_page_loader.ts @@ -12,7 +12,7 @@ export class FolderPageLoader { url: '/fsdfds', text: '', breadcrumbs: [ - { title: 'Dashboards', uri: '/dashboards' }, + { title: 'Dashboards', url: '/dashboards' }, { title: ' ' }, ], children: [ diff --git a/public/app/features/plugins/partials/plugin_edit.html b/public/app/features/plugins/partials/plugin_edit.html index 9df2775cbb8..4b4628a3bf7 100644 --- a/public/app/features/plugins/partials/plugin_edit.html +++ b/public/app/features/plugins/partials/plugin_edit.html @@ -1,73 +1,68 @@ - +
+ -
-
- -
- -