@@ -13,6 +13,7 @@ describe('$mdPanel', function() {
1313 var DEFAULT_CONFIG = { template : DEFAULT_TEMPLATE } ;
1414 var PANEL_ID_PREFIX = 'panel_' ;
1515 var SCROLL_MASK_CLASS = '.md-scroll-mask' ;
16+ var ADJUSTED_CLASS = '_md-panel-position-adjusted' ;
1617
1718 /**
1819 * @param {!angular.$injector } $injector
@@ -1261,6 +1262,7 @@ describe('$mdPanel', function() {
12611262 myButton = '<button>myButton</button>' ;
12621263 attachToBody ( myButton ) ;
12631264 myButton = angular . element ( document . querySelector ( 'button' ) ) ;
1265+ myButton . css ( 'margin' , '100px' ) ;
12641266 myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
12651267 } ) ;
12661268
@@ -1310,6 +1312,7 @@ describe('$mdPanel', function() {
13101312 expect ( panelRect . top ) . toBeApproximately ( myButtonRect . top ) ;
13111313 expect ( panelRect . left ) . toBeApproximately ( myButtonRect . left ) ;
13121314
1315+
13131316 var newPosition = $mdPanel . newPanelPosition ( )
13141317 . relativeTo ( myButton )
13151318 . addPanelPosition ( null , yPosition . ABOVE ) ;
@@ -1669,6 +1672,7 @@ describe('$mdPanel', function() {
16691672 myButton = '<button>myButton</button>' ;
16701673 attachToBody ( myButton ) ;
16711674 myButton = angular . element ( document . querySelector ( 'button' ) ) ;
1675+ myButton . css ( 'margin' , '100px' ) ;
16721676 myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
16731677
16741678 xPosition = $mdPanel . xPosition ;
@@ -1717,100 +1721,108 @@ describe('$mdPanel', function() {
17171721 expect ( panelCss . top ) . toBeApproximately ( myButtonRect . top ) ;
17181722 } ) ;
17191723
1720- it ( 'rejects offscreen position left of target element ', function ( ) {
1721- var position = mdPanelPosition
1722- . relativeTo ( myButton )
1723- . addPanelPosition ( xPosition . OFFSET_START , yPosition . ALIGN_TOPS )
1724- . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
1724+ describe ( 'fallback positions ', function ( ) {
1725+ beforeEach ( function ( ) {
1726+ myButton . css ( 'margin' , 0 ) ;
1727+ myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
1728+ } ) ;
17251729
1726- config [ 'position' ] = position ;
1730+ it ( 'rejects offscreen position left of target element' , function ( ) {
1731+ var position = mdPanelPosition
1732+ . relativeTo ( myButton )
1733+ . addPanelPosition ( xPosition . OFFSET_START , yPosition . ALIGN_TOPS )
1734+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
17271735
1728- openPanel ( config ) ;
1736+ config [ 'position' ] = position ;
1737+
1738+ openPanel ( config ) ;
1739+
1740+ expect ( position . getActualPosition ( ) ) . toEqual ( {
1741+ x : xPosition . ALIGN_START ,
1742+ y : yPosition . ALIGN_TOPS ,
1743+ } ) ;
17291744
1730- expect ( position . getActualPosition ( ) ) . toEqual ( {
1731- x : xPosition . ALIGN_START ,
1732- y : yPosition . ALIGN_TOPS ,
1745+ var panelCss = document . querySelector ( PANEL_EL ) . style ;
1746+ expect ( panelCss . left ) . toBeApproximately ( myButtonRect . left ) ;
1747+ expect ( panelCss . top ) . toBeApproximately ( myButtonRect . top ) ;
17331748 } ) ;
1734- var panelCss = document . querySelector ( PANEL_EL ) . style ;
1735- expect ( panelCss . left ) . toBeApproximately ( myButtonRect . left ) ;
1736- expect ( panelCss . top ) . toBeApproximately ( myButtonRect . top ) ;
1737- } ) ;
17381749
1739- it ( 'rejects offscreen position above target element' , function ( ) {
1740- var position = mdPanelPosition
1741- . relativeTo ( myButton )
1742- . addPanelPosition ( xPosition . ALIGN_START , yPosition . ABOVE )
1743- . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
1750+ it ( 'rejects offscreen position above target element' , function ( ) {
1751+ var position = mdPanelPosition
1752+ . relativeTo ( myButton )
1753+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ABOVE )
1754+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
17441755
1745- config [ 'position' ] = position ;
1756+ config [ 'position' ] = position ;
17461757
1747- openPanel ( config ) ;
1758+ openPanel ( config ) ;
17481759
1749- expect ( position . getActualPosition ( ) ) . toEqual ( {
1750- x : xPosition . ALIGN_START ,
1751- y : yPosition . ALIGN_TOPS ,
1760+ expect ( position . getActualPosition ( ) ) . toEqual ( {
1761+ x : xPosition . ALIGN_START ,
1762+ y : yPosition . ALIGN_TOPS ,
1763+ } ) ;
17521764 } ) ;
1753- } ) ;
17541765
1755- it ( 'rejects offscreen position below target element' , function ( ) {
1756- // reposition button at the bottom of the screen
1757- $rootEl [ 0 ] . style . height = "100%" ;
1758- myButton [ 0 ] . style . position = 'absolute' ;
1759- myButton [ 0 ] . style . bottom = '0px' ;
1760- myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
1766+ it ( 'rejects offscreen position below target element' , function ( ) {
1767+ // reposition button at the bottom of the screen
1768+ $rootEl [ 0 ] . style . height = "100%" ;
1769+ myButton [ 0 ] . style . position = 'absolute' ;
1770+ myButton [ 0 ] . style . bottom = '0px' ;
1771+ myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
17611772
1762- var position = mdPanelPosition
1763- . relativeTo ( myButton )
1764- . addPanelPosition ( xPosition . ALIGN_START , yPosition . BELOW )
1765- . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
1773+ var position = mdPanelPosition
1774+ . relativeTo ( myButton )
1775+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . BELOW )
1776+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
17661777
1767- config [ 'position' ] = position ;
1778+ config [ 'position' ] = position ;
17681779
1769- openPanel ( config ) ;
1780+ openPanel ( config ) ;
17701781
1771- expect ( position . getActualPosition ( ) ) . toEqual ( {
1772- x : xPosition . ALIGN_START ,
1773- y : yPosition . ALIGN_TOPS ,
1782+ expect ( position . getActualPosition ( ) ) . toEqual ( {
1783+ x : xPosition . ALIGN_START ,
1784+ y : yPosition . ALIGN_TOPS ,
1785+ } ) ;
17741786 } ) ;
1775- } ) ;
17761787
1777- it ( 'rejects offscreen position right of target element' , function ( ) {
1778- // reposition button at the bottom of the screen
1779- $rootEl [ 0 ] . style . width = "100%" ;
1780- myButton [ 0 ] . style . position = 'absolute' ;
1781- myButton [ 0 ] . style . right = '0px' ;
1782- myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
1788+ it ( 'rejects offscreen position right of target element' , function ( ) {
1789+ // reposition button at the bottom of the screen
1790+ $rootEl [ 0 ] . style . width = "100%" ;
1791+ myButton [ 0 ] . style . position = 'absolute' ;
1792+ myButton [ 0 ] . style . right = '0px' ;
1793+ myButtonRect = myButton [ 0 ] . getBoundingClientRect ( ) ;
17831794
1784- var position = mdPanelPosition
1785- . relativeTo ( myButton )
1786- . addPanelPosition ( xPosition . OFFSET_END , yPosition . ALIGN_TOPS )
1787- . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
1795+ var position = mdPanelPosition
1796+ . relativeTo ( myButton )
1797+ . addPanelPosition ( xPosition . OFFSET_END , yPosition . ALIGN_TOPS )
1798+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
17881799
1789- config [ 'position' ] = position ;
1800+ config [ 'position' ] = position ;
17901801
1791- openPanel ( config ) ;
1802+ openPanel ( config ) ;
17921803
1793- expect ( position . getActualPosition ( ) ) . toEqual ( {
1794- x : xPosition . ALIGN_START ,
1795- y : yPosition . ALIGN_TOPS ,
1804+ expect ( position . getActualPosition ( ) ) . toEqual ( {
1805+ x : xPosition . ALIGN_START ,
1806+ y : yPosition . ALIGN_TOPS ,
1807+ } ) ;
17961808 } ) ;
1797- } ) ;
17981809
1799- it ( 'should choose last position if none are on-screen' , function ( ) {
1800- var position = mdPanelPosition
1801- . relativeTo ( myButton )
1802- // off-screen to the left
1803- . addPanelPosition ( xPosition . OFFSET_START , yPosition . ALIGN_TOPS )
1804- // off-screen at the top
1805- . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
1810+ it ( 'should choose last position if none are on-screen' , function ( ) {
1811+ var position = mdPanelPosition
1812+ . relativeTo ( myButton )
1813+ // off-screen to the left
1814+ . addPanelPosition ( xPosition . OFFSET_START , yPosition . ALIGN_TOPS )
1815+ // off-screen at the top
1816+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
18061817
1807- config [ 'position' ] = position ;
1818+ config [ 'position' ] = position ;
18081819
1809- openPanel ( config ) ;
1820+ openPanel ( config ) ;
18101821
1811- expect ( position . getActualPosition ( ) ) . toEqual ( {
1812- x : xPosition . ALIGN_START ,
1813- y : yPosition . ALIGN_TOPS ,
1822+ expect ( position . getActualPosition ( ) ) . toEqual ( {
1823+ x : xPosition . ALIGN_START ,
1824+ y : yPosition . ALIGN_TOPS ,
1825+ } ) ;
18141826 } ) ;
18151827 } ) ;
18161828
@@ -1887,6 +1899,49 @@ describe('$mdPanel', function() {
18871899 . getBoundingClientRect ( ) ;
18881900 expect ( panelRect . top ) . toBeApproximately ( myButtonRect . bottom ) ;
18891901 } ) ;
1902+
1903+ it ( 'element outside the left boundry of the viewport' , function ( ) {
1904+ var position = mdPanelPosition
1905+ . relativeTo ( myButton )
1906+ . addPanelPosition ( xPosition . ALIGN_END , yPosition . ALIGN_TOPS ) ;
1907+
1908+ config [ 'position' ] = position ;
1909+
1910+ myButton . css ( {
1911+ position : 'absolute' ,
1912+ left : '-100px' ,
1913+ margin : 0
1914+ } ) ;
1915+
1916+ openPanel ( config ) ;
1917+
1918+ var panel = document . querySelector ( PANEL_EL ) ;
1919+
1920+ expect ( panel . offsetLeft ) . toBe ( $mdPanel . viewportMargin ) ;
1921+ expect ( panel ) . toHaveClass ( ADJUSTED_CLASS ) ;
1922+ } ) ;
1923+
1924+ it ( 'element outside the right boundry of the viewport' , function ( ) {
1925+ var position = mdPanelPosition
1926+ . relativeTo ( myButton )
1927+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ALIGN_TOPS ) ;
1928+
1929+ config [ 'position' ] = position ;
1930+
1931+ myButton . css ( {
1932+ position : 'absolute' ,
1933+ right : '-100px' ,
1934+ margin : 0
1935+ } ) ;
1936+
1937+ openPanel ( config ) ;
1938+
1939+ var panel = document . querySelector ( PANEL_EL ) ;
1940+ var panelRect = panel . getBoundingClientRect ( ) ;
1941+
1942+ expect ( panelRect . left + panelRect . width ) . toBeLessThan ( window . innerWidth ) ;
1943+ expect ( panel ) . toHaveClass ( ADJUSTED_CLASS ) ;
1944+ } ) ;
18901945 } ) ;
18911946
18921947 describe ( 'horizontally' , function ( ) {
@@ -1963,6 +2018,49 @@ describe('$mdPanel', function() {
19632018 expect ( panelRect . left ) . toBeApproximately ( myButtonRect . right ) ;
19642019 } ) ;
19652020
2021+ it ( 'element outside the top boundry of the viewport' , function ( ) {
2022+ var position = mdPanelPosition
2023+ . relativeTo ( myButton )
2024+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . ABOVE ) ;
2025+
2026+ config [ 'position' ] = position ;
2027+
2028+ myButton . css ( {
2029+ position : 'absolute' ,
2030+ top : 0 ,
2031+ margin : 0
2032+ } ) ;
2033+
2034+ openPanel ( config ) ;
2035+
2036+ var panel = document . querySelector ( PANEL_EL ) ;
2037+
2038+ expect ( panel . offsetTop ) . toBe ( $mdPanel . viewportMargin ) ;
2039+ expect ( panel ) . toHaveClass ( ADJUSTED_CLASS ) ;
2040+ } ) ;
2041+
2042+ it ( 'element outside the bottom boundry of the viewport' , function ( ) {
2043+ var position = mdPanelPosition
2044+ . relativeTo ( myButton )
2045+ . addPanelPosition ( xPosition . ALIGN_START , yPosition . BELOW ) ;
2046+
2047+ config [ 'position' ] = position ;
2048+
2049+ myButton . css ( {
2050+ position : 'absolute' ,
2051+ bottom : 0 ,
2052+ margin : 0
2053+ } ) ;
2054+
2055+ openPanel ( config ) ;
2056+
2057+ var panel = document . querySelector ( PANEL_EL ) ;
2058+ var panelRect = panel . getBoundingClientRect ( ) ;
2059+
2060+ expect ( panelRect . top + panelRect . height ) . toBeLessThan ( window . innerHeight ) ;
2061+ expect ( panel ) . toHaveClass ( ADJUSTED_CLASS ) ;
2062+ } ) ;
2063+
19662064 describe ( 'rtl' , function ( ) {
19672065 beforeEach ( function ( ) {
19682066 setRTL ( ) ;
0 commit comments