| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- ///<reference path="../../../headers/common.d.ts" />
- import _ from 'lodash';
- import $ from 'jquery';
- import angular from 'angular';
- import config from 'app/core/config';
- import {coreModule} from 'app/core/core';
- import './options';
- import './add_panel';
- export class DashRowCtrl {
- dashboard: any;
- row: any;
- dropView: number;
- /** @ngInject */
- constructor(private $scope, private $rootScope, private $timeout, private uiSegmentSrv, private $q) {
- this.row.title = this.row.title || 'Row title';
- if (this.dashboard.meta.isNew) {
- this.dropView = 1;
- delete this.row.isNew;
- }
- }
- 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;
- } else {
- info.row.panels.splice(info.index, 1);
- info.panel.span = 12 - this.dashboard.rowSpan(this.row);
- this.row.panels.push(info.panel);
- }
- this.$rootScope.$broadcast('render');
- }
- setHeight(height) {
- this.row.height = height;
- this.$scope.$broadcast('render');
- }
- moveRow(direction) {
- var rowsList = this.dashboard.rows;
- var rowIndex = _.indexOf(rowsList, this.row);
- var newIndex = rowIndex;
- switch (direction) {
- case 'up': {
- newIndex = rowIndex - 1;
- break;
- }
- case 'down': {
- newIndex = rowIndex + 1;
- break;
- }
- case 'top': {
- newIndex = 0;
- break;
- }
- case 'bottom': {
- newIndex = rowsList.length - 1;
- break;
- }
- default: {
- newIndex = rowIndex;
- }
- }
- if (newIndex >= 0 && newIndex <= (rowsList.length - 1)) {
- _.move(rowsList, rowIndex, newIndex);
- }
- }
- toggleCollapse() {
- this.dropView = 0;
- this.row.collapse = !this.row.collapse;
- }
- showAddPanel() {
- this.row.collapse = false;
- this.dropView = this.dropView === 1 ? 0 : 1;
- }
- showRowOptions() {
- this.dropView = this.dropView === 2 ? 0 : 2;
- }
- }
- export function rowDirective($rootScope) {
- return {
- restrict: 'E',
- templateUrl: 'public/app/features/dashboard/row/row.html',
- controller: DashRowCtrl,
- bindToController: true,
- controllerAs: 'ctrl',
- scope: {
- dashboard: "=",
- row: "=",
- },
- link: function(scope, element) {
- scope.$watchGroup(['ctrl.row.collapse', 'ctrl.row.height'], function() {
- element.find('.panels-wrapper').css({minHeight: scope.ctrl.row.collapse ? '5px' : scope.ctrl.row.height});
- });
- $rootScope.onAppEvent('panel-fullscreen-enter', function(evt, info) {
- var hasPanel = _.find(scope.ctrl.row.panels, {id: info.panelId});
- if (!hasPanel) {
- element.hide();
- }
- }, scope);
- $rootScope.onAppEvent('panel-fullscreen-exit', function() {
- element.show();
- }, scope);
- }
- };
- }
- coreModule.directive('dashRow', rowDirective);
- coreModule.directive('panelWidth', function($rootScope) {
- return function(scope, element) {
- var fullscreen = false;
- function updateWidth() {
- if (!fullscreen) {
- element[0].style.width = ((scope.panel.span / 1.2) * 10) + '%';
- }
- }
- $rootScope.onAppEvent('panel-fullscreen-enter', function(evt, info) {
- fullscreen = true;
- if (scope.panel.id !== info.panelId) {
- element.hide();
- } else {
- element[0].style.width = '100%';
- }
- }, scope);
- $rootScope.onAppEvent('panel-fullscreen-exit', function(evt, info) {
- fullscreen = false;
- if (scope.panel.id !== info.panelId) {
- element.show();
- }
- updateWidth();
- }, scope);
- scope.$watch('panel.span', updateWidth);
- if (fullscreen) {
- element.hide();
- }
- };
- });
- coreModule.directive('panelDropZone', function($timeout) {
- return function(scope, element) {
- var row = scope.ctrl.row;
- var indrag = false;
- var textEl = element.find('.panel-drop-zone-text');
- function showPanel(span, text) {
- element.find('.panel-container').css('height', row.height);
- element[0].style.width = ((span / 1.2) * 10) + '%';
- textEl.text(text);
- element.show();
- }
- function hidePanel() {
- element.hide();
- // element.removeClass('panel-drop-zone--empty');
- }
- function updateState() {
- if (scope.ctrl.dashboard.editMode) {
- if (row.panels.length === 0 && indrag === false) {
- return showPanel(12, 'Empty Space');
- }
- var dropZoneSpan = 12 - scope.ctrl.dashboard.rowSpan(scope.ctrl.row);
- if (dropZoneSpan > 1) {
- if (indrag) {
- return showPanel(dropZoneSpan, 'Drop Here');
- } else {
- return showPanel(dropZoneSpan, 'Empty Space');
- }
- }
- }
- if (indrag === true) {
- return showPanel(dropZoneSpan, 'Drop Here');
- }
- hidePanel();
- }
- scope.row.events.on('panel-added', updateState);
- scope.row.events.on('span-changed', updateState);
- scope.$watchGroup(['ctrl.row.panels.length', 'ctrl.dashboard.editMode', 'ctrl.row.span'], updateState);
- 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() {
- indrag = false;
- updateState();
- });
- };
- });
|