import coreModule from 'app/core/core_module';

const obj2string = obj => {
  return Object.keys(obj)
    .reduce((acc, curr) => acc.concat(curr + '=' + obj[curr]), [])
    .join();
};

export class GeneralTabCtrl {
  panelCtrl: any;

  /** @ngInject */
  constructor($scope) {
    this.panelCtrl = $scope.ctrl;

    const updatePanel = () => {
      console.log('panel.render()');
      this.panelCtrl.panel.render();
    };

    const generateValueFromPanel = scope => {
      const { panel } = scope.ctrl;
      const panelPropsToTrack = ['title', 'description', 'transparent', 'repeat', 'repeatDirection', 'minSpan'];
      const panelPropsString = panelPropsToTrack
        .map(prop => (panel[prop] && panel[prop].toString ? panel[prop].toString() : panel[prop]))
        .join();
      const panelLinks = panel.links;
      const panelLinksString = panelLinks.map(obj2string).join();
      return panelPropsString + panelLinksString;
    };

    $scope.$watch(generateValueFromPanel, updatePanel, true);
  }
}

/** @ngInject */
export function generalTab() {
  'use strict';
  return {
    restrict: 'E',
    templateUrl: 'public/app/features/panel/partials/general_tab.html',
    controller: GeneralTabCtrl,
  };
}

coreModule.directive('panelGeneralTab', generalTab);

import coreModule from 'app/core/core_module';

const obj2string = obj => {
  return Object.keys(obj)
    .reduce((acc, curr) => acc.concat(curr + '=' + obj[curr]), [])
    .join();
};

export class GeneralTabCtrl {
  panelCtrl: any;

  /** @ngInject */
  constructor($scope) {
    this.panelCtrl = $scope.ctrl;

    const updatePanel = () => {
      console.log('panel.render()');
      this.panelCtrl.panel.render();
    };

    const generateValueFromPanel = scope => {
      const { panel } = scope.ctrl;
      const panelPropsToTrack = ['title', 'description', 'transparent', 'repeat', 'repeatDirection', 'minSpan'];
      const panelPropsString = panelPropsToTrack
        .map(prop => prop + '=' + (panel[prop] && panel[prop].toString ? panel[prop].toString() : panel[prop]))
        .join();
      const panelLinks = panel.links;
      const panelLinksString = panelLinks.map(obj2string).join();
      return panelPropsString + panelLinksString;
    };

    $scope.$watch(generateValueFromPanel, updatePanel, true);
  }
}

/** @ngInject */
export function generalTab() {
  'use strict';
  return {
    restrict: 'E',
    templateUrl: 'public/app/features/panel/partials/general_tab.html',
    controller: GeneralTabCtrl,
  };
}

coreModule.directive('panelGeneralTab', generalTab);

Add prop key to panelPropsString to avoid a bug when changing another value and the render doesnt trigger
Add prop key to panelPropsString to avoid a bug when changing another value and the render doesnt trigger
