WordPress/wp-admin/js/editor-expand.min.js
Andrew Ozz 61292620c5 Editor scrolling:
- Pin the TinyMCE statusbar (elements path) to the bottom.
- Add support for pinning the menu when present.
- Add borders from CSS.
- Optimize getting most elements outerHeight.
Part props avryl, fixes #29293, see #28328.
Built from https://develop.svn.wordpress.org/trunk@29579


git-svn-id: http://core.svn.wordpress.org/trunk@29353 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-08-24 05:11:16 +00:00

1 line
7.3 KiB
JavaScript

window.wp=window.wp||{},jQuery(document).ready(function(a){function b(){var a=m.width();P={windowHeight:m.height(),windowWidth:a,adminBarHeight:a>600?o.outerHeight():0,toolsHeight:s.outerHeight()||0,menuBarHeight:z.outerHeight()||0,visualTopHeight:t.outerHeight()||0,textTopHeight:v.outerHeight()||0,bottomHeight:y.outerHeight()||0,statusBarHeight:A.outerHeight()||0,sideSortablesHeight:B.height()||0}}function c(a){var b,c,d,e,f,g=jQuery.ui.keyCode,h=a.keyCode,i=document.createRange(),j=w[0].selectionStart,k=w[0].selectionEnd,l=x[0].firstChild,m=10;if(!j||!k||j===k){try{i.setStart(l,j),i.setEnd(l,k+1)}catch(n){}b=i.getBoundingClientRect(),b.height&&(c=b.top-m,d=c+b.height+m,e=P.adminBarHeight+P.toolsHeight+P.textTopHeight,f=P.windowHeight-P.bottomHeight,e>c&&(h===g.UP||h===g.LEFT||h===g.BACKSPACE)?window.scrollTo(window.pageXOffset,c+window.pageYOffset-e):d>f&&window.scrollTo(window.pageXOffset,d+window.pageYOffset-f))}}function d(){if(!k||k.isHidden()){var a,b=w.height();x.width(w.width()-22),x.text(w.val()+"&nbsp;"),a=x.height(),O>a&&(a=O),a!==b&&(w.height(a),e())}}function e(a){if(!E||!E.settings.visible){var c,d,e,f,g,h,i,j,l,o=m.scrollTop(),q="scroll"!==a,F=k&&!k.isHidden(),G=O,M=D.offset().top,Q=1,R=r.width();(q||!P.windowHeight)&&b(),F?(c=t,d=u,i=P.visualTopHeight):(c=v,d=w,i=P.textTopHeight),h=c.parent().offset().top,j=d.offset().top,l=d.outerHeight(),g=F?O+i:O+20,g=l>g+5,g?((!H||q)&&o>=h-P.toolsHeight-P.adminBarHeight&&o<=h-P.toolsHeight-P.adminBarHeight+l-G?(H=!0,s.css({position:"fixed",top:P.adminBarHeight,width:R}),F&&z.length&&z.css({position:"fixed",top:P.adminBarHeight+P.toolsHeight,width:R-2*Q-(F?0:c.outerWidth()-c.width())}),c.css({position:"fixed",top:P.adminBarHeight+P.toolsHeight+P.menuBarHeight,width:R-2*Q-(F?0:c.outerWidth()-c.width())})):(H||q)&&(o<=h-P.toolsHeight-P.adminBarHeight?(H=!1,s.css({position:"absolute",top:0,width:R}),F&&z.length&&z.css({position:"absolute",top:0,width:R-2*Q}),c.css({position:"absolute",top:P.menuBarHeight,width:R-2*Q-(F?0:c.outerWidth()-c.width())})):o>=h-P.toolsHeight-P.adminBarHeight+l-G&&(H=!1,s.css({position:"absolute",top:l-G,width:R}),F&&z.length&&z.css({position:"absolute",top:l-G,width:R-2*Q}),c.css({position:"absolute",top:l-G+P.menuBarHeight,width:R-2*Q-(F?0:c.outerWidth()-c.width())}))),(!I||q)&&o+P.windowHeight<=j+l+P.bottomHeight+P.statusBarHeight+Q?(I=!0,A.css({position:"fixed",bottom:P.bottomHeight,width:R-2*Q}),y.css({position:"fixed",bottom:0,width:R})):(I||q)&&o+P.windowHeight>j+l+P.bottomHeight+P.statusBarHeight-Q&&(I=!1,A.add(y).attr("style",""))):q&&(s.css({position:"absolute",top:0,width:R}),F&&z.length&&z.css({position:"absolute",top:0,width:R-2*Q}),c.css({position:"absolute",top:P.menuBarHeight,width:R-2*Q-(F?0:c.outerWidth()-c.width())}),A.add(y).attr("style","")),C.width()<300&&P.windowWidth>600&&n.height()>B.height()+M+120&&P.windowHeight<l?(P.sideSortablesHeight>P.windowHeight||J||K?M>=o+N?(B.attr("style",""),J=K=!1):o>L?J?(J=!1,e=B.offset().top-P.adminBarHeight,f=p.offset().top,f<e+P.sideSortablesHeight+20&&(e=f-P.sideSortablesHeight-20),B.css({position:"absolute",top:e,bottom:""})):!K&&P.sideSortablesHeight+B.offset().top+20<o+P.windowHeight&&(K=!0,B.css({position:"fixed",top:"auto",bottom:"20px"})):L>o&&(K?(K=!1,e=B.offset().top-20,f=p.offset().top,f<e+P.sideSortablesHeight+20&&(e=f-P.sideSortablesHeight-20),B.css({position:"absolute",top:e,bottom:""})):!J&&B.offset().top>=o+N&&(J=!0,B.css({position:"fixed",top:N,bottom:""}))):(o>=M-N?B.css({position:"fixed",top:N}):B.attr("style",""),J=K=!1),L=o):(B.attr("style",""),J=K=!1),q&&(r.css({paddingTop:P.toolsHeight}),F?u.css({paddingTop:P.visualTopHeight+P.menuBarHeight}):(w.css({marginTop:P.textTopHeight}),x.width(R-20-2*Q)))}}function f(){d(),e()}function g(a){for(var b=1;6>b;b++)setTimeout(a,500*b)}function h(){clearTimeout(l),l=setTimeout(e,100)}function i(){window.pageYOffset&&window.pageYOffset>M&&window.scrollTo(window.pageXOffset,0),q.addClass("wp-editor-expand"),m.on("scroll.editor-expand resize.editor-expand",function(a){e(a.type),h()}),n.on("wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand",e).on("postbox-toggled.editor-expand",function(){!J&&!K&&window.pageYOffset>20&&(K=!0,window.scrollBy(0,-1),e(),window.scrollBy(0,1)),e()}),w.on("focus.editor-expand input.editor-expand propertychange.editor-expand",d),w.on("keyup.editor-expand",c),F(),E&&E.pubsub.subscribe("hidden",f),k&&(k.settings.wp_autoresize_on=!0,k.execCommand("wpAutoResizeOn"),k.isHidden()||k.execCommand("wpAutoResize")),(!k||k.isHidden())&&d(),e()}function j(){var b=window.getUserSetting("ed_size");window.pageYOffset&&window.pageYOffset>M&&window.scrollTo(window.pageXOffset,0),q.removeClass("wp-editor-expand"),m.off(".editor-expand"),n.off(".editor-expand"),w.off(".editor-expand"),G(),E&&E.pubsub.unsubscribe("hidden",f),a.each([t,v,s,z,y,A,r,u,w,B],function(a,b){b&&b.attr("style","")}),H=I=J=K=!1,k&&(k.settings.wp_autoresize_on=!1,k.execCommand("wpAutoResizeOff"),k.isHidden()||(w.hide(),b&&k.theme.resizeTo(null,b))),b&&w.height(b)}var k,l,m=a(window),n=a(document),o=a("#wpadminbar"),p=a("#wpfooter"),q=a("#postdivrich"),r=a("#wp-content-wrap"),s=a("#wp-content-editor-tools"),t=a(),u=a(),v=a("#ed_toolbar"),w=a("#content"),x=a('<div id="content-textarea-clone"></div>'),y=a("#post-status-info"),z=a(),A=a(),B=a("#side-sortables"),C=a("#postbox-container-1"),D=a("#post-body"),E=window.wp.editor&&window.wp.editor.fullscreen,F=function(){},G=function(){},H=!1,I=!1,J=!1,K=!1,L=0,M=130,N=56,O=300,P={windowHeight:0,windowWidth:0,adminBarHeight:0,toolsHeight:0,menuBarHeight:0,visualTopHeight:0,textTopHeight:0,bottomHeight:0,statusBarHeight:0,sideSortablesHeight:0};x.insertAfter(w),x.css({"font-family":w.css("font-family"),"font-size":w.css("font-size"),"line-height":w.css("line-height"),"white-space":"pre-wrap","word-wrap":"break-word"}),n.on("tinymce-editor-init.editor-expand",function(a,b){function c(){var a,c,d=b.selection.getNode();return c=b.plugins.wpview&&(a=b.plugins.wpview.getView(d))?a.getBoundingClientRect():d.getBoundingClientRect(),c.height?c:!1}function f(a){var d,e,f,g,h=tinymce.util.VK,i=a.keyCode,j=c(),k=10;j&&(d=j.top+b.iframeElement.getBoundingClientRect().top,e=d+j.height,d-=k,e+=k,f=P.adminBarHeight+P.toolsHeight+P.menuBarHeight+P.visualTopHeight,g=P.windowHeight-P.bottomHeight-P.statusBarHeight,g-f<j.height||(f>d&&(i===h.UP||i===h.LEFT||i===h.BACKSPACE)?window.scrollTo(window.pageXOffset,d+window.pageYOffset-f):e>g&&window.scrollTo(window.pageXOffset,e+window.pageYOffset-g)))}function h(){setTimeout(function(){b.execCommand("wpAutoResize"),e()},300)}function i(){d(),e()}"content"===b.id&&(k=b,b.settings.autoresize_min_height=O,t=r.find(".mce-toolbar-grp"),u=r.find(".mce-edit-area"),A=r.find(".mce-statusbar"),z=r.find(".mce-menubar"),F=function(){b.on("keyup",f),b.on("show",h),b.on("hide",i),b.on("setcontent wp-autoresize wp-toolbar-toggle",e)},G=function(){b.off("keyup",f),b.off("show",h),b.off("hide",i),b.off("setcontent wp-autoresize wp-toolbar-toggle",e)},q.hasClass("wp-editor-expand")&&(F(),g(e)))}),q.hasClass("wp-editor-expand")&&(i(),r.hasClass("html-active")&&g(function(){e(),d()})),a("#adv-settings .editor-expand").show(),a("#editor-expand-toggle").on("change.editor-expand",function(){a(this).prop("checked")?(i(),window.setUserSetting("editor_expand","on")):(j(),window.setUserSetting("editor_expand","off"))}),window.editorExpand={on:i,off:j}});