Commit 3bcd596ed7fc33c6f71432408a61a08553f82318

Authored by Igor Kulikov
1 parent 4bbcffdf

Details sidenav backdrop support

... ... @@ -26,7 +26,7 @@ export default angular.module('thingsboard.directives.detailsSidenav', [])
26 26 .name;
27 27
28 28 /*@ngInject*/
29   -function DetailsSidenav($timeout, $window) {
  29 +function DetailsSidenav($timeout, $mdUtil, $q, $animate) {
30 30
31 31 var linker = function (scope, element, attrs) {
32 32
... ... @@ -42,22 +42,62 @@ function DetailsSidenav($timeout, $window) {
42 42 scope.isEdit = true;
43 43 }
44 44
45   - if (angular.isDefined(attrs.closeOnClickOutside && attrs.closeOnClickOutside)) {
46   - scope.closeOnClickOutside = true;
47   - var clickOutsideHandler = function() {
48   - scope.closeDetails();
49   - };
50   - angular.element($window).click(clickOutsideHandler);
51   - scope.$on("$destroy", function () {
52   - angular.element($window).unbind('click', clickOutsideHandler);
  45 + var backdrop;
  46 + var previousContainerStyles;
  47 +
  48 + if (attrs.hasOwnProperty('tbEnableBackdrop')) {
  49 + backdrop = $mdUtil.createBackdrop(scope, "md-sidenav-backdrop md-opaque ng-enter");
  50 + element.on('$destroy', function() {
  51 + backdrop && backdrop.remove();
  52 + });
  53 + scope.$on('$destroy', function(){
  54 + backdrop && backdrop.remove();
  55 + });
  56 + scope.$watch('isOpen', updateIsOpen);
  57 + }
  58 +
  59 + function updateIsOpen(isOpen) {
  60 + backdrop[isOpen ? 'on' : 'off']('click', (ev)=>{
  61 + ev.preventDefault();
  62 + scope.isOpen = false;
  63 + scope.$apply();
  64 + });
  65 + var parent = element.parent();
  66 + var restorePositioning = updateContainerPositions(parent, isOpen);
  67 +
  68 + return $q.all([
  69 + isOpen && backdrop ? $animate.enter(backdrop, parent) : backdrop ?
  70 + $animate.leave(backdrop) : $q.when(true)
  71 + ]).then(function() {
  72 + restorePositioning && restorePositioning();
53 73 });
54 74 }
55 75
56   - scope.onClick = function($event) {
57   - if (scope.closeOnClickOutside) {
58   - $event.stopPropagation();
  76 + function updateContainerPositions(parent, willOpen) {
  77 + var drawerEl = element[0];
  78 + var scrollTop = parent[0].scrollTop;
  79 + if (willOpen && scrollTop) {
  80 + previousContainerStyles = {
  81 + top: drawerEl.style.top,
  82 + bottom: drawerEl.style.bottom,
  83 + height: drawerEl.style.height
  84 + };
  85 + var positionStyle = {
  86 + top: scrollTop + 'px',
  87 + bottom: 'auto',
  88 + height: parent[0].clientHeight + 'px'
  89 + };
  90 + backdrop.css(positionStyle);
59 91 }
60   - };
  92 + if (!willOpen && previousContainerStyles) {
  93 + return function() {
  94 + backdrop[0].style.top = null;
  95 + backdrop[0].style.bottom = null;
  96 + backdrop[0].style.height = null;
  97 + previousContainerStyles = null;
  98 + };
  99 + }
  100 + }
61 101
62 102 scope.toggleDetailsEditMode = function () {
63 103 if (!scope.isAlwaysEdit) {
... ...
... ... @@ -16,10 +16,9 @@
16 16
17 17 -->
18 18 <md-sidenav class="md-sidenav-right md-whiteframe-4dp tb-sidenav-details"
19   - md-disable-backdrop="true"
  19 + md-disable-backdrop
20 20 md-is-open="isOpen"
21 21 md-component-id="right"
22   - ng-click="onClick($event)"
23 22 layout="column">
24 23 <header>
25 24 <md-toolbar class="md-theme-light" ng-style="{'height':headerHeightPx+'px'}">
... ...
... ... @@ -69,7 +69,7 @@
69 69 + ' - ' + vm.editingRuleNode.component.name}}"
70 70 is-read-only="vm.selectedRuleNodeTabIndex > 0"
71 71 is-open="vm.isEditingRuleNode"
72   - close-on-click-outside="true"
  72 + tb-enable-backdrop
73 73 is-always-edit="true"
74 74 on-close-details="vm.onEditRuleNodeClosed()"
75 75 on-toggle-details-edit-mode="vm.onRevertRuleNodeEdit(vm.ruleNodeForm)"
... ... @@ -108,7 +108,7 @@
108 108 header-subtitle="{{'rulenode.link-details' | translate}}"
109 109 is-read-only="false"
110 110 is-open="vm.isEditingRuleNodeLink"
111   - close-on-click-outside="true"
  111 + tb-enable-backdrop
112 112 is-always-edit="true"
113 113 on-close-details="vm.onEditRuleNodeLinkClosed()"
114 114 on-toggle-details-edit-mode="vm.onRevertRuleNodeLinkEdit(vm.ruleNodeLinkForm)"
... ...