<!DOCTYPE html>
<html>

  <head>
    <script data-require="jquery@3.1.1" data-semver="3.1.1" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script data-require="angular.js@1.6.6" data-semver="1.6.6" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
    <script src="app.js"></script>
  </head>

  <body ng-app="App">
    <h1>Hello Plunker!</h1>
    <div ng-controller="PageController as page">
      <button ng-click="page.open()">Open pane</button>
      <button ng-click="page.close('Closed from page')">Close pane</button>
    </div>
    <div pane></div>
  </body>

</html>
/* ************ */
/* Pane service */

class PaneService {
  
  constructor($rootScope) {
    console.log('pane service instantiated.', this);
    this.$rootScope = $rootScope;
  }
  
  open(template, scope) {
    this.$rootScope.$emit('OpenPane', template, scope);
  }
  
  close(message) {
    this.$rootScope.$emit('ClosePane', message);
  }
}
PaneService.$inject = ['$rootScope'];

/* ************************* */
/* Pane directive controller */

class PaneController {
  constructor($rootScope, $compile, $element) {
    console.log('pane directive instantiated.', this);
    this.$compile = $compile;
    this.$element = $element;
    $rootScope.$on('OpenPane', this.open.bind(this));
    $rootScope.$on('ClosePane', this.close.bind(this));
  }
  
  open(event, template, scope) {
    console.log('pane directive opening', template, scope);
    var t = this.$compile(template)(scope);
    this.$element.empty().append(t);
  }
  
  close(evet, message) {
    console.log('pane directive closing', message);
    this.$element.empty().append('<strong>' + message + '</strong>');
  }
}
PaneController.$inject = ['$rootScope', '$compile', '$element'];

var PaneDirective = {
  restrict: 'A',
  controller: PaneController,
  controllerAs: 'pane',
  bindToController: true
}

/* *************** */
/* Page controller */

class PageController {
  constructor(paneService, $scope) {
    console.log('page controller instantiated.', this);
    this.paneService = paneService;
    this.$scope = $scope;
  }
  
  open() {
    console.log('page controller open', this);
    this.paneService.open('<button ng-click="page.close(\'Closed from pane\')">Close from pane</button>', this.$scope);
  }
  
  close(message) {
    console.log('page controller close');
    this.paneService.close(message);
  }
}
PageController.$inject = ['paneService', '$scope'];

angular
  .module('App', [])
  .service('paneService', PaneService)
  .directive('pane', () => PaneDirective)
  .controller('PageController', PageController);
  
console.clear();