1 | import { applyCssTransform } from '@angular2-material/core';
|
2 | import { ConnectionPositionPair } from './connected-position';
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | export var ConnectedPositionStrategy = (function () {
|
11 | function ConnectedPositionStrategy(_connectedTo, _originPos, _overlayPos, _viewportRuler) {
|
12 | this._connectedTo = _connectedTo;
|
13 | this._originPos = _originPos;
|
14 | this._overlayPos = _overlayPos;
|
15 | this._viewportRuler = _viewportRuler;
|
16 |
|
17 |
|
18 | this._isRtl = false;
|
19 |
|
20 | this._preferredPositions = [];
|
21 | this._origin = this._connectedTo.nativeElement;
|
22 | this.withFallbackPosition(_originPos, _overlayPos);
|
23 | }
|
24 | Object.defineProperty(ConnectedPositionStrategy.prototype, "positions", {
|
25 | get: function () {
|
26 | return this._preferredPositions;
|
27 | },
|
28 | enumerable: true,
|
29 | configurable: true
|
30 | });
|
31 | |
32 |
|
33 |
|
34 |
|
35 |
|
36 | ConnectedPositionStrategy.prototype.apply = function (element) {
|
37 |
|
38 |
|
39 | var originRect = this._origin.getBoundingClientRect();
|
40 | var overlayRect = element.getBoundingClientRect();
|
41 |
|
42 | var viewportRect = this._viewportRuler.getViewportRect();
|
43 | var firstOverlayPoint = null;
|
44 |
|
45 |
|
46 | for (var _i = 0, _a = this._preferredPositions; _i < _a.length; _i++) {
|
47 | var pos = _a[_i];
|
48 |
|
49 |
|
50 | var originPoint = this._getOriginConnectionPoint(originRect, pos);
|
51 | var overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);
|
52 | firstOverlayPoint = firstOverlayPoint || overlayPoint;
|
53 |
|
54 | if (this._willOverlayFitWithinViewport(overlayPoint, overlayRect, viewportRect)) {
|
55 | this._setElementPosition(element, overlayPoint);
|
56 | return Promise.resolve(null);
|
57 | }
|
58 | }
|
59 |
|
60 |
|
61 | this._setElementPosition(element, firstOverlayPoint);
|
62 | return Promise.resolve(null);
|
63 | };
|
64 | ConnectedPositionStrategy.prototype.withFallbackPosition = function (originPos, overlayPos) {
|
65 | this._preferredPositions.push(new ConnectionPositionPair(originPos, overlayPos));
|
66 | return this;
|
67 | };
|
68 | |
69 |
|
70 |
|
71 |
|
72 | ConnectedPositionStrategy.prototype._getStartX = function (rect) {
|
73 | return this._isRtl ? rect.right : rect.left;
|
74 | };
|
75 | |
76 |
|
77 |
|
78 |
|
79 | ConnectedPositionStrategy.prototype._getEndX = function (rect) {
|
80 | return this._isRtl ? rect.left : rect.right;
|
81 | };
|
82 | |
83 |
|
84 |
|
85 |
|
86 |
|
87 | ConnectedPositionStrategy.prototype._getOriginConnectionPoint = function (originRect, pos) {
|
88 | var originStartX = this._getStartX(originRect);
|
89 | var originEndX = this._getEndX(originRect);
|
90 | var x;
|
91 | if (pos.originX == 'center') {
|
92 | x = originStartX + (originRect.width / 2);
|
93 | }
|
94 | else {
|
95 | x = pos.originX == 'start' ? originStartX : originEndX;
|
96 | }
|
97 | var y;
|
98 | if (pos.originY == 'center') {
|
99 | y = originRect.top + (originRect.height / 2);
|
100 | }
|
101 | else {
|
102 | y = pos.originY == 'top' ? originRect.top : originRect.bottom;
|
103 | }
|
104 | return { x: x, y: y };
|
105 | };
|
106 | |
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 | ConnectedPositionStrategy.prototype._getOverlayPoint = function (originPoint, overlayRect, pos) {
|
114 |
|
115 |
|
116 | var overlayStartX;
|
117 | if (pos.overlayX == 'center') {
|
118 | overlayStartX = -overlayRect.width / 2;
|
119 | }
|
120 | else {
|
121 | overlayStartX = pos.overlayX == 'start' ? 0 : -overlayRect.width;
|
122 | }
|
123 | var overlayStartY;
|
124 | if (pos.overlayY == 'center') {
|
125 | overlayStartY = -overlayRect.height / 2;
|
126 | }
|
127 | else {
|
128 | overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;
|
129 | }
|
130 | return {
|
131 | x: originPoint.x + overlayStartX,
|
132 | y: originPoint.y + overlayStartY
|
133 | };
|
134 | };
|
135 | |
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 | ConnectedPositionStrategy.prototype._willOverlayFitWithinViewport = function (overlayPoint, overlayRect, viewportRect) {
|
142 |
|
143 | return overlayPoint.x >= viewportRect.left &&
|
144 | overlayPoint.x + overlayRect.width <= viewportRect.right &&
|
145 | overlayPoint.y >= viewportRect.top &&
|
146 | overlayPoint.y + overlayRect.height <= viewportRect.bottom;
|
147 | };
|
148 | |
149 |
|
150 |
|
151 |
|
152 |
|
153 | ConnectedPositionStrategy.prototype._setElementPosition = function (element, overlayPoint) {
|
154 | var scrollPos = this._viewportRuler.getViewportScrollPosition();
|
155 | var x = overlayPoint.x + scrollPos.left;
|
156 | var y = overlayPoint.y + scrollPos.top;
|
157 |
|
158 |
|
159 | applyCssTransform(element, "translateX(" + x + "px) translateY(" + y + "px)");
|
160 | };
|
161 | return ConnectedPositionStrategy;
|
162 | }());
|
163 |
|
164 |
|