+
diff --git a/public/app/features/dashboard/row/row.ts b/public/app/features/dashboard/row/row.ts
index 1abea18fe8a..ad05865411e 100644
--- a/public/app/features/dashboard/row/row.ts
+++ b/public/app/features/dashboard/row/row.ts
@@ -26,21 +26,61 @@ export class DashRowCtrl {
}
onDrop(panelId, dropTarget) {
- var info = this.dashboard.getPanelInfoById(panelId);
- if (dropTarget) {
- var dropInfo = this.dashboard.getPanelInfoById(dropTarget.id);
- dropInfo.row.panels[dropInfo.index] = info.panel;
- info.row.panels[info.index] = dropTarget;
- var dragSpan = info.panel.span;
- info.panel.span = dropTarget.span;
- dropTarget.span = dragSpan;
+ var dragObject;
+
+ // if string it's a panel type
+ if (_.isString(panelId)) {
+ // setup new panel
+ dragObject = {
+ row: this.row,
+ panel: {
+ title: config.new_panel_title,
+ type: panelId,
+ id: this.dashboard.getNextPanelId(),
+ },
+ isNew: true,
+ };
} else {
- info.row.panels.splice(info.index, 1);
- info.panel.span = 12 - this.dashboard.rowSpan(this.row);
- this.row.panels.push(info.panel);
+ dragObject = this.dashboard.getPanelInfoById(panelId);
}
- this.$rootScope.$broadcast('render');
+ if (dropTarget) {
+ dropTarget = this.dashboard.getPanelInfoById(dropTarget.id);
+ // if draging new panel onto existing panel split it
+ if (dragObject.isNew) {
+ dragObject.panel.span = dropTarget.panel.span = dropTarget.panel.span/2;
+ // insert after
+ dropTarget.row.panels.splice(dropTarget.index+1, 0, dragObject.panel);
+ } else if (this.row === dragObject.row) {
+ // just move element
+ this.row.movePanel(dropTarget.index, dragObject.index);
+ } else {
+ // split drop target space
+ dragObject.panel.span = dropTarget.panel.span = dropTarget.panel.span/2;
+ // insert after
+ dropTarget.row.panels.splice(dropTarget.index+1, 0, dragObject.panel);
+ // remove from source row
+ dragObject.row.removePanel(dragObject.panel);
+ }
+ // dropInfo.row.panels[dropInfo.index] = info.panel;
+ // info.row.panels[info.index] = dropTarget;
+ // var dragSpan = info.panel.span;
+ // info.panel.span = dropTarget.span;
+ // dropTarget.span = dragSpan;
+ } else {
+ dragObject.panel.span = 12 - this.row.span;
+ this.row.panels.push(dragObject.panel);
+
+ // if not new remove from source row
+ if (!dragObject.isNew) {
+ dragObject.row.removePanel(dragObject.panel);
+ }
+ }
+
+ this.row.panelSpanChanged();
+ this.$timeout(() => {
+ this.$rootScope.$broadcast('render');
+ });
}
setHeight(height) {
@@ -216,16 +256,9 @@ coreModule.directive('panelDropZone', function($timeout) {
scope.$on("ANGULAR_DRAG_START", function() {
indrag = true;
updateState();
- // $timeout(function() {
- // var dropZoneSpan = 12 - scope.ctrl.dashboard.rowSpan(scope.ctrl.row);
- // if (dropZoneSpan > 0) {
- // showPanel(dropZoneSpan, 'Panel Drop Zone');
- // }
- // });
});
scope.$on("ANGULAR_DRAG_END", function() {
- console.log('drag end');
indrag = false;
updateState();
});
diff --git a/public/app/features/dashboard/row/row_model.ts b/public/app/features/dashboard/row/row_model.ts
index 5a023a9abae..d32a0c25259 100644
--- a/public/app/features/dashboard/row/row_model.ts
+++ b/public/app/features/dashboard/row/row_model.ts
@@ -22,7 +22,6 @@ export class DashboardRow {
};
constructor(private model) {
- console.log(model.isNew);
assignModelProperties(this, model, this.defaults);
this.events = new Emitter();
this.updateRowSpan();
@@ -63,6 +62,11 @@ export class DashboardRow {
this.panels[0].span = 4;
this.panels[1].span = 4;
panel.span = 4;
+ } else if (panelCount === 3) {
+ this.panels[0].span = 3;
+ this.panels[1].span = 3;
+ this.panels[2].span = 3;
+ panel.span = 3;
}
}
@@ -78,5 +82,9 @@ export class DashboardRow {
this.events.emit('panel-removed', panel);
this.panelSpanChanged();
}
+
+ movePanel(fromIndex, toIndex) {
+ this.panels.splice(toIndex, 0, this.panels.splice(fromIndex, 1)[0]);
+ }
}