From 9757c65687e71de50902f4dc6d04415420027647 Mon Sep 17 00:00:00 2001 From: Mathew May Date: Tue, 12 Mar 2019 11:09:06 +0800 Subject: [PATCH] MDL-64506 Javascript: Remove docking JS. Deprecate related lang strings & base functions now return false. --- blocks/moodleblock.class.php | 7 +- config-dist.php | 2 - lang/en/block.php | 14 +- lang/en/deprecated.txt | 6 + lib/blocklib.php | 45 +- lib/outputlib.php | 2 +- .../moodle-core-dock-loader-debug.js | Bin 4116 -> 0 bytes .../moodle-core-dock-loader-min.js | Bin 1801 -> 0 bytes .../moodle-core-dock-loader.js | Bin 3844 -> 0 bytes .../moodle-core-dock-debug.js | Bin 71523 -> 0 bytes .../moodle-core-dock/moodle-core-dock-min.js | Bin 23558 -> 0 bytes .../moodle-core-dock/moodle-core-dock.js | Bin 69753 -> 0 bytes lib/yui/src/dock/build.json | 20 - lib/yui/src/dock/js/actionkey.js | 121 -- lib/yui/src/dock/js/block.js | 246 ---- lib/yui/src/dock/js/dock.js | 1158 ----------------- lib/yui/src/dock/js/dockeditem.js | 324 ----- lib/yui/src/dock/js/loader.js | 113 -- lib/yui/src/dock/js/panel.js | 238 ---- lib/yui/src/dock/js/tabheightmanager.js | 121 -- lib/yui/src/dock/meta/dock.json | 19 - 21 files changed, 24 insertions(+), 2412 deletions(-) delete mode 100644 lib/yui/build/moodle-core-dock-loader/moodle-core-dock-loader-debug.js delete mode 100644 lib/yui/build/moodle-core-dock-loader/moodle-core-dock-loader-min.js delete mode 100644 lib/yui/build/moodle-core-dock-loader/moodle-core-dock-loader.js delete mode 100644 lib/yui/build/moodle-core-dock/moodle-core-dock-debug.js delete mode 100644 lib/yui/build/moodle-core-dock/moodle-core-dock-min.js delete mode 100644 lib/yui/build/moodle-core-dock/moodle-core-dock.js delete mode 100644 lib/yui/src/dock/build.json delete mode 100644 lib/yui/src/dock/js/actionkey.js delete mode 100644 lib/yui/src/dock/js/block.js delete mode 100644 lib/yui/src/dock/js/dock.js delete mode 100644 lib/yui/src/dock/js/dockeditem.js delete mode 100644 lib/yui/src/dock/js/loader.js delete mode 100644 lib/yui/src/dock/js/panel.js delete mode 100644 lib/yui/src/dock/js/tabheightmanager.js delete mode 100644 lib/yui/src/dock/meta/dock.json diff --git a/blocks/moodleblock.class.php b/blocks/moodleblock.class.php index c1e8aca0a41..9c58f63d3d4 100644 --- a/blocks/moodleblock.class.php +++ b/blocks/moodleblock.class.php @@ -462,11 +462,10 @@ class block_base { * Allows the block to load any JS it requires into the page. * * By default this function simply permits the user to dock the block if it is dockable. + * + * Left null as of MDL-64506. */ function get_required_javascript() { - if ($this->instance_can_be_docked() && !$this->hide_header()) { - user_preference_allow_ajax_update('docked_block_instance_'.$this->instance->id, PARAM_INT); - } } /** @@ -651,6 +650,8 @@ class block_base { * Can be overridden by the block to prevent the block from being dockable. * * @return bool + * + * Return false as per MDL-64506 */ public function instance_can_be_docked() { return false; diff --git a/config-dist.php b/config-dist.php index 9e570628bc8..201a907819e 100644 --- a/config-dist.php +++ b/config-dist.php @@ -643,11 +643,9 @@ $CFG->admin = 'admin'; // http://yuilibrary.com/yui/docs/api/classes/config.html#property_logInclude // http://yuilibrary.com/yui/docs/api/classes/config.html#property_logExclude // $CFG->yuiloginclude = array( -// 'moodle-core-dock-loader' => true, // 'moodle-course-categoryexpander' => true, // ); // $CFG->yuilogexclude = array( -// 'moodle-core-dock' => true, // 'moodle-core-notification' => true, // ); // diff --git a/lang/en/block.php b/lang/en/block.php index 806aa160536..4c4307fde2e 100644 --- a/lang/en/block.php +++ b/lang/en/block.php @@ -22,7 +22,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['addtodock'] = 'Move this to the dock'; $string['anypagematchingtheabove'] = 'Any page matching the above'; $string['appearsinsubcontexts'] = 'Appears in sub-contexts'; $string['assignrolesinblock'] = 'Assign roles in {$a} block'; @@ -43,9 +42,7 @@ $string['deletecheck'] = 'Delete {$a} block?'; $string['deleteblock'] = 'Delete {$a} block'; $string['deleteblockcheck'] = 'Are you sure that you want to delete this block titled {$a}?'; $string['deleteblockwarning'] = '

You are about to delete a block that appears elsewhere.

Original block location: {$a->location}
Display on page types: {$a->pagetype}

Are you sure you want to continue?

'; -$string['dockblock'] = 'Dock {$a} block'; $string['hideblock'] = 'Hide {$a} block'; -$string['hidedockpanel'] = 'Hide the dock panel'; $string['hidepanel'] = 'Hide panel'; $string['moveblock'] = 'Move {$a} block'; $string['moveblockafter'] = 'Move block to after {$a} block'; @@ -71,9 +68,14 @@ $string['site-*'] = 'Any top-level site page'; $string['subpages'] = 'Select pages'; $string['restrictpagetypes'] = 'Display on page types'; $string['thisspecificpage'] = 'This specific page'; -$string['undockall'] = 'Undock all'; -$string['undockblock'] = 'Undock {$a} block'; -$string['undockitem'] = 'Undock this item'; $string['visible'] = 'Visible'; $string['weight'] = 'Weight'; $string['wherethisblockappears'] = 'Where this block appears'; + +// Deprecated since Moodle 3.7. +$string['addtodock'] = 'Move this to the dock'; +$string['dockblock'] = 'Dock {$a} block'; +$string['hidedockpanel'] = 'Hide the dock panel'; +$string['undockall'] = 'Undock all'; +$string['undockblock'] = 'Undock {$a} block'; +$string['undockitem'] = 'Undock this item'; \ No newline at end of file diff --git a/lang/en/deprecated.txt b/lang/en/deprecated.txt index 951f2575634..2243db866db 100644 --- a/lang/en/deprecated.txt +++ b/lang/en/deprecated.txt @@ -147,3 +147,9 @@ outputdisabled,core_message outputdoesnotexist,core_message outputenabled,core_message outputnotconfigured,core_message +addtodock,core_block +dockblock,core_block +hidedockpanel,core_block +undockall,core_block +undockblock,core_block +undockitem,core_block diff --git a/lib/blocklib.php b/lib/blocklib.php index 07ba246ba1b..3c428ba428f 100644 --- a/lib/blocklib.php +++ b/lib/blocklib.php @@ -596,36 +596,11 @@ class block_manager { * @see region_uses_dock * @param string $region * @return bool True if all of the blocks within that region are docked + * + * Return false as from MDL-64506 */ public function region_completely_docked($region, $output) { - global $CFG; - // If theme doesn't allow docking or allowblockstodock is not set, then return. - if (!$this->page->theme->enable_dock || empty($CFG->allowblockstodock)) { - return false; - } - - // Do not dock the region when the user attemps to move a block. - if ($this->movingblock) { - return false; - } - - // Block regions should not be docked during editing when all the blocks are hidden. - if ($this->page->user_is_editing() && $this->page->user_can_edit_blocks()) { - return false; - } - - $this->check_is_loaded(); - $this->ensure_content_created($region, $output); - if (!$this->region_has_content($region, $output)) { - // If the region has no content then nothing is docked at all of course. - return false; - } - foreach ($this->visibleblockcontent[$region] as $instance) { - if (!get_user_preferences('docked_block_instance_'.$instance->blockinstanceid, 0)) { - return false; - } - } - return true; + return false; } /** @@ -634,20 +609,10 @@ class block_manager { * @see region_completely_docked * @param array|string $regions array of regions (or single region) * @return bool True if any of the blocks within that region are docked + * + * Return false as from MDL-64506 */ public function region_uses_dock($regions, $output) { - if (!$this->page->theme->enable_dock) { - return false; - } - $this->check_is_loaded(); - foreach((array)$regions as $region) { - $this->ensure_content_created($region, $output); - foreach($this->visibleblockcontent[$region] as $instance) { - if(!empty($instance->content) && get_user_preferences('docked_block_instance_'.$instance->blockinstanceid, 0)) { - return true; - } - } - } return false; } diff --git a/lib/outputlib.php b/lib/outputlib.php index 9de39638587..a62786a6c41 100644 --- a/lib/outputlib.php +++ b/lib/outputlib.php @@ -744,7 +744,7 @@ class theme_config { $configurable = array( 'parents', 'sheets', 'parents_exclude_sheets', 'plugins_exclude_sheets', 'usefallback', 'javascripts', 'javascripts_footer', 'parents_exclude_javascripts', - 'layouts', 'enable_dock', 'enablecourseajax', 'requiredblocks', + 'layouts', 'enablecourseajax', 'requiredblocks', 'rendererfactory', 'csspostprocess', 'editor_sheets', 'editor_scss', 'rarrow', 'larrow', 'uarrow', 'darrow', 'hidefromselector', 'doctype', 'yuicssmodules', 'blockrtlmanipulations', 'lessfile', 'extralesscallback', 'lessvariablescallback', 'blockrendermethod', diff --git a/lib/yui/build/moodle-core-dock-loader/moodle-core-dock-loader-debug.js b/lib/yui/build/moodle-core-dock-loader/moodle-core-dock-loader-debug.js deleted file mode 100644 index faa4d77062ad2bb1a5a444a8df5a959903e8665a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4116 zcmbtXU2oeq6n*!v;QUa@Z6a@dY@4EK6JQzQ6ll9)Mi3aZbYruXM31DB8L9vK&Lu@l zPMj1&4Fp!G`+X13y`KJgmdT<>lS=ENq{CbrIxKYl?Xc9cAd?)3>!!|~(zQsZ2jb#* zayk-sgTak7;{4}FP5=Y`u3$F)*Nyc^|)INOwF77t3+vAMgZQq6eT7kj%`SXEz zE zzOzm`mHWqv+)@{9cs_)TYTFo^z}pvn1~;dyYrXVJ8d-_E3tiAAIIQs~z972y!M*=K z&3rJIg>>>z)o@qmq>8H%jEwuqKjI5DiM3C?CAP}N7x*B-?l99erAfx6aXJ}A8J08T z8dD2r8hY&&Hv|90{mXS#$-1xy{)DB21vs8&oL!dt!l%g_Rj(Q++++s)NTIg$W zOJV^LSqm}-Si4njDgK_E3+s%^od^y94ScvQQ|}n@H5Jt^o9kjd%9hf8;DV(|q0FIi zIGgDh0~!xBJuTr zw_uI~Y-`nr$zJN>mdxg4*mn}*S-@X~+7&ohnfUWqfnI`sOKN)3mxjH4z@Pw=J5wrkt#mW-b1Z zH}Z3C)XKpZ1lY$4gytjJI{eDSpz2&&Vn>)Ia4;wK)mZZ0{V3?okXlw`S2Cym81X`$ zDaE-Ts5sc={!lJ}F3iR-eA>f%WAKDZT3}{j=FttPrJY7bugEx*V*C1Z=dGjMQQ;$D z0vC73#>h1qzBiKWz8QpedDZp!EHbk3{iV79@ z7War{&`SPm=QjI5J3YFs@BBx@H?EVcH4`+$p(nYm2s^vgZP7f;pjq$W?tV-jY#6H; z09-k&2Ox{KGzcZspFsi2T`UlAhlzHXU?e};^Q@CVjklvdve+~$HMsnwe|ciN79*q>&yEU_f`g9kfFIA9gtqOSV0m*nJ?1^*)dyjl(?=(xPQjdS?yA{RF((E309^w>2@Z>BYyj}M^}4_b1PlG zWL)_S!<3E|;O3P`#0z{sRW=T)e+~EVfIiALmQDN3^uLp})fIJFx0_qs#yms!HUgA= zrt2BsdN8`!>}+ststhI0j=f+VD4LRrpi|N_u656oyGHrYeTH-A5bc1I<)8SGE}^w=Jc zqf~+UcW@Bs_yIGF2PeshuwOZS*1di0eyr zg>W2StzLtok#3mt$?kulK-duDI=TzK?Ha(EKLNd<{=ebJYVCrFU3Uh3GsF6J4T1$U zuskDLDrP>3S#12w-|X!VEKtRsn)Hi$AK2_Qg4;iLQ0c2Z(u-`>*k#Hz84-d&^HTBe z6A_6KwA1}Q`+4);q#`A$)TEUvgjQxf0XMrgwY^cJz`u9w1p*;R z;Q~8rznOV6@A3QRKuD!1sjXENbW7`?t8Dqut*lhw2)}Pk8MHMNcwo3wV>Vq|6GgRM(j*V3rW z!QVzZ@P9nXj?WJn*ZC^vxWXO^nb;tVBSJWCW5E`&Kf>+$@Dw6_nFu;mkWD`k)@w`6 zAhm$!n;J|IW2>H+m`eX8Rz-=@uIoZYSf@k%QBI2Vz@6|AK8N7+xWT@NtO7x9o1iN( zflzpSV32 zJC%7?t}9D~7mcf^=gXyu_2>&NW)5ax6m{&Bnmx4PGNq|_r2D{hI;%-+k(-z@J9Ah1 zaW&{Q%K6zbhT~NCAPG53MHwv8tR5Ub9Gq-zvS`(@xzNkd&R(}Cg@OtuG772xh-3Hp zaI`6nXWGTtNGguoV&XK!nGNd@eA zErX4nkHWI1h+Gl8b^)UCxa6-*X~T`!^MCyknpGV0l$DOA>G+19Z{hD@brl(j%#4M(Y2*b4k&X z5~l?=0YPl)ex7@I?)B`Cb1up<&uU}JN*)%*%EQtWUk@uIN@=qLcGKv>E2CLHJ7AY5 z)3XV?AB}E>Wfvb#PR~Bl5j$p2T6i@YO*z?xQ2XKAH+H{$)gE(lw|f`AwF0A~=g&v% zIeTxV@X|5AlB_njl6k{|mMRd}jj`dISX7cNDp+$&-7w{GDxJxTUKQbEE&a-rZFnIBF12f{oWk2@a}GCWr0at8T3AuD`%6>GZFH#dk$pyV@1pzg zJ?9~qt5SGzs5IQ^LaOq50wYKL2>3o->l{FSk+=F$E>J? zbI0RWrD&Wtb!!n`|8A6(?u#34^AHjdv7wGT@Y)Q*+j)H5*9vt;kNKl0;mw@t zpLKS<@|9e@MCd!HTAM4BURuV31Y5n#Cg?~?_UMRB5jArXnW1(eFXn846DqNn)rOfH zb|={qB0@81Eqd)v`4#(XdcmBxs_-m2Kx^Qkvdn^G#MjhPd%iH`X2Ms(y(hr(tW@^U z`f6CFHo@@k1CoJiW*#cz&1?(C<kjwBUw*`Xc$#*XPH)H~*DE7ww&c}y||!DQuRdz%R2bQ^xyLLjqvZ>W<< zlODqLr}Tn7d-nY{92TGScdC!?Ua4-=WlK`yH?NOyjGNU(KvqK5L=*dZKbvr|4nQO` zJ?-r-lk_qP4^azZ15yEzC!RhfCXa(7u`H1ywMTo*lmj`e-P&lUh_8vfNdtY08&)!< zl~nI4jxToUQs4}Q&De=Js+pN)A7ScIkH|%$D zD?Sxgtv!4}fPAb$Xd#lF!!JY(N*BUOa)em|2MbBQ8YhGIFbaAzM2lLwwJ2nNj0B;; zlbk4(c`8slk9);^s^)jbVk9pxf5Duf;u}RY)m2y3wJcTS zTihd(K`H64o!jICJT`m!D*AwkBL7n{Fn)6Nq81F`XVlkS~F`bw=*}(%uueus3@F z&fMrZ-7jz_+YWZ68OPmzybAYr;5-$FQm3b%1C=xH<(DGfKAJQw(EY0K7Q1M-1-2_r zIu50WVnCS|N~~S>$(HE%K(f$P1ZIM{{nZ*y77Tx^8~yai9K$HU@B6~d|l84xl z0jlPVUkJVA%3U_~LfTwS7>I9o`YA3oYEUZDO;5iDPq@BP*9gZ`7xxO340N-PPKMti zKv<~K_BQOG-P9z_|Ik0A)-F`o?dIq|JIA_m142Pw!W6C=`G~z5QW-G@eX`gY&wcOv~-#dR}f%>f@gV zcZ-wN?08w#vts!6Zt-IG`ID{U(-&Xt+`j!qal6<9k<$#k`!3m*u25oz_R=X)zn0my3(>aao*~ z%d>j2kkS|P`l6gKt8x*#`To3~tk6jlT7aR0xaE-kPisR04%|} z1W2GG5D_b5u-g05hM68h)6GfrDA&@`M{JI5*RyFoo*1Zy_3V(311a)Z@%!eEprfqo+^y|M>La`RR*H!nk}k&c`S`M^PXr7Ov=GdSOmFrV>28sF{v&!QtN2(>%TwS2LXT^L%m#$Qxxxo%m({U=YRz(rTBznrz!=u#A=hGx$G0P_ zsl&j?GA(gXTO-Pup`Wn;@}BYSBQp8cH`df2Wi`gq80zTq{N#N(TP{X|^uxz5UmQGn zad7ysHF!*vlKzoipUYE<&9P>GzMS>%V zQ`SdP@iYW&qo_{6f@OhKbvA%HGzEEJtvo8L*=Z+RwkhMZBw-Za&!u1QNE0T@I9=JS|af0AhbeWV0HW_lpGEc@sq4rMQh3mdoIaBCj5feImI{90O4M8}4r=mE5_L|{|DpPbC7g0y zmG^pHflXvJ9~G}_{zdVlA;CrUW& zlU!PSpe9uo)4KkNJ&u>kjwTl0Ea!NOs^!O}$i{`dpuPcR68cygLM9}w$3|aTiv@F? zsRMe?umUZXaljDp%$Xu{qnH-(*b6SIzfsK{+`oVE(d`13^YLtPQqRx% zZBBfb!>@jOZ&IFa`BLDoq|JY*Cd;$*cve=YXYO;{@}(m0X=XScPbZi@wRsTU)v}sW zXdfyvhXbyAu}G*xI-WwSL9;L=1c9zI7Yq&Z1OgW+Phuoa*z|DV2nqsABv@=YV39b& zeqlc;7}!@+i3lZuW6>!le_bs=ipwvhBUY21M+^2;&9K|X=HwY5mN`ny71ni0cD5u;zh%-OqK>F}2ig+OzpPPGxa2tu9o0P`13U#$xJ%$p(AX zCA8TY?1l-7QL+Ez_jjaX_yjqIefQU?41^b?6Iv(}jGNJEEVUb27!DT8%V{Z#$sAkT z+37ZHgfP%7kGAL2Z)lT*_WnRd@$d5Ar{7@1eK8$hKB#8ga(@$8me|q`U=bBl-f*DR zm6m-uPdXXBVwV1dU3{q)F$hd3V-#=OBHy-)MLnNi5}oJRDU^%q6g)>DXU$E`we^zc>$tJPj1}zq1b4Xb37WeFn$X<+sZ^gzsU~TY^ z3cHgNh@wAHK10~uF7A)M(gsyVUs3O=2=V}f^e`{Eeskqk6jFe7v$Db0oZ#cd;_HZ4 zHZAR77N4Wtv}i)D0n=U73y@en%lmpm0$dC~MT8DQxdDtxV(Eq+?pCV-vHb??9li&| zr?qGxD8#46GB#M&7kE2V3~z(|xvXs!JH=PhGj{?3_*Vufg$2aHq&hi)uz-3mmRTtE zuMeKVhz>H78eEY+RI^F_VKir>hs*kKTApBy_EI)7pA2|7U9n#y z#h!>GycAd_1Y=j3F<^g2txfe#(Eyic7iCR)^B!tX@rF z)q__FRxY*gQ5Bae3%H-)ZGvhH^5y0>w9BTBN^E>r7cg3**5nfYC8~GROVGPHtIXI| z&K4`E)ofLuoI@u64H`e%6d`^@7P&1tdRv=s8MdUHspKzK=SSrn#)@c=l&^-g&TVk3 zJkOf68rF8gv}9)vR_vmI$?TJ zIWH5G0EVomh5^JZ%Kh2W4drfe|6V3!*uM0x6Y+{pfc=x#wzKk3=vMHvx5{xFvq#N3 zOj+_Py4{CNgF4q(SRY}WUCvj>*rm%eWDGcJQ9OcXDKD^#S`=akJrG+1UhaG$?oBsE z0rPx6TCCu_ly2x{46Tz_r&aZ1?6w9RDlUyhGd zFj(8Mgn-lZZrIly`L|j1f%pVenmYLZRKWoZb`ItyX&B@L_5;ZD6`CE2E(b2SbFoTo z1ih7&3OVF&WG|e->kD5Et9h_9Kxx(=Ujp}PH=|Pzi|jGC5NV)trm{^intpAkwX9O6CUvs^XDzs-D3q%)%vCMGC?#ehoVf(q zS|Y0x`KF1yjlesuS2I;gh+jdNivJ8UDfOVZ*9j4ro`DdZaGi~zi^`IwNZ$x1X>c>Z zQqeBxc8jwL{^l9>dsu8m-e83t7iTr>B{W50|H}P6`~}aWPfm)#9p}+|qhVMt?1cU2 z^Us}9hT=x)9%gy0+Qei2JZRVeA?j z!+X%6MbSi$9l6SErd)oYA6VCbh1=Lkd9>mm!6>TZLnUlVUagMcx>Zk#2oI-UfvZwc z2I+*~?cxu#O2()RRditJ$95As&0PEf2?iS`YlD_mx{>T2NLc{sT2}GIqN0afD0oAO zl!@grmQRqk*b76GWJ`E)G)F7~EFH@SMe)_$qCBsbe;6N+W#bNk0k0xJehIrdb@Nrp zy$yTeFD@s12xA+cV3(h?IIJWQtr$6plhQ}WysXZ{dZ@fw}2;Q;n|SUUTA_qXFEu4NxbPi5@H@ zxhB(|Ic*7BhHDOlHQEEYg5n_ma*B&<+6|#66thidKnk~E&e-a!D@K4|yiG=6Sm#Qv zQ_(9P^z)`e(9*wf3=5TMP#US>i2mpUqbO^7!DS8D`GOuS^t4u-#R_epuRwJhOf_4X zpEc-3YeBUdo1&M%T9q4vYc4iw<$_fR(W~J;U?Aw37$iK8MC6H(a?q*z%ql^}(XIYk zWGsxyu7izGr;Uzlu?=(rhEatGM_Ef3*x6#6O8Qfo>sEx`aY&WZ66RmpC^j8QUaM;? z*OI?RnSlb+IL1dc4E$hvY}Rxq-oJtfOlCKsI&rPBxO(l;T*+4r5vJ1+Me$XD>vySy zV8V-O$r!lsGhL349cz9^)o$=(gV5e~x%Hl#a)6-c<7~)KDPvo8JY*FIpU~O8!wwL@A{K6l6APdAO()a}pJ&P16Ct_6A9jlhs z|B6WhyTwS~d~Nd*%AMEP1;P*k5%>4#di1~AU{x`$9MMt4ZM#Tr`U#b>7w8BS?XeM}WeG>UZfrvsjj9F(HoUOK!b|Fl!^aBR3Zbot44H!MrIyt!79+nm4eB;iM!pD`_2*{ zf@FS`9#f0tY}c){E(DpNXFM^E<6ypEtD_^d2L_l4a!DjH|Dmu;)Hp$7o{F3^bZp%esO3j)bb|0;y*jU+j9^Lr3Lg zAL{tE=9e0B>@!l3xZR1(j-k2cTZrVL9EV4*RtczVQU<|pouVusRn-xUz2On92o}W& ze^)ngd{#n304DyO-iQhzHJ3MN1%Q;xKhSJNbapquQP|=t;y(%M)}q>0BA!Yt3$`t= zrH9!xA%s(KL3=Sh32K2k`ULZ8z4}}Pb7WL1l(`#Zpfh@vX3<&IsTY~zz=fzBiRoE_ z$Yeg_FtS)!PMV=ZI4B`0S28qK7Q!6ug3n7AL&qlAgZc_kq$!|CNvT}|_ocR>5wxjp z%lj95wem5B)zwKYCx~4i&1Lth!Iq=5@f6Vxsac`v)ZyZt0Rtqs&?Cfl47Pq8E$h?M zDGxO$x~-WuebMYJWCT)bZUOAzV{t2N3`z+AKg23?D8+B7o4Y7KVm-{9Io-N!&lbTb zPc0pN`v^y49+g<8ACr>_3D-sS*yUT9Xzz|fi}OOV#5z3e8=U%w2f+F5O%AEMO}r`O{SMP0VkH&$!7$^NJwn?@wmL8(&2fOCHMmnw#cj8ln{|=^NCAP}CA&p|f%HiHJyGxJ z0j?n-cnStgygQxlgEfAbPxS*xUaA$0?p-< z#5zOF61;A?@Hsi{B2F#|Z%5A%G(V~q8lAz~TMRGP`Fe-PAG@j&a-jswXeQ=PPNhyR z=vkUSc4)N_heYP?Yn!DhOsbhTzVL1M<-{D`vWG8~7S}axoc1RWE!gToTsxbLFQ%&y z4_Cax#tFM!jb|$^>(yKW--Peh9H9xY@!!ZMG>UX1se51)B;)fL)$I}?_62ls1ToWM zh5_VM5c;!0zCfUn?6do%n+)PXa~fr*OIpe!ltbg;-vQ0-G-Z;`CFJ+d1BNY2&0_Fp zh$5MBe@rCQ_5Zf~?fzr!D!YBpmc37z@HD93Lvmn{}uG}p&v zU1d4YPPSSs{+q2D3veI`{`;%2)#X2cuNGLP6L$pOVLk-^`k@j*&l(d3z7flyX`vj* zX(6o5*+dzpy?xpbfiiX=kBl!dNw9#?sz*Hq2l2Re`EX#cL9i$qJ6UWDckm%O0EdR> z;0S12)Kw>OJ9b*;KFd)%!qEyuI&3%5v#V;F^BdN)Tw@42h0{eelJ#NCZ9((zAtzOY zmb4aXVPDn$=$eA1G1I+VG!>??c`(ICq(|d4!tlfKnqn}6*J<#%(WoVRL4yfEduP_p z42G!LXBD_vdTfTkxmI)bWLbPlW?WR>I z#0fE77_gfhMpGyI(0nmlBL=`DT8$Cg_nHV4-CdS`_`#_X=<+)nF**eHfF;cG~CA(6L}Y3R00Zoos-Hj!xHM!bTqs+9W7C(c!t;iBLBxk$mpc3{nKx zac`V7lfqO!#YQi}PCb9k2BnOFYQ@^qmRf7eP%NZDrlRf0z-B%r&UCyRuFY(WMxq-o zyN|89!eQ|kjdeAY=~-JLu68GI=s^RZABXl=#Yh|*N<2phg=}jm&Z={qswfuoW4yun zjWMI>VYx);1Xfad2E@*x`Aq)f`7;F2&MPFh<5^6)C}X=^)l;YK#j`p`;PiB~ zbKSoKV2XJOqEF3Pnq_1IKXt`lx1#$b4W*#IjgaOg04S$suK?=K15-(s;zb!|VK<_CWVp-+W20S0g zF=zD9K!iKsqD|zlE$L5K_B31yC!T|1Y8oiSAr?XepX7Od5J8`m!eHe}N+-r9)+ZzP z6m=4_jG10yoDjIb;HoL}yJGzOGLCU#TFoE`L3+ z&{5sX2KrNPVvB0n0&_ABar%|#P_@_wmB7Cd{V6C~VTV?NNLijBglcn%2_dOS{9a^J z_M0T4R70oouamB^6b$ttC`!u2_&tx(q&}M9l%jo-^R*o~%!!H%esk9nwbe8BL6dAr&@E)*h(2t_4u^`J!Ca+^gjX&|kw{N{~j~89AqA8g3bpiF*SPMpD zB1%pU7dXU!93uJCp3e4g>O2+SY~-l*4qN+b2e67-Z0iMrL13;ohi2wh(pEfk z5wl!-9b@jgbC&rQO#O~s?~ubOBV(ktDnFvloxf1%97_*x<l)#$`kdyoNTG9;!P>KaF&Iym;3ByxNyVt$y!E%XcJm3%09cUnY}^XZ=&c2{Kv z2~Ln8U)qCn@|@1sp$OYfVc{h^rJhoNOCwsry~5+E!~9% zDYjNVcF953;!hgqNusXl%Q0mVj(A|LE?A_sE;*fAN`Hm|1)uD!=;l~63DG+V>% zpQs9@*^gg37kRQvvqaxQZw+u6Lqau~_gK{+?~Vjdz<3=%!#a(wBVjrrPJN(rH5Pdz zjRuB)SoBM(0Gh(8b1eVWAz(`-L&>!O77zqKP`ej3a0%7qb{U#*l#5xcnQL4iS0*$d zZME-RE?K#06XrXUTkE4+K5q?)6{nlGkQ4+U0N6ypudCk{?(Nd+1R)tF2s9VCD$A?1 zB>UMeovGcA&R(a;k-|;`9STg%D9`|i)9X@bZ6mNYlyyM+y|_$aq%*hB39+_UxDEI{ zY=gwqQAj{Uv>Qck*Ih~qMK!kcd!F>s@t_x2oRf~E$qnOo$HIf1rbg62+md8nc6{9S z^vKLOPKQ{CAsuy+?9N~+o2&X_C6^$)mb~MSnL+?GYuN$V0Dl*ulnhLZGN3CYT+mWQ zv6^jKvRWXu6}MBJAv3X+XA)l5-(gVio8>yfaK!&mE)Hti;@Y6c&#%QuCncQq5qQ_w zKc>Evcmig4MZg?#+yTeT*&Zkb$Y@Nhkdqd&Y}iqv*;^-wiA&Cmeqrtyz@iUS4VdM3 zsJ1wL={NnXOVYC9bgo$Dd^l&!qtZcCtQJx3r+9R+T8Nr~;Smxi@mPnySnqWrpgVUG zy|Ij2x!aIwgsEsFv^+D(^%bD@P}vp0riDL?)yKrXU`j!W4ws3wKqG~;HK~TrZT$>b zCA;|*^XcY<3FDH-%TtDz55yXOfbM{2S@FNIoMzE(k?%~xU_$zC%M^hKw5lVpt|^ z-fsGW*&s}sf;I}ED=FQvFza$6V*M_JM{>?2$`z!=mSe@&SMtH93_q+Kra42oL|@Ht z_?5>*76^A@K1=v4@!paGZi_`xJdew9M;KH?rs*hJof8256!{`>;K!7<+wpoV*pLD} zj73z74+{8xEKXsSS_`Dcq~u5X(uULn7XHLLTR__&KP_dWC&9xQ$52v4yI_fe3GTR_ zPRAFEV0$BE__>88H$*s!f2&N}BS)ORnNZS%HKG=)$r`+diIq7t43n7|(aJP%9lwEm zGx@Sjk7xL{;j&qC&~9+;TDryHVvJfL~w5}X;QkycnlG00$n1%h~}m z9~>&u-4PLCMrctsJR&Qq?eJPaROHYV3QTjCMKZ#@BppJWWr4-DNJv7<^mQ?Bt<=KKyaX%K1TI2~bL^>yr{nH7;Ut|jMMkEFY$P+-3V)F{u8DKjZSAxBY5XHb>i zKZq}?pkbM*kl2H_@kz!O2>{_rU=^X;qe_JVwq zLh{)>Gp@p}B##k{CHoF|9p~C}dgmNOT8on>w*UqdH20|MB+yG@@dGZ>3i73EOB4I^ zw7tH|E~Iq`fneQ5IBt)Cx6c>W_6@hqVrfEim=sj{sFO2&3UF~2f z?@V7!dp+>}hKV_?H|ZTN5CcGyP)gEBiK9j_2CYDIyUR3@!82~B+<9Q+L4ketk;pAw=u{wM6Qd9+^}>Zt9Ik%^?9>>MUc zWbnB->1ut{D_(LuT`6D`Cq#){#0I+={bQc#;rT%NFmM`O(%_fi_QkbrX&mxZgw^(T z<84D;Xa^!OCfAS`zO11#nPS>Bl(J^&jvYYA^+C*~n4>F@(*9^#&Q5XdBbReke%J9Cjn!3}B{}O@DH-N0FZ|#V2)tX7x7qE??E5~d6mIP1wYXiP|3In>D12uR<7T*@bFj_)| ze#R{6blup)YVGQqDF?D?;D2Kw4ClUvKeTHQVti@t0$!K|p zBmhU2@Fw+%cV`bwnsWbS!|nLKX58HKi!zVFhodkg4H=B56}jqf?}%z zHw`Jiij#H4z=VQ4aDB9RK!;p#_^IE}tnN6nCL5M;=qqGymndZULNqUS)O8Q5z)7If z5M@nW@u#x9pvuhKYHa~T9#q}~Vu|1_T}P-J&WmcR@vTXS?jRv8yN1LS8!6vy^oFVGQzBKnKV`zUwmz&Jd# z=5H5YHCmE6&bs9rQ?=0CTd&cw>p%ghLu@LRS?7Qktz{L_u{OVL!%K)_ONnZ-{@H4C zTi69itggg@HsYJh*t0+KoF5VrRMm3%T*#7{gBR%&Ejxmu1WTjDU4uf#2e^o>f!Xdl z(0ZF0I|t*{vR+erhJAKZm4)P*GlXPv$U$RA+F3th#=&B(bq+tHNU92(r!nP(YA+Ze zupwH;I^t+x%SEL~GY0y1fz+G)((2DBd^=HrHqq!O)e{W3+3c8^Vc@fEPXT(c&(lCo zMq;hXv#qjM{@U{pSH{7WQ`(Cn2c};52B8WLP>gJKYPi`{MV4+MkD|j*2ObkjLN#=7 zCv=vxP^U7I@L-e@+CgWLgKhfz+D)zmwnj>g+}ckl9TV=^_by3ISEL5bBt_pX3;CWg zC>cS{>pg}|SlZK{h|aD~97vEsyP)G&IXQ)npyMi)MYeSml2)N6XdsT(>O(QjgF>lR zz6$(D=PE#uQEBZmfSM+ZKjyU29%2g@LKxCX94e=qKQ|H0^;wr@X+ETI_rkHY+;?rU zxsg^iGTr@T`!*s*hRpqq7^R|;XPawGRoZ;Tk3j=;hI;#^#>1@E8eOnTXuRHrSnx#X zqaEr;$xit`GfXOaL!_z_L|!TNuM-h!BrdU`I*VN!$GaWA4m;~Ew@0BHnVb@IJKNQy9Woa-{6?D!VPrBB=$rt@1|5Y z5U5VVx(i8yYzWdK-y<)dUY{%)*Ncb+`>fZGHQ#=~?Z|SYQta7ZYeWdykcW)T#aenI zJJz*1W|5u&*rgbKkPFMk=4h1{u!&MRXqZdQ;-s`Uee8S>J4ReM4+%?7w)Rtro8_+}L@83LnXKO6N^H|E6q+ zz0x$ZSeMk7cuF;?SKM`HC6uk?e!lE|xOV-%y9>cx9^#s7j!W`lJ-~6me4~rk6)vvj zWem}R>2DJR$%FkO42_Y$va6qi$%2#GHa-kOJ(eUkD|QvxFLyWtyeeLtJFae`{$>X~XtDe^l6&WHHJ=W9Z=?U0V$kUKaK4-l z3MgES_w+TX4%R%$(9c+L3`(6){;)a3iK5jh!(XEICs6?h;eheZ?c#J=A3^X$<;Aif zQ^EQ|#Pe;rmKqn9LlWQSebNVF$!3yeTbOhMBC3q~S9R^e4XPw>p><5GrPh;otO%&c z4*ZO02X(TAF1|mnCo6Q&R7BHwB3bFl_bAjr`>%gHL9Y=Zl}`dn;L*hmI5emrp>v3J9pv!&srj-v}zvg7&)tmDA38DK>yHiBt%6*Rzyor*eU~-0A$lAK8n&x@3u7!bShOKpMU_186 z3Ac;Kaut>?Jg>Ojp}Gw3CnX|7t-}$=Zs}f_(z_0R#xa%pTT2vMf1+f zajn+RCRa2ZT`t#Z_NcpAqC42=5}#mx1y5o$ml=sk0n>YrzmCst{97HL<0#-?i5=TK zwfSnVTHs7Igab7g!Xl#Z%2K%q>&5BQ7*Qnyjq=9u2_DKV!F;g}pG{!hy4S>t zaC$;;wsKy8_s}rqva%jUHbZ9xk)9iKTSt{tIxWN#2#*ymIgo}8k((Q?DcGj1xO-cK zaK!K0r@zd%f^%Wt6jkvpd=hybyuEYBkB5s2f9#-Pqq|n@A=|KlSRT{Z^}FgvHxd@) zFD-calWkZPTW*bS%s&NL*X%#S`)mMP(_|;v+CP_V85_sN?4*G$36cpIr&WU)6yS%kRTU*jS`6MdCweYRcoIrt z0LDkKlEm?LHm<<}05pK7t?TQ)*5$o}H<)^`vtWQ>!5EN}Y5gG|hlZDE-DZF8TL*p) zpl*;IbSMbNDo@5ZNR0W^(`Dw}*6(?zs1|yZ+AU16?epE$OKY7xl;6xuqVe3YtvVCSO8SHL$0QuPMqP6-RIea}wX4-O2r&213_`7<} z1VzjvEQj8b&KMiNfA8WW=jD9-liZphxs7I3OlQl2_%-JRVIW~-+hJsQHFSi501TNz zV)iS>joiQIWJ-qS=j?p30z!FT3b%ZQT{E_0CZ(wiu@R*2NDwlMP3*=Z4`Y!&5Fp0| z(Ws(e>mIZ@&xi!j&xzDH$+4sFK#eC5qn+Tak(n|)m6}pDh1n?n!-6Ye09h1(SR3e17G@5~n961*0LFk{WEY{`&f-myzkydfTVa?bHN2(s0{B5!nvUn44 zad$OR3f>4@)za?jNo9JSPHJ3l7S2(&K(|%oMGos#BXG6;&I8HNng}Rq-dTb5cu$r7 zZa{PO$RJ7}hlM5kydL0C9+~w1NoFd3%!ukEnoW&$0#hhzR9u&m z2`spp(4n=Wbnf1-**gfd-e$lT-e|(-bOQ;ESMFTBXasWb>`nDIXm6Unz-_ntucGLy z)!w2$c2{K!V$}pKpg^%JajFOkAP&%tCx68aG|s;mOzUhw0n9MuK)61Ja?M`W=5Bj; zUQnU7lEkgWmFA^vfk*TW%ordBcVdM-VLo{ARjMx5X=ntJc@m}{+sSHeY`R^B!okkF zzuepY{f~Ekvjcr?fb9&b4`%EhjBGo-#mk`QuOb0a{ti0!mYWRvdmxs%T0 z3v5McMnD8k$)2S`_YMc_6}$2gX@t@x3+awESKVwQ zMdpyM!G|jR*R@Vd*G30}eErk~nIYw@CPZU^?5^9c$=SgcGHOG}W#5!SHp z8>YYB#Dp7G@R0NRd^KZI0Qmw&X)rs}I<6B0ghALy z6V+%@Tw@`7Ykf)r!twyfG|&PP7J6!Gsz}KF)RXdPbqbN)ycb?50emnVC^jXDQ0|nv zO1%7X(Gmyz>kAbECr3~Pp`Ii>$8kyNzG^%%KqyaO?05#lL=9e5NWENmO8B@Qcrk zNVMZ9O^rXm3PAAg8FgJ5z z0NGkGLYT%ljF#h+ZT9&1xa3+~O)G>uN@gocbe9HUkLwL~x3a~W(vIt^{=M%FJ zb31iTPpYK;G8~+jW3Gu>T;JiM$&kakKpMu6u*G7=m-XrC6z966uQ1vJM(QfC_+zm; zf@h&R(hd-v%R!QcwDkknBXEVvR$*H>Z17?YhGW+s(8NV~jJ$_&$;4$6b2f)lq|C}} z05W;>zrK0-q5}+$6SOINN2Z-R9b@xIJ)4`#k{3(rG+kxP*cB4_w-S~$n1A1nbbf?R z%Ao`=rP;d`#0LFv*gC}J^9XNV%jhsNQ< zp1Qv<86bI$=nLHkU}2sJy=(J_GSLt0Ec^!@sALin=k8X4_;af)G3TK+B&D`}8>r_` zX&j$rSYd8!8wEb6=;A|`vRW!6ilP0%*S{UW79WV%9UU2b{d;~`c|Bt(w?K@JPfkbftO~@%akZcX0SV(;@#-|pBb`>pP|2?~ z`1&h$stn{h9o+v~fFbj$zW{oC6H_6*AMjv?q=3T^E=7cBsbDLLsW63Tn;H7z*Eg3l z$ZsU!P}+V`FRPQPoWsv=e~BoH4%iQebpe&^KX1g-?b1DarXu`^0({--JCPMnfWkXNw|V z{@{oLfk-A($v2M0NYW24>(s0@Vtq^5&#WnJ)klBDg{dIHF%}ltRyCS!xAS)=awX(? z=IED0MiPb9QKDl{kdQX`rb{J7hzeF&GscUbD0Ph``0)&@uY_PADB`q2%1vR2clUlI z8Nmr}E2NUb!i5`<(9q3@1Su(Zcwv_ZgYyVbaFvHu*7hT%@;e(i)Qb$U{F>nqi?~v# zkc8TYM@|gsn>2PTkJbZlM8(mcKIr78U#Z(Ld|=C2PY^BlZ~rS3zM`Uw_&u$G&a_}rujWOfD5Gvua4}!x3KbAY3k(+`ucRKPwKO9P z+^pws*z8z6A6pbZ^1w!2FrV2ZFyhpz()eF|a+8*T^?r8xbMVQ1#%a|7I zp_yQ)9Le2?V#>gBAcz$E2DMT}aXdY&m<)p6ZSQH}M^o;W#l*jJgpeJ3&wnFs$)fVw zO=v`$x_;blhI^64Pt}E3R=91ik1H__NxZRaPz3CLFj;#%J4V`un?jjdSOerSgGwe6 z5J)u3{)yfmA{Kh|3Ww|e5!UlXHp6DKg&sKf5!yvVF=4{g&uLdWfjgl%m(6*j3EQsAU>g%o$`jYcnhEzv zQarL2?Uw#a7y4+XS1DvAO^31SJ-GY7eyW`o6rrjREHL;d1fDKqnsSNX;C&x%(FP6B2| z8VdIu9<_s-={lZ#q}_Zd@aEC;EF)B_FhIVJB?OO#Ezq*k%Sm*L$KE)8HaCJ$OF5lc z99N9ta^qHngB11$1(^fdl~1@L7G*!pEX)V>9@_M08IzYw3N>h-(w|%E)LiQ@HxY-nLE^O$kGP@<8XSvM@4@itS@n0ar69#jImtg(E#V;CFJZPA&yfVgK-qPp-{;dO>;^wydMqmRgC}` z8<7-A?WKvc{)7Dl!0v`Db;E&te1YU5h@46%lTtGVCo1m@|MGLOCA}OD-~FZd@y^x` zyq)Fo&^l=FtJUm**1o>`%H6?{K(--eNb1;NA4sYeORm%vqzanm?r?1Qi&u-NUqZAS zp0R))kQgwnz(#V3F(MI}$>mA^9W<$uBcx1xal*3~lOlm6+ zIWP1UrsYSuR5&L=nMzx(QB)(hk}$?KF%}hQWtwy?DUA?CXPMU})hcri(NQ>rM7mBw zAjK>(fZq}9CO;uF7&oOu@Y$Fv_2>+1e8`UV=YQGJ4*pquJ^$kT8qxrnQ=?__hWQ@J zNTF{}n*0dqx2&u4(;P>f#%1kG`0cyQSLx)jKneX6^di~VwxlFjl{7lEWtMFy_e5ZHEAxiwi&>1lIdLf@M6wT z)>dN?uWM0B2i{tSH1j+JzI<)j%kN}5JHXsX!15Nxz1(TsaG63jWIoS(6Y}}T% z5gWrvoXCF~pH$6Y#m1S1XXvQW(_()70Lm2Hc+*izGDgvY_Ck`dI7)B2S4?%F30F|^ zX2FNIti&-wxa)I6f6%QKe_e1Q#%s_?fkPYsmXqpq1TiLInr z%5DWD(Ksot;Djt0aiU#`jGFR-`4cFC>T$#iSWb=2Sn7CQkD%zrBW&HI=~!N52Mdu5 zfI`+u+ldBQNmcA}u-N8Q!Ui5lU-^5f5L9bu)<8&Jz{pF=$=~^BlTU~QkrMXUETfzs z%XA5KtxjT4@a596MdL1b-oeMobNfvq1du3M#d=hUxJ0Dyxl5RzvY_$}|AD7~9^0J7R=h z#4T~`k21no4HD##hj&NbXW}`b(Go z&oxW+f9VTGd@NmJ>H;=+pd~C2#K}U8Jfg-yFKB6J%@t5bYg_f^N2iN<3{t7WO`Gf0 zCBlLtS7=?_c!^Asa|v;03uP*&U(TmmbI5+&+A(ORs#goY`@*y$WsMxOrk21;Kof01 z8qFg#GdqnlOnONzr`_U!FSiBR5W$W8gUn#yIS*E9DXmnbq3#Mj*H)zpP2-LYJhkoH zbw)WsCwFq4S(TJpiHJj2r)!ZFEF&grip-_TayDpJ&(S!WBzI=n&cmjjqvFq|o1P>c z$CbMj6%kPw6md@?^hI+oq=xW-h>a?2P4X>E2OH3*bx^-T#FeqY6)C@TkEJ!P#}{tl z=~8KHNIi3@a!l7$YeDi7x2|@Q7R8^|lmvnrD3K~YUv`Kg7Q3R-2qG6rE%Vht6{x_SJXBBLB8@xxV z;}~3%<~gd_p=+xfB1!?_o+!j_zC_(?_J(B+JKwY}iLuHRGCKp8D`Vd*h}*nA;ZlKy zecD6@5qyCwre(S@zlCE6ga#^ii#e)s{wc<*i8U z$oh#ebj<8zB_SuTDtHSc8Y5bFyYEsB$ z1i2{jcpRPLkOAUwz#vE*R@Y$n3dEea8n?EGaBRc9hD|BybIKm@W_N5G=H2%l$WoJK zCe}mIsTyn_c}i9-aGlh|o)NDNJIoOmyp}r33q}%fu>7qBKh(VO2zt;DCZI-zT?Q1O ztI*FfH$Z=^c4OdEKHpCCZwh-rVnq2y=x6Jp=8Z?tgZ@ZCdKk~Rn$!T1+aiA^(Yyiv zW3?MYe+B+G20ozidJ{nSL(LlxA;yV#3UbDqY)5v*JWv*y(dT+2aTPZii0nLgK}u^A z196K5Rm8FG6}Tl;hh7rHB2-viC3dXPGWN4z_=T0AY10-*IlG0;6DHK`(QixGPH4kh zO-`zh2ZZJ2oCyGBWz*{t5lxt2)WIxqoD$oq#z=%%$+GKoGg-}qsZYv z4H0Oq_$;dA2U%gNcbEFXa%;Bwn#mZ%kqm;b9Vi3b_?OKD>1gBQ2*7h5Ui_9%w1M zj3N-faK9BD%?YdtUYj{L9DfWXm;z4 zRK)k_OzUdYj~<73XTgIOM@s(7XC9KDCFwu2{Ky`}u1;Vh8xElPAD2?{XC#2--HR$q z*pvR*Ta~Cv$6nhN{Xw5kSXoNk(nfAWvvPV^pFVrPPU0JA6%rNDF&qFC=T<7n(nDwt zIK8w?0~kIx2{13c5At(`o75iPTO#R?48Igs=gQD zXx)*D??sezY=~RS3qL3Z)-NwCw`O@EhOS&XgcneXg}K1I;_VmB(3XhnR&!}a{H#f1 zq_ADtxqItwH`WCe%}eD?F?fSf(guB#HJ@TZMo1QZDtX=2+$&3|kdNsp&>93Z`H+ay zQ9x|x5i&3$bd036#zPXpl@>*X5$h4c$so7Yk}l_sOLxOVq}__V-O6&212K^v(;CKjORZ^qE*Qjr&?@av zq7{@M$AFIkG10bU_Nlb(NNtPQv3gn!Vn_7}M;84A-6ckZGc+fY$J(`}3z^GH6}Yif z(9kbFQ$)1n3M-jhQQHS!^azmdVM(_=eEPJSkWFu-n{%?FvqzzCQY_~2MO`3RDrANT z7D1cnoU$5GvMhrJ0HT_~gi0e(@~c!AR^=37Rl?t|R2Hsrw4%+|5`uvG60Q$BrLN_% z@vG@Cw`1pkIQa_44}%?4WowYT?#^1YDlOl-l2|#bO=4~DmUeAPgUL!Sp*)89lrv7@ zEejgki3=by$lzw^2{TR{FZ87Td!(L7VfMRn92_wmxS3B(VN7}er#$SfVt!d@7P_Q? zSf~irL<X|3C5br5#!}{fpWWyf`H%SfbJUXYy z4*a7#k<1}0h3}h<$@CMEUObq?ksW<`{hmS&gjOK4^u^iB`Vx$_r~e?+Zh}{xWIw~2 zA@ffY*}O)ck7_x<^dnDdO9W}X@LHvizFQ}Un)nd5qyJslPR#=lJMovJo1R;RF(6$+SL2EYx(`#(mpXl2~V+hx6NdWakQP%{PO2yP2M; z3yWGbU1a)}>K86jQPiSghuRc8v^=B2LR)r!ZaWjbp3X_Bzq%Y%S9y^+m*$&L4S#c2 zGG|$Ili*>&W8gUnt>uW|M^t!rV{A`TRjDQ_e$-Mw#ssP%q1pdp4Tc+XX^%6jEG z_klK{M)tWI+cyv#q4nm-VpG?YgpbXF)fDkbC+VA>U|#rpjWa}Q=Ue`pj*}8!mCXX@eCnnDgu`AKxx5W8=bD*g2hmt_uuInsf9 z)x9QJz2-QsFAYTdyAkj~U%e*mq1rD8o%|>X@3T}3VJXHbH!Q(cCb3jFC%@2mY`Xv> z9U{oJDk3{}^P(xSyCh4ZwpQJZMl9IWAhfrm@#>VjF>0U|En{DNhOglJ ze}D4&&Hl?5-^0SBTzkt{VR7q0@h;BME$*prrSRBxz0~m?w+ok&39PUZu6ZmI>sy|Ga7JH|P&h zr*)=n6aGU*37GLt%i!*}3|{0}k*uV{qR1EYm%588S$}ew>C226G3EciT_trgN%N{s z@}*8!7xI9}r?wYZJ~h8C-s!rC)%`k+rqW(T+a%YS?ffUl6n;L!HeFvQ`KlTvO%G~g z*C4Y^)i|Y{G>?U#QeQzHVkP7OMi!GvEltk+&oBe<(Nu!GmrUq z_uZ5?d!FyI% zPm&jPy8ggJKiwqx6&)0}^Wj}oZ_+A^%IQjH`YNe)pq5!m=g%L7c7n%0o2Wj-SE%)ZQdXATbo?^&+jkBX2NA+6eD4zk$ol@4#} z4_jTVM|wV2#pSPhS*ycC`)mr5p5dtAo!wr%4Ky^4c@rqdOBIH#^{_BC`(M4)7jvR^ z9o(d=Sl@M4-*EVo)ahxRl$iejWbN{mUPB+PEM4*{oTcl)uEMR1M6=da-ILARTV51t zgQ_md-uu>g2MwogZ|xkGA9&Yr>h|{F07t=&shT4lhO)P_y^OpgZD0FGwR;A^%~_3| zVij^;&=Cqc99^fspOYSaU8az?giML!Z5`!eQ_|KfU~3RUZ>p1%?e8io=Bg~vRR<5h zJznXnP+27tEzxgRrx~q$QPpLdUj>Q;bCs5mB24y9mvy>KG8L%|2M?+r)=7o4+8C^w zxth`dfhru4Dx{rldK+eq>S;v{(;U|4#rY54E36=@XL|bclWD3?j}H&c&&Pj;j4pWu z%vQZmYv`S2c(Y6@O~b0#9!tUyC#k)Z@!?baV>Qo^kiOzErW}%3p*j zv&&K^ze$VBx>oU>nZZyrpU?k%77QP@u zl-X>wPBZ9@c(l&a?ce#|7qe9gl9LZ{nrAo%GX@kRTU`dA$v%#!Z_H0{jV_U zbP1v{<%7qYhodDmpR2k|@@id_*AqG>lZ{SRAVQr!22{xRG|DlS8Zq4ve&B;imHwgQ z2jgn|V5UwVjPtR2d_)7BK0ew!1TUd%p*0{K!7e%uqh!8g0Hdf47%%d$UV}0JldkHG z3cop-K8)7;o4wHK)uzV4JJ=M`%#h(d+;*&4R@I|sz05XD_=ebD1vlHG0{_X@mO8`H zd51lrwY{OGRndE*D^8-i*v3IJS%*gt??ODySH=5jNyIGbVv*@JPSY7v!UG429s$Z6 zJw%__f5DyX8zJ7((hwOJk(yjrljZ?Lk)9NPbRWIfm%pWT_i5330D`lQD5%G)^c{AI z{sl*}X|mnwd==F6+vCoL`5h>N%%ArMhdZ6zq` zDWBIQBu^L+z69C~!dZTJn2Y2vEb^@qPTw{uEB!LB0i{olLsFZiCMo@qklM@jPx@aw zXss1AC~%acEW9bE)o!axJ|2Xxq3Cu?SP0@w_JN6xV2pOxgiNsHV!Fj)E66O&Z|dYy zI0d+uT;bp{u-cZIa18$=Pk=m<4|?T4fjSrPT*YrM7+0^#Fc!qTe3_r{K0Xw2E$&%w&6FndtgjEdj;eC|2XWWhJMn-jozrABuV;K zo1)iucnQ=p?@iZ_*x;Ch;VSL_T&tTEzaQdakBIsMNlZG86?9p9D~vL26lD5F2R zo3&Al53#-_9cnE?phV3n*ey2RFof15j}>rae*?TzY`37ziKiweVRxddOWBo30*P-B zDZA@K;Uu=gmEz(msS5WhiPpTX3R@TEWGb+N0ocy2PxmyT=wwGJ8N?;^f~ zNiv-f;20!6YHv7)7Z3y?6B2i~`Q(#K`H7v(^Fn-Ep0Gm|99}+s;_xy}ZMF~}V+zO= zIXl1})g;n-MHc#=%qNv*rYM;m#ufL*bR%^*K@lsNLl)C;~T2?hN#qUK#imt%ngh`D=xH=qkT1G$< z+*u$Ea+i3KZWpYwIWfw{`pi%*zOWNlX0`alc?d7K2DEBC)*N0BblE}eM$^+xl97wZ zT%t)0OnEDi%sDc^%__W@*2UFTMllzmjWp*THSN|Wcu?XJOQXp(M-vvX{fnA3JeF)B zjj{nBiCz(9CJw<5rpxu!{N{4EURwm_`I-ijS+vgp4Q|L%i-Lm5sGxBX&*V2^Z4ul` z0R{PyjkcJX;6sT<;^xF29?T#=bdoqLzvT$4{OZP5o8Bgv+WDKtksz%1f(?U^Nvt-J zQfhEFtIH2J#yQ!?PlmGL-7+C(8R2G*K;%)0SO735%#2|m!oI}F9|;T~KH$9exaGoo zUV-%wR5Zv~GvId&>zbpXqBgH7&;xEh$+DMN{m*5l?q-mMARndqNP=k1W`~ejJ^dab zhiO{9k;p_2&|kdGFT$IzN)zyC+T$^ac?l~`>ok^?e9+ReMGcWJpk}TS`k*t<~T0A__Ro?krqR3;lP-9*Nw`lex?7Z+c z6n3%rsDIelfB4Hb3ZZhOA{5NdZti9?nF3>M6YmWjt*2I+<-G+RHESbDZKyw40E7^u zeL>A#3_nnvAl53$O`dx%@zel5;nff54PVYmcyV)wi`odIZcQq%4e(++fP&AhWSCm6BW zKntBZ{_ebRN0dz=%M!v}-eX@1qn-bzFNINp_q}sRlFE59YkA;I%h~I$HNCzX!A_Dm z4n#>smqD-~b{wrxA(lP@#6)JcSNruGqG;5k36YZW`T)^{(O@#=qqATd#{L@p%h56_M#Or6YGFF~m)O*KOB2 z1W>@pY-T>D>KK|L%4;LKtTZUguxq;p!WM2Fza!WN*NPos!%xA2hA*Ua0wo4hUJSKr zY=ROZ8fo+VOn&2hX4;=SShj)ClfOtFSy~~oMG~exooSb>Dd3GnA4S_aPD=5A&n0mq zdii6kl%II9GZ^_4X8!0Gl7s~vhDGqt)i_)*r1<&>W`MeJN@eQ#rO<$iL3e0J6|60K zoT6ofQYzSDla#r=ELO*H6zv1BGqH2 z7E~i1$8k0O$3zy1aU7wW3tRmrZh*Sg)n?uNworxspE!HwPxi(R4`FA{(`#Mq>cG<& z6e4saG2}oJ(mv#_-<;@2Br8NeKQO^TINjYx(^_Vrln30#(oVRy;lQv{CI>Usl%XAH zAh<{bfay84(F{pX^0Vg@)udVl;Gv~U!TBjh;sH9-s!V^D&i97Q;Nm~VHkTtWb!QJFF6`og74B?G_BPW07YKR)ercJ zB0=buGK_H^F>7LRM%gzf#p>5)z*%VxW+b)|UDA`XMdC2r1t~GapWp7`d{|)iG-mAI zdDq=Y0AOpFS2(UF*GA{Odq_J2nG<_>n8M*}q9@qhR`j8D0&P&L6=|w{3Ml1U%gR~8 z+0PX{=e%&Yd+Y}KwFGSd*2ti7agX8KB37Q#KLt50JNlK-uQmP3@DH+ug6G)mO6`Ox zOlVFhJZn<9q;Vhul>QFHN=tJX8yQ4NApiiQ0K(H_2sh&D2&$LZ^YJ*0TMgOYSg@QE zdZGM()06mYdUD8yh&1C*?6gup;giXJj>%{H3o<%vhP6wuF_*OU$7N|LKR_J0b5k4+UvZlv>Kc)DaHGdw6 zBSZumDd(XL1)aApu!t2!0)JaeVw1;6x$kQ@yxicoR#dh%P&@u6C|y#g7~KbTZrvDF z+O-CK0)VnaowsqKWdd@dDZBv7+QpRZ}zC09Jxz$c>)rycF8I15=G<&H2GJk#STXLAIrZ87`TS6D*dbPX0)Ft9}x3}HM7hEYrq?H!yEpe0?YG1^r zJF#;)e6gCb*CCMXE*gl0_lNm6f*>8A?WUe`t-Cd9cn?3G?XDFnwH@-4( z%q0~J^x2%Ymb250g#Z|cc3~jQcCIiqT1J~_YcTME$<-Nen2f?fes*wd7U(gW9ZsP`61P6PTLDAz2%EYs*toPI z6A;Ra8&ic@Q<7mE1uthvH5!xjn}^2n?42$w@*i08Zf+_*=vbdqrJDh@@_tfGQoujU zC>WG}u#twQq1N+cQh4#vc02=(P@u*INj9wsG->!p9@OP9^s+yPTZ51O7w^b-t@`c)kXi1`_Gz*O5K@6d8Bc-HE0jjoJ zcspXs*kr}AlgRcwHDm^dX5)#hXV);?|3Xr?9}#-IpKRo&Z=JQs3Ww=&6kEtDfTNHt=*~4Cgc3>G95EuR)bJ|2*?ngDApC1rJ}C9MsMa}&Z2s?)m3(}DV-Fg&Yo+)# zrRVtMv}ypQ=TODlCp*b>1PVK)S)c4_fX-(U*$Lpcs=@4(0H<8u>?GG!nHt7=pDouPJQ4f2$ih~D_lqhX^ehe(y2h9&}QK1Iq3&}x-k4`GM8qfczol% z)9`Ra2c}s{4R>dz1~Uu}>RIW}8FRC8*;Sv$#=?HiV3)1I5cxGl$BkpfoNe4>XFh$7 z47~Q%77n~_Xbtfn?usG0>@8<_0eok;rc8vngg@1dM}(vw>wylx1X9*WFG=Px3LPXr-fA#AFCvviB%FGtLyMP%*e;|s&%8uaHo`gIHp!}vLCMA!$GJ8LhjuZ%z zRL*1ZV--0Fp(vnx?cH5wFV~!@YiNNq$C35&E$Zm)FUOO=T#Uay0@4JYAVDpxKi7^g zOezj<$ZRAYR4IY6_#CvGQj9~Mdu{~oOg%zWqnPX_$)q&u4iS}XeoRpyQik>^@@O}t z1()Q)m8}9c6INUf=)7eZZg8lH!1C?#LI~i30o;{yIeI@}%5TGHgM-QY%xlp(-4I1u z>hN$w3VTmDrud87)||@5duM8EEd%yUA%Au@5Eo!0l*-4bM@% zfLk`$on!37vD~YUmLA%(bd!;14>;M&zGQ%XC~CS{H~dRJgMYMj2WwZPn2DlXX9e~! zs1XG@LM)^}JYzXu53wv-dwixS3%cSyjA|_O@-#aO{6;oZm5GXscH?;##`t#`72`1# zC^mj}VpXQ69fnk9x13+yM{ydS_w*aNrItfG@g zcn-3OD5rGGzHaN3I1ae zk=??CPhmAK4iC$>EZ5x^cmwk(lZqnlwt(qpT&M{JqpaBh6(JlYfaO(%Kp5F7M8OtP zC!)!CLoLg!%wk8HVFEvha#ubElSBc!FBn3oczaBcN(g8X3T)^`g(yfR3s;5krT$i9 zP*hTf-n!%i0MEELuaA;l{7rz5uCn~dI{)1v`|EyYXlgCVtiL^*;{!bYwQuWjxQ6V-ywXm3hh7hbvd88T7pkfs%}q4kkPx{XPmQ z#PX;=(LGPUu$c-RY<_E0p9TK+737ZB4^VmM1yzwh{~ceSr~r;}0-Bly)WLuXQ)xn$ zsuhZFy%lk%G@`wKZ@in%(x?K(CNmc>df(A!E;uXYw$K?TQrTY737MxTwRKBPAkZso z&*}PyI?H4DF$@Hn+UBq5Qx>?_{VKV}Ehi7)qe$i`_~mvKN-!*V`^)HJ93CN9s+Ux} zlAfh+A6~>M&YD|Zi&*~j0AB?m`zM~5&ug;nWLTZ8l|nFM^6bWyp#fAzJh0ko{%^+c ziaGep7yqUk+-0><%7306Avk#mMSo^LVz6Xen%Z(1rWMtcMY-ZFdcz++XiC|aT{$+S zGpreH9)iQm40wo8d_bQ zSC6R{nZ95^R-Z%z)%qw+hB2q`wmT+k0qEywzNMD=`ahc;W1G zvrQPaH_rmoa*sCP)`V$`{c8Su_Cc0FPA>e_{A#Qj#GpF5sZ4IrhiKDplLW*b{M zFH*^Xi*%I>e5S7gofkhMOK%)(L_V{9yo&+Wo@~|8_ z-=i9BEBm<*Zfs>!l!2Wd>Q5zWg3%^c)t?!%NZ$|AiA%*Ds%#K!D^epzd4gHjiBZ%Laf3D1usP zL7kj5YvUq{5&MuvJ%(`^lc|>fW8>RjeHr+WRREt_6iAH>KLZm|M10gldYbDv?peim zLFv0uTMgp$ z;=y=5ejvAR)Chq;jn6*fcA^?3WtvQ20Jp_Q@b_|R z=7>=M@*_kHj7}8xZmZ$4H{Epu*)A^#R!MoZE41s@J)#=J5QaE?lR&{8KR{=2=Hs{M zNTf~B-NI9*i(u8Bi+9w8*gVjU?%M(3L0B613AJ2w->wHvP1yj1n&LtYP-RB}RO6O& z^Qo+c#uRq0eZvppPAv(X8Xn-zA$T*IHpICQ{p6f*!CBkJ@g{ed_s)MFw0{1#WBnDr1TyD zxv$dXRGX72pzwiTUPuuDeoHq$M-DXtPB&Q5ZiQ1p4lBWLGTydC_DDS-3;>r+zJ_>s z*n2(2t;lDue;_Jt>0eHJhN0}$D*W(MewKG)zEKy^u9=m`qz<4JMf0+LlISHl2BM($ ziA2j5q7e`p6**#7TbS&tXXZk07fINyHsuyVl+7?$%1=aKdHY1H$aWZ!YC8f=8z=B| zV}|_9r~FC1)ReFB!iSf=PBLhQed{Kg-BCb1mjlUet>*qwH(BM;gZx?J1+~b*#YPGS znJ~3rbDAzdCH*J**!VMj{gW*zI{~&Z-BD+f@G`2$R^x|(Rn9-L0@U!dQ52S?wncAa ziMtkYz*v*_`+afsOe24sZu!G}O_&-VSMa`+%5$}jZZGICR-?d=88YeC(IpE$Rw31^ zHA#)k;&Ttx?#1UMUj`Lfkj@hf<8))UM z^ycO3SAPYZwb7#Zt-7Qyghq^B@juRKOeD0_{ONxL%Cr!@MJ+g>h9BK;c~9tj)NpOv NZ+LulaTm_M`aiJihJOG6 diff --git a/lib/yui/build/moodle-core-dock/moodle-core-dock.js b/lib/yui/build/moodle-core-dock/moodle-core-dock.js deleted file mode 100644 index 143593e48ad88b5fa076fc9fff39e4808852f416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69753 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 BDPsTt diff --git a/lib/yui/src/dock/build.json b/lib/yui/src/dock/build.json deleted file mode 100644 index 24c2f91892f..00000000000 --- a/lib/yui/src/dock/build.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "moodle-core-dock", - "builds": { - "moodle-core-dock": { - "jsfiles": [ - "dock.js", - "panel.js", - "tabheightmanager.js", - "actionkey.js", - "block.js", - "dockeditem.js" - ] - }, - "moodle-core-dock-loader": { - "jsfiles": [ - "loader.js" - ] - } - } -} diff --git a/lib/yui/src/dock/js/actionkey.js b/lib/yui/src/dock/js/actionkey.js deleted file mode 100644 index 1942c6b6c1e..00000000000 --- a/lib/yui/src/dock/js/actionkey.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Dock JS. - * - * This file contains the action key event definition that is used for accessibility handling within the Dock. - * - * @module moodle-core-dock - */ - -/** - * A 'dock:actionkey' Event. - * The event consists of the left arrow, right arrow, enter and space keys. - * More keys can be mapped to action meanings. - * actions: collapse , expand, toggle, enter. - * - * This event is subscribed to by dockitems. - * The on() method to subscribe allows specifying the desired trigger actions as JSON. - * - * This event can also be delegated if needed. - * - * @namespace M.core.dock - * @class ActionKey - */ -Y.Event.define("dock:actionkey", { - // Webkit and IE repeat keydown when you hold down arrow keys. - // Opera links keypress to page scroll; others keydown. - // Firefox prevents page scroll via preventDefault() on either - // keydown or keypress. - _event: (Y.UA.webkit || Y.UA.ie) ? 'keydown' : 'keypress', - - /** - * The keys to trigger on. - * @property _keys - */ - _keys: { - // arrows - '37': 'collapse', - '39': 'expand', - // (@todo: lrt/rtl/M.core_dock.cfg.orientation decision to assign arrow to meanings) - '32': 'toggle', - '13': 'enter' - }, - - /** - * Handles key events - * @method _keyHandler - * @param {EventFacade} e - * @param {SyntheticEvent.Notifier} notifier The notifier used to trigger the execution of subscribers - * @param {Object} args - */ - _keyHandler: function(e, notifier, args) { - var actObj; - if (!args.actions) { - actObj = {collapse: true, expand: true, toggle: true, enter: true}; - } else { - actObj = args.actions; - } - if (this._keys[e.keyCode] && actObj[this._keys[e.keyCode]]) { - e.action = this._keys[e.keyCode]; - notifier.fire(e); - } - }, - - /** - * Subscribes to events. - * @method on - * @param {Node} node The node this subscription was applied to. - * @param {Subscription} sub The object tracking this subscription. - * @param {SyntheticEvent.Notifier} notifier The notifier used to trigger the execution of subscribers - */ - on: function(node, sub, notifier) { - // subscribe to _event and ask keyHandler to handle with given args[0] (the desired actions). - if (sub.args === null) { - // no actions given - sub._detacher = node.on(this._event, this._keyHandler, this, notifier, {actions: false}); - } else { - sub._detacher = node.on(this._event, this._keyHandler, this, notifier, sub.args[0]); - } - }, - - /** - * Detaches an event listener - * @method detach - * @param {Node} node The node this subscription was applied to. - * @param {Subscription} sub The object tracking this subscription. - * @param {SyntheticEvent.Notifier} notifier The notifier used to trigger the execution of subscribers - */ - detach: function(node, sub) { - // detach our _detacher handle of the subscription made in on() - sub._detacher.detach(); - }, - - /** - * Creates a delegated event listener. - * @method delegate - * @param {Node} node The node this subscription was applied to. - * @param {Subscription} sub The object tracking this subscription. - * @param {SyntheticEvent.Notifier} notifier The notifier used to trigger the execution of subscribers - * @param {String|function} filter Selector string or function that accpets an event object and returns null. - */ - delegate: function(node, sub, notifier, filter) { - // subscribe to _event and ask keyHandler to handle with given args[0] (the desired actions). - if (sub.args === null) { - // no actions given - sub._delegateDetacher = node.delegate(this._event, this._keyHandler, filter, this, notifier, {actions: false}); - } else { - sub._delegateDetacher = node.delegate(this._event, this._keyHandler, filter, this, notifier, sub.args[0]); - } - }, - - /** - * Detaches a delegated event listener. - * @method detachDelegate - * @param {Node} node The node this subscription was applied to. - * @param {Subscription} sub The object tracking this subscription. - * @param {SyntheticEvent.Notifier} notifier The notifier used to trigger the execution of subscribers - * @param {String|function} filter Selector string or function that accpets an event object and returns null. - */ - detachDelegate: function(node, sub) { - sub._delegateDetacher.detach(); - } -}); diff --git a/lib/yui/src/dock/js/block.js b/lib/yui/src/dock/js/block.js deleted file mode 100644 index cb2ed73d486..00000000000 --- a/lib/yui/src/dock/js/block.js +++ /dev/null @@ -1,246 +0,0 @@ -/* global BLOCK, LOGNS, DOCKEDITEM */ - -/** - * Dock JS. - * - * This file contains the block class used to manage blocks (both docked and not) for the dock. - * - * @module moodle-core-dock - */ - -/** - * Block. - * - * @namespace M.core.dock - * @class Block - * @constructor - * @extends Base - */ -BLOCK = function() { - BLOCK.superclass.constructor.apply(this, arguments); -}; -BLOCK.prototype = { - /** - * A content place holder used when the block has been docked. - * @property contentplaceholder - * @protected - * @type Node - */ - contentplaceholder: null, - /** - * The skip link associated with this block. - * @property contentskipanchor - * @protected - * @type Node - */ - contentskipanchor: null, - /** - * The cached content node for the actual block - * @property cachedcontentnode - * @protected - * @type Node - */ - cachedcontentnode: null, - /** - * If true the user preference isn't updated - * @property skipsetposition - * @protected - * @type Boolean - */ - skipsetposition: true, - /** - * The dock item associated with this block - * @property dockitem - * @protected - * @type DOCKEDITEM - */ - dockitem: null, - /** - * Called during the initialisation process of the object. - * @method initializer - */ - initializer: function() { - var node = Y.one('#inst' + this.get('id')); - if (!node) { - return false; - } - - Y.log('Initialised block with instance id:' + this.get('id'), 'debug', LOGNS); - - M.core.dock.ensureMoveToIconExists(node); - - // Move the block straight to the dock if required - if (node.hasClass(CSS.dockonload)) { - node.removeClass(CSS.dockonload); - this.moveToDock(); - } - this.skipsetposition = false; - return true; - }, - /** - * Returns the class associated with this block. - * @method _getBlockClass - * @private - * @param {Node} node - * @return String - */ - _getBlockClass: function(node) { - var block = node.getData('block'), - classes, - matches; - if (Y.Lang.isString(block) && block !== '') { - return block; - } - classes = node.getAttribute('className').toString(); - matches = /(^| )block_([^ ]+)/.exec(classes); - if (matches) { - return matches[2]; - } - return matches; - }, - - /** - * This function is responsible for moving a block from the page structure onto the dock. - * @method moveToDock - * @param {EventFacade} e - */ - moveToDock: function(e) { - if (e) { - e.halt(true); - } - - var dock = M.core.dock.get(), - id = this.get('id'), - blockcontent = Y.one('#inst' + id).one('.content'), - icon = (window.right_to_left()) ? 't/dock_to_block_rtl' : 't/dock_to_block', - breakchar = (location.href.match(/\?/)) ? '&' : '?', - blocktitle, - blockcommands, - movetoimg, - moveto; - - if (!blockcontent) { - return; - } - - Y.log('Moving block to the dock:' + this.get('id'), 'debug', LOGNS); - - this.recordBlockState(); - - blocktitle = this.cachedcontentnode.one('.title h2').cloneNode(true); - - // Build up the block commands. - // These should not actually added to the DOM. - blockcommands = this.cachedcontentnode.one('.title .commands'); - if (blockcommands) { - blockcommands = blockcommands.cloneNode(true); - } else { - blockcommands = Y.Node.create('
'); - } - movetoimg = Y.Node.create('').setAttrs({ - alt: Y.Escape.html(M.util.get_string('undockitem', 'block')), - title: Y.Escape.html(M.util.get_string('undockblock', 'block', blocktitle.get('innerHTML'))), - src: M.util.image_url(icon, 'moodle') - }); - moveto = Y.Node.create('').setAttrs({ - href: Y.config.win.location.href + breakchar + 'dock=' + id - }); - moveto.append(movetoimg); - blockcommands.append(moveto.append(movetoimg)); - - // Create a new dock item for the block - this.dockitem = new DOCKEDITEM({ - block: this, - dock: dock, - blockinstanceid: id, - title: blocktitle, - contents: blockcontent, - commands: blockcommands, - blockclass: this._getBlockClass(Y.one('#inst' + id)) - }); - // Register an event so that when it is removed we can put it back as a block - dock.add(this.dockitem); - - if (!this.skipsetposition) { - // save the users preference - M.util.set_user_preference('docked_block_instance_' + id, 1); - } - - this.set('isDocked', true); - }, - /** - * Records the block state and adds it to the docks holding area. - * @method recordBlockState - */ - recordBlockState: function() { - var id = this.get('id'), - dock = M.core.dock.get(), - node = Y.one('#inst' + id), - skipanchor = node.previous(); - // Disable the skip anchor when docking - if (skipanchor.hasClass('skip-block')) { - this.contentskipanchor = skipanchor; - this.contentskipanchor.hide(); - } - this.cachedcontentnode = node; - this.contentplaceholder = Y.Node.create('
'); - node.replace(this.contentplaceholder); - dock.addToHoldingArea(node); - node = null; - }, - - /** - * This function removes a block from the dock and puts it back into the page structure. - * @method returnToPage - * @return {Boolean} - */ - returnToPage: function() { - var id = this.get('id'); - - Y.log('Moving block out of the dock:' + this.get('id'), 'debug', LOGNS); - - // Enable the skip anchor when going back to block mode - if (this.contentskipanchor) { - this.contentskipanchor.show(); - } - - if (this.cachedcontentnode.one('.header')) { - this.cachedcontentnode.one('.header').insert(this.dockitem.get('contents'), 'after'); - } else { - this.cachedcontentnode.insert(this.dockitem.get('contents')); - } - - this.contentplaceholder.replace(this.cachedcontentnode); - this.cachedcontentnode = null; - - M.util.set_user_preference('docked_block_instance_' + id, 0); - this.set('isDocked', false); - return true; - } -}; -Y.extend(BLOCK, Y.Base, BLOCK.prototype, { - NAME: 'moodle-core-dock-block', - ATTRS: { - /** - * The block instance ID - * @attribute id - * @writeOnce - * @type Number - */ - id: { - writeOnce: 'initOnly', - setter: function(value) { - return parseInt(value, 10); - } - }, - /** - * True if the block has been docked. - * @attribute isDocked - * @default false - * @type Boolean - */ - isDocked: { - value: false - } - } -}); diff --git a/lib/yui/src/dock/js/dock.js b/lib/yui/src/dock/js/dock.js deleted file mode 100644 index 29e85e5203a..00000000000 --- a/lib/yui/src/dock/js/dock.js +++ /dev/null @@ -1,1158 +0,0 @@ -/** - * Dock JS. - * - * This file contains the DOCK object and all dock related global namespace methods and properties. - * - * @module moodle-core-dock - */ - -var LOGNS = 'moodle-core-dock', - BODY = Y.one(Y.config.doc.body), - CSS = { - dock: 'dock', // CSS Class applied to the dock box - dockspacer: 'dockspacer', // CSS class applied to the dockspacer - controls: 'controls', // CSS class applied to the controls box - body: 'has_dock', // CSS class added to the body when there is a dock - buttonscontainer: 'buttons_container', - dockeditem: 'dockeditem', // CSS class added to each item in the dock - dockeditemcontainer: 'dockeditem_container', - dockedtitle: 'dockedtitle', // CSS class added to the item's title in each dock - activeitem: 'activeitem', // CSS class added to the active item - dockonload: 'dock_on_load' - }, - SELECTOR = { - dockableblock: '.block[data-instanceid][data-dockable]', - blockmoveto: '.block[data-instanceid][data-dockable] .moveto', - panelmoveto: '#dockeditempanel .commands a.moveto', - dockonload: '.block.' + CSS.dockonload, - blockregion: '[data-blockregion]' - }, - DOCK, - DOCKPANEL, - TABHEIGHTMANAGER, - BLOCK, - DOCKEDITEM; // eslint-disable-line no-unused-vars - -M.core = M.core || {}; -M.core.dock = M.core.dock || {}; - -/** - * The dock - once initialised. - * - * @private - * @property _dock - * @type DOCK - */ -M.core.dock._dock = null; - -/** - * An associative array of dockable blocks. - * @property _dockableblocks - * @type {Array} An array of BLOCK objects organised by instanceid. - * @private - */ -M.core.dock._dockableblocks = {}; - -/** - * Initialises the dock. - * This method registers dockable blocks, and creates delegations to dock them. - * @static - * @method init - */ -M.core.dock.init = function() { - Y.all(SELECTOR.dockableblock).each(M.core.dock.registerDockableBlock); - Y.Global.on(M.core.globalEvents.BLOCK_CONTENT_UPDATED, function(e) { - M.core.dock.notifyBlockChange(e.instanceid); - }, this); - BODY.delegate('click', M.core.dock.dockBlock, SELECTOR.blockmoveto); - BODY.delegate('key', M.core.dock.dockBlock, SELECTOR.blockmoveto, 'enter'); -}; - -/** - * Returns an instance of the dock. - * Initialises one if one hasn't already being initialised. - * - * @static - * @method get - * @return DOCK - */ -M.core.dock.get = function() { - if (this._dock === null) { - this._dock = new DOCK(); - } - return this._dock; -}; - -/** - * Registers a dockable block with the dock. - * - * @static - * @method registerDockableBlock - * @param {int} id The block instance ID. - * @return void - */ -M.core.dock.registerDockableBlock = function(id) { - if (typeof id === 'object' && typeof id.getData === 'function') { - id = id.getData('instanceid'); - } - M.core.dock._dockableblocks[id] = new BLOCK({id: id}); -}; - -/** - * Docks a block given either its instanceid, its node, or an event fired from within the block. - * @static - * @method dockBlockByInstanceID - * @param id - * @return void - */ -M.core.dock.dockBlock = function(id) { - if (typeof id === 'object' && id.target !== 'undefined') { - id = id.target; - } - if (typeof id === "object") { - if (!id.test(SELECTOR.dockableblock)) { - id = id.ancestor(SELECTOR.dockableblock); - } - if (typeof id === 'object' && typeof id.getData === 'function' && !id.ancestor('.' + CSS.dock)) { - id = id.getData('instanceid'); - } else { - Y.log('Invalid instanceid given to dockBlockByInstanceID', 'warn', LOGNS); - return; - } - } - var block = M.core.dock._dockableblocks[id]; - if (block) { - block.moveToDock(); - } -}; - -/** - * Fixes the title orientation. Rotating it if required. - * - * @static - * @method fixTitleOrientation - * @param {Node} title The title node we are looking at. - * @param {String} text The string to use as the title. - * @return {Node} The title node to use. - */ -M.core.dock.fixTitleOrientation = function(title, text) { - var dock = M.core.dock.get(), - fontsize = '11px', - transform = 'rotate(270deg)', - test, - width, - height, - container, - verticaldirection = M.util.get_string('thisdirectionvertical', 'langconfig'); - title = Y.one(title); - - if (dock.get('orientation') !== 'vertical') { - // If the dock isn't vertical don't adjust it! - title.set('innerHTML', text); - return title; - } - - if (Y.UA.ie > 0 && Y.UA.ie < 8) { - // IE 6/7 can't rotate text so force ver - verticaldirection = 'ver'; - } - - switch (verticaldirection) { - case 'ver': - // Stacked is easy - return title.set('innerHTML', text.split('').join('
')); - case 'ttb': - transform = 'rotate(90deg)'; - break; - case 'btt': - // Nothing to do here. transform default is good. - break; - } - - if (Y.UA.ie === 8) { - // IE8 can flip the text via CSS but not handle transform. IE9+ can handle the CSS3 transform attribute. - title.set('innerHTML', text); - title.setAttribute('style', 'writing-mode: tb-rl; filter: flipV flipH;display:inline;'); - title.addClass('filterrotate'); - return title; - } - - // We need to fix a font-size - sorry theme designers. - test = Y.Node.create('

' + text + '

'); - BODY.insert(test, 0); - width = test.one('span').get('offsetWidth') * 1.2; - height = test.one('span').get('offsetHeight'); - test.remove(); - - title.set('innerHTML', text); - title.addClass('css3transform'); - - // Move the title into position - title.setStyles({ - 'position': 'relative', - 'fontSize': fontsize, - 'width': width, - 'top': (width - height) / 2 - }); - - // Positioning is different when in RTL mode. - if (window.right_to_left()) { - title.setStyle('left', width / 2 - height); - } else { - title.setStyle('right', width / 2 - height); - } - - // Rotate the text - title.setStyles({ - 'transform': transform, - '-ms-transform': transform, - '-moz-transform': transform, - '-webkit-transform': transform, - '-o-transform': transform - }); - - container = Y.Node.create('
'); - container.append(title); - container.setStyles({ - height: width + (width / 4), - position: 'relative' - }); - return container; -}; - -/** - * Informs the dock that the content of the block has changed. - * This should be called by the blocks JS code if its content has been updated dynamically. - * This method ensure the dock resizes if need be. - * - * @static - * @method notifyBlockChange - * @param {Number} instanceid - * @return void - */ -M.core.dock.notifyBlockChange = function(instanceid) { - if (this._dock !== null) { - var dock = M.core.dock.get(), - activeitem = dock.getActiveItem(); - if (activeitem && activeitem.get('blockinstanceid') === parseInt(instanceid, 10)) { - dock.resizePanelIfRequired(); - } - } -}; - -/** - * The Dock. - * - * @namespace M.core.dock - * @class Dock - * @constructor - * @extends Base - * @uses EventTarget - */ -DOCK = function() { - DOCK.superclass.constructor.apply(this, arguments); -}; -DOCK.prototype = { - /** - * Tab height manager used to ensure tabs are always visible. - * @protected - * @property tabheightmanager - * @type TABHEIGHTMANAGER - */ - tabheightmanager: null, - /** - * Will be an eventtype if there is an eventype to prevent. - * @protected - * @property preventevent - * @type String - */ - preventevent: null, - /** - * Will be an object if there is a delayed event in effect. - * @protected - * @property delayedevent - * @type {Object} - */ - delayedevent: null, - /** - * An array of currently docked items. - * @protected - * @property dockeditems - * @type Array - */ - dockeditems: [], - /** - * Set to true once the dock has been drawn. - * @protected - * @property dockdrawn - * @type Boolean - */ - dockdrawn: false, - /** - * The number of blocks that are currently docked. - * @protected - * @property count - * @type Number - */ - count: 0, - /** - * The total number of blocks that have been docked. - * @protected - * @property totalcount - * @type Number - */ - totalcount: 0, - /** - * A hidden node used as a holding area for DOM objects used by blocks that have been docked. - * @protected - * @property holdingareanode - * @type Node - */ - holdingareanode: null, - /** - * Called during the initialisation process of the object. - * @method initializer - */ - initializer: function() { - Y.log('Dock initialising', 'debug', LOGNS); - - // Publish the events the dock has - /** - * Fired when the dock first starts initialising. - * @event dock:starting - */ - this.publish('dock:starting', {prefix: 'dock', broadcast: 2, emitFacade: true, fireOnce: true}); - /** - * Fired after the dock is initialised for the first time. - * @event dock:initialised - */ - this.publish('dock:initialised', {prefix: 'dock', broadcast: 2, emitFacade: true, fireOnce: true}); - /** - * Fired before the dock structure and content is first created. - * @event dock:beforedraw - */ - this.publish('dock:beforedraw', {prefix: 'dock', fireOnce: true}); - /** - * Fired before the dock is changed from hidden to visible. - * @event dock:beforeshow - */ - this.publish('dock:beforeshow', {prefix: 'dock'}); - /** - * Fires after the dock has been changed from hidden to visible. - * @event dock:shown - */ - this.publish('dock:shown', {prefix: 'dock', broadcast: 2}); - /** - * Fired after the dock has been changed from visible to hidden. - * @event dock:hidden - */ - this.publish('dock:hidden', {prefix: 'dock', broadcast: 2}); - /** - * Fires when an item is added to the dock. - * @event dock:itemadded - */ - this.publish('dock:itemadded', {prefix: 'dock'}); - /** - * Fires when an item is removed from the dock. - * @event dock:itemremoved - */ - this.publish('dock:itemremoved', {prefix: 'dock'}); - /** - * Fires when a block is added or removed from the dock. - * This happens after the itemadded and itemremoved events have been called. - * @event dock:itemschanged - */ - this.publish('dock:itemschanged', {prefix: 'dock', broadcast: 2}); - /** - * Fires once when the docks panel is first initialised. - * @event dock:panelgenerated - */ - this.publish('dock:panelgenerated', {prefix: 'dock', fireOnce: true}); - /** - * Fires when the dock panel is about to be resized. - * @event dock:panelresizestart - */ - this.publish('dock:panelresizestart', {prefix: 'dock'}); - /** - * Fires after the dock panel has been resized. - * @event dock:resizepanelcomplete - */ - this.publish('dock:resizepanelcomplete', {prefix: 'dock'}); - - // Apply theme customisations here before we do any real work. - this._applyThemeCustomisation(); - // Inform everyone we are now about to initialise. - this.fire('dock:starting'); - this._ensureDockDrawn(); - // Inform everyone the dock has been initialised - this.fire('dock:initialised'); - }, - /** - * Ensures that the dock has been drawn. - * @private - * @method _ensureDockDrawn - * @return {Boolean} - */ - _ensureDockDrawn: function() { - if (this.dockdrawn === true) { - return true; - } - var dock = this._initialiseDockNode(), - clickargs = { - cssselector: '.' + CSS.dockedtitle, - delay: 0 - }, - mouseenterargs = { - cssselector: '.' + CSS.dockedtitle, - delay: 0.5, - iscontained: true, - preventevent: 'click', - preventdelay: 3 - }; - if (Y.UA.ie > 0 && Y.UA.ie < 7) { - // Adjust for IE 6 (can't handle fixed pos) - dock.setStyle('height', dock.get('winHeight') + 'px'); - } - - this.fire('dock:beforedraw'); - - this._initialiseDockControls(); - - this.tabheightmanager = new TABHEIGHTMANAGER({dock: this}); - - // Attach the required event listeners - // We use delegate here as that way a handful of events are created for the dock - // and all items rather than the same number for the dock AND every item individually - Y.delegate('click', this.handleEvent, this.get('dockNode'), '.' + CSS.dockedtitle, this, clickargs); - Y.delegate('mouseenter', this.handleEvent, this.get('dockNode'), '.' + CSS.dockedtitle, this, mouseenterargs); - this.get('dockNode').on('mouseleave', this.handleEvent, this, {cssselector: '#dock', delay: 0.5, iscontained: false}); - - Y.delegate('click', this.handleReturnToBlock, this.get('dockNode'), SELECTOR.panelmoveto, this); - Y.delegate('dock:actionkey', this.handleDockedItemEvent, this.get('dockNode'), '.' + CSS.dockeditem, this); - - BODY.on('click', this.handleEvent, this, {cssselector: 'body', delay: 0}); - this.on('dock:itemschanged', this.resizeBlockSpace, this); - this.on('dock:itemschanged', this.checkDockVisibility, this); - this.on('dock:itemschanged', this.resetFirstItem, this); - this.dockdrawn = true; - return true; - }, - /** - * Handles an actionkey event on the dock. - * @param {EventFacade} e - * @method handleDockedItemEvent - * @return {Boolean} - */ - handleDockedItemEvent: function(e) { - if (e.type !== 'dock:actionkey') { - return false; - } - var target = e.target, - dockeditem = '.' + CSS.dockeditem; - if (!target.test(dockeditem)) { - target = target.ancestor(dockeditem); - } - if (!target) { - return false; - } - e.halt(); - this.dockeditems[target.getAttribute('rel')].toggle(e.action); - }, - /** - * Call the theme customisation method "customise_dock_for_theme" if it exists. - * @private - * @method _applyThemeCustomisation - */ - _applyThemeCustomisation: function() { - // Check if there is a customisation function - if (typeof (customise_dock_for_theme) === 'function') { - // First up pre the legacy object. - M.core_dock = this; - M.core_dock.cfg = { - buffer: null, - orientation: null, - position: null, - spacebeforefirstitem: null, - removeallicon: null - }; - M.core_dock.css = { - dock: null, - dockspacer: null, - controls: null, - body: null, - buttonscontainer: null, - dockeditem: null, - dockeditemcontainer: null, - dockedtitle: null, - activeitem: null - }; - try { - // Run the customisation function - window.customise_dock_for_theme(this); - } catch (exception) { - // Do nothing at the moment. - Y.log('Exception while attempting to apply theme customisations.', 'error', LOGNS); - } - // Now to work out what they did. - var key, value, - warned = false, - cfgmap = { - buffer: 'bufferPanel', - orientation: 'orientation', - position: 'position', - spacebeforefirstitem: 'bufferBeforeFirstItem', - removeallicon: 'undockAllIconUrl' - }; - // Check for and apply any legacy configuration. - for (key in M.core_dock.cfg) { - if (Y.Lang.isString(key) && cfgmap[key]) { - value = M.core_dock.cfg[key]; - if (value === null) { - continue; - } - if (!warned) { - Y.log('Warning: customise_dock_for_theme has changed. Please update your code.', 'warn', LOGNS); - warned = true; - } - // Damn, the've set something. - Y.log('Note for customise_dock_for_theme code: M.core_dock.cfg.' + key + - ' is now dock.set(\'' + key + '\', value)', - 'debug', LOGNS); - this.set(cfgmap[key], value); - } - } - // Check for and apply any legacy CSS changes.. - for (key in M.core_dock.css) { - if (Y.Lang.isString(key)) { - value = M.core_dock.css[key]; - if (value === null) { - continue; - } - if (!warned) { - Y.log('Warning: customise_dock_for_theme has changed. Please update your code.', 'warn', LOGNS); - warned = true; - } - // Damn, they've set something. - Y.log('Note for customise_dock_for_theme code: M.core_dock.css.' + key + ' is now CSS.' + key + ' = value', - 'debug', LOGNS); - CSS[key] = value; - } - } - } - }, - /** - * Initialises the dock node, creating it and its content if required. - * - * @private - * @method _initialiseDockNode - * @return {Node} The dockNode - */ - _initialiseDockNode: function() { - var dock = this.get('dockNode'), - positionorientationclass = CSS.dock + '_' + this.get('position') + '_' + this.get('orientation'), - holdingarea = Y.Node.create('
').setStyles({display: 'none'}), - buttons = this.get('buttonsNode'), - container = this.get('itemContainerNode'); - - if (!dock) { - dock = Y.one('#' + CSS.dock); - } - if (!dock) { - dock = Y.Node.create('
'); - BODY.append(dock); - } - dock.setAttribute('role', 'menubar').addClass(positionorientationclass); - if (Y.all(SELECTOR.dockonload).size() === 0) { - // Nothing on the dock... hide it using CSS - dock.addClass('nothingdocked'); - } else { - positionorientationclass = CSS.body + '_' + this.get('position') + '_' + this.get('orientation'); - BODY.addClass(CSS.body).addClass(); - } - - if (!buttons) { - buttons = dock.one('.' + CSS.buttonscontainer); - } - if (!buttons) { - buttons = Y.Node.create('
'); - dock.append(buttons); - } - - if (!container) { - container = dock.one('.' + CSS.dockeditemcontainer); - } - if (!container) { - container = Y.Node.create('
'); - buttons.append(container); - } - - BODY.append(holdingarea); - this.holdingareanode = holdingarea; - - this.set('dockNode', dock); - this.set('buttonsNode', buttons); - this.set('itemContainerNode', container); - - return dock; - }, - /** - * Initialises the dock controls. - * - * @private - * @method _initialiseDockControls - */ - _initialiseDockControls: function() { - // Add a removeall button - // Must set the image src seperatly of we get an error with XML strict headers - - var removeall = Y.Node.create('' + M.util.get_string('undockall', 'block') + ''); - removeall.setAttribute('src', this.get('undockAllIconUrl')); - removeall.on('removeall|click', this.removeAll, this); - removeall.on('dock:actionkey', this.removeAll, this, {actions: {enter: true}}); - this.get('buttonsNode').append(Y.Node.create('
').append(removeall)); - }, - /** - * Returns the dock panel. Initialising it if it hasn't already been initialised. - * @method getPanel - * @return {DOCKPANEL} - */ - getPanel: function() { - var panel = this.get('panel'); - if (!panel) { - panel = new DOCKPANEL({dock: this}); - panel.on('panel:visiblechange', this.resize, this); - Y.on('windowresize', this.resize, this); - // Initialise the dockpanel .. should only happen once - this.set('panel', panel); - this.fire('dock:panelgenerated'); - } - return panel; - }, - /** - * Resizes the dock panel if required. - * @method resizePanelIfRequired - */ - resizePanelIfRequired: function() { - this.resize(); - var panel = this.get('panel'); - if (panel) { - panel.correctWidth(); - } - }, - /** - * Handles a dock event sending it to the right place. - * - * @method handleEvent - * @param {EventFacade} e - * @param {Object} options - * @return {Boolean} - */ - handleEvent: function(e, options) { - var item = this.getActiveItem(), - target, - targetid, - regex = /^dock_item_(\d+)_title$/, - self = this; - if (options.cssselector === 'body') { - if (!this.get('dockNode').contains(e.target)) { - if (item) { - item.hide(); - } - } - } else { - if (e.target.test(options.cssselector)) { - target = e.target; - } else { - target = e.target.ancestor(options.cssselector); - } - if (!target) { - return true; - } - if (this.preventevent !== null && e.type === this.preventevent) { - return true; - } - if (options.preventevent) { - this.preventevent = options.preventevent; - if (options.preventdelay) { - setTimeout(function() { - self.preventevent = null; - }, options.preventdelay * 1000); - } - } - if (this.delayedevent && this.delayedevent.timeout) { - clearTimeout(this.delayedevent.timeout); - this.delayedevent.event.detach(); - this.delayedevent = null; - } - if (options.delay > 0) { - return this.delayEvent(e, options, target); - } - targetid = target.get('id'); - if (targetid.match(regex)) { - item = this.dockeditems[targetid.replace(regex, '$1')]; - if (item.active) { - item.hide(); - } else { - item.show(); - } - } else if (item) { - item.hide(); - } - } - return true; - }, - /** - * Delays an event. - * - * @method delayEvent - * @param {EventFacade} event - * @param {Object} options - * @param {Node} target - * @return {Boolean} - */ - delayEvent: function(event, options, target) { - var self = this; - self.delayedevent = (function() { - return { - target: target, - event: BODY.on('mousemove', function(e) { - self.delayedevent.target = e.target; - }), - timeout: null - }; - })(self); - self.delayedevent.timeout = setTimeout(function() { - self.delayedevent.timeout = null; - self.delayedevent.event.detach(); - if (options.iscontained === self.get('dockNode').contains(self.delayedevent.target)) { - self.handleEvent(event, {cssselector: options.cssselector, delay: 0, iscontained: options.iscontained}); - } - }, options.delay * 1000); - return true; - }, - /** - * Resizes block spaces. - * @method resizeBlockSpace - */ - resizeBlockSpace: function() { - if (Y.all(SELECTOR.dockonload).size() > 0) { - // Do not resize during initial load - return; - } - - var populatedRegionCount = 0, - populatedBlockRegions = [], - unpopulatedBlockRegions = [], - isMoving = false, - populatedLegacyRegions = [], - containsLegacyRegions = false, - classesToAdd = [], - classesToRemove = []; - - // First look for understood regions. - Y.all(SELECTOR.blockregion).each(function(region) { - var regionname = region.getData('blockregion'); - if (region.all('.block').size() > 0) { - populatedBlockRegions.push(regionname); - populatedRegionCount++; - } else if (region.all('.block_dock_placeholder').size() > 0) { - unpopulatedBlockRegions.push(regionname); - } - }); - - // Next check for legacy regions. - Y.all('.block-region').each(function(region) { - if (region.test(SELECTOR.blockregion)) { - // This is a new region, we've already processed it. - return; - } - - // Sigh - there are legacy regions. - containsLegacyRegions = true; - - var regionname = region.get('id').replace(/^region\-/, 'side-'), - hasblocks = (region.all('.block').size() > 0); - - if (hasblocks) { - populatedLegacyRegions.push(regionname); - populatedRegionCount++; - } else { - // This legacy region has no blocks so cannot have the -only body tag. - classesToRemove.push( - regionname + '-only' - ); - } - }); - - if (BODY.hasClass('blocks-moving')) { - // When we're moving blocks, we do not want to collapse. - isMoving = true; - } - - Y.each(unpopulatedBlockRegions, function(regionname) { - classesToAdd.push( - // This block region is empty. - 'empty-region-' + regionname, - - // Which has the same effect as being docked. - 'docked-region-' + regionname - ); - classesToRemove.push( - // It is no-longer used. - 'used-region-' + regionname, - - // It cannot be the only region on screen if it is empty. - regionname + '-only' - ); - }, this); - - Y.each(populatedBlockRegions, function(regionname) { - classesToAdd.push( - // This block region is in use. - 'used-region-' + regionname - ); - classesToRemove.push( - // It is not empty. - 'empty-region-' + regionname, - - // Is it not docked. - 'docked-region-' + regionname - ); - - if (populatedRegionCount === 1 && isMoving === false) { - // There was only one populated region, and we are not moving blocks. - classesToAdd.push(regionname + '-only'); - } else { - // There were multiple block regions visible - remove any 'only' classes. - classesToRemove.push(regionname + '-only'); - } - }, this); - - if (containsLegacyRegions) { - // Handle the classing for legacy blocks. These have slightly different class names for the body. - if (isMoving || populatedRegionCount !== 1) { - Y.each(populatedLegacyRegions, function(regionname) { - classesToRemove.push(regionname + '-only'); - }); - } else { - Y.each(populatedLegacyRegions, function(regionname) { - classesToAdd.push(regionname + '-only'); - }); - } - } - - if (!BODY.hasClass('has-region-content')) { - // This page does not have a content region, therefore content-only is implied when all block regions are docked. - if (populatedRegionCount === 0 && isMoving === false) { - // If all blocks are docked, ensure that the content-only class is added anyway. - classesToAdd.push('content-only'); - } else { - // Otherwise remove it. - classesToRemove.push('content-only'); - } - } - - // Modify the body clases. - Y.each(classesToRemove, function(className) { - BODY.removeClass(className); - }); - Y.each(classesToAdd, function(className) { - BODY.addClass(className); - }); - }, - /** - * Adds an item to the dock. - * @method add - * @param {DOCKEDITEM} item - */ - add: function(item) { - // Set the dockitem id to the total count and then increment it. - item.set('id', this.totalcount); - Y.log('Adding block ' + item._getLogDescription() + ' to the dock.', 'debug', LOGNS); - this.count++; - this.totalcount++; - this.dockeditems[item.get('id')] = item; - this.dockeditems[item.get('id')].draw(); - this.fire('dock:itemadded', item); - this.fire('dock:itemschanged', item); - }, - /** - * Appends an item to the dock (putting it in the item container. - * @method append - * @param {Node} docknode - */ - append: function(docknode) { - this.get('itemContainerNode').append(docknode); - }, - /** - * Handles events that require a docked block to be returned to the page./ - * @method handleReturnToBlock - * @param {EventFacade} e - */ - handleReturnToBlock: function(e) { - e.halt(); - this.remove(this.getActiveItem().get('id')); - }, - /** - * Removes a docked item from the dock. - * @method remove - * @param {Number} id The docked item id. - * @return {Boolean} - */ - remove: function(id) { - if (!this.dockeditems[id]) { - return false; - } - Y.log('Removing block ' + this.dockeditems[id]._getLogDescription() + ' from the dock.', 'debug', LOGNS); - this.dockeditems[id].remove(); - delete this.dockeditems[id]; - this.count--; - this.fire('dock:itemremoved', id); - this.fire('dock:itemschanged', id); - return true; - }, - /** - * Ensures the the first item in the dock has the correct class. - * @method resetFirstItem - */ - resetFirstItem: function() { - this.get('dockNode').all('.' + CSS.dockeditem + '.firstdockitem').removeClass('firstdockitem'); - if (this.get('dockNode').one('.' + CSS.dockeditem)) { - this.get('dockNode').one('.' + CSS.dockeditem).addClass('firstdockitem'); - } - }, - /** - * Removes all docked blocks returning them to the page. - * @method removeAll - * @return {Boolean} - */ - removeAll: function() { - Y.log('Undocking all ' + this.dockeditems.length + ' blocks', 'debug', LOGNS); - var i; - for (i in this.dockeditems) { - if (Y.Lang.isNumber(i) || Y.Lang.isString(i)) { - this.remove(i); - } - } - return true; - }, - /** - * Hides the active item. - * @method hideActive - */ - hideActive: function() { - var item = this.getActiveItem(); - if (item) { - item.hide(); - } - }, - /** - * Checks wether the dock should be shown or hidden - * @method checkDockVisibility - */ - checkDockVisibility: function() { - var bodyclass = CSS.body + '_' + this.get('position') + '_' + this.get('orientation'); - if (!this.count) { - this.get('dockNode').addClass('nothingdocked'); - BODY.removeClass(CSS.body).removeClass(); - this.fire('dock:hidden'); - } else { - this.fire('dock:beforeshow'); - this.get('dockNode').removeClass('nothingdocked'); - BODY.addClass(CSS.body).addClass(bodyclass); - this.fire('dock:shown'); - } - }, - /** - * This function checks the size and position of the panel and moves/resizes if - * required to keep it within the bounds of the window. - * @method resize - * @return {Boolean} - */ - resize: function() { - var panel = this.getPanel(), - item = this.getActiveItem(), - buffer, - screenh, - docky, - titletop, - containery, - containerheight, - scrolltop, - panelheight, - dockx, - titleleft; - if (!panel.get('visible') || !item) { - return true; - } - - this.fire('dock:panelresizestart'); - if (this.get('orientation') === 'vertical') { - buffer = this.get('bufferPanel'); - screenh = parseInt(BODY.get('winHeight'), 10) - (buffer * 2); - docky = this.get('dockNode').getY(); - titletop = item.get('dockTitleNode').getY() - docky - buffer; - containery = this.get('itemContainerNode').getY(); - containerheight = containery - docky + this.get('buttonsNode').get('offsetHeight'); - scrolltop = panel.get('bodyNode').get('scrollTop'); - panel.get('bodyNode').setStyle('height', 'auto'); - panel.get('node').removeClass('oversized_content'); - panelheight = panel.get('node').get('offsetHeight'); - - if (Y.UA.ie > 0 && Y.UA.ie < 7) { - panel.setTop(item.get('dockTitleNode').getY()); - } else if (panelheight > screenh) { - panel.setTop(buffer - containerheight); - panel.get('bodyNode').setStyle('height', (screenh - panel.get('headerNode').get('offsetHeight')) + 'px'); - panel.get('node').addClass('oversized_content'); - } else if (panelheight > (screenh - (titletop - buffer))) { - panel.setTop(titletop - containerheight - (panelheight - (screenh - titletop)) + buffer); - } else { - panel.setTop(titletop - containerheight + buffer); - } - - if (scrolltop) { - panel.get('bodyNode').set('scrollTop', scrolltop); - } - } - - if (this.get('position') === 'right') { - panel.get('node').setStyle('left', '-' + panel.get('node').get('offsetWidth') + 'px'); - - } else if (this.get('position') === 'top') { - dockx = this.get('dockNode').getX(); - titleleft = item.get('dockTitleNode').getX() - dockx; - panel.get('node').setStyle('left', titleleft + 'px'); - } - - this.fire('dock:resizepanelcomplete'); - return true; - }, - /** - * Returns the currently active dock item or false - * @method getActiveItem - * @return {DOCKEDITEM} - */ - getActiveItem: function() { - var i; - for (i in this.dockeditems) { - if (this.dockeditems[i].active) { - return this.dockeditems[i]; - } - } - return false; - }, - /** - * Adds an item to the holding area. - * @method addToHoldingArea - * @param {Node} node - */ - addToHoldingArea: function(node) { - this.holdingareanode.append(node); - } -}; - -Y.extend(DOCK, Y.Base, DOCK.prototype, { - NAME: 'moodle-core-dock', - ATTRS: { - /** - * The dock itself. #dock. - * @attribute dockNode - * @type Node - * @writeOnce - */ - dockNode: { - writeOnce: true - }, - /** - * The docks panel. - * @attribute panel - * @type DOCKPANEL - * @writeOnce - */ - panel: { - writeOnce: true - }, - /** - * A container within the dock used for buttons. - * @attribute buttonsNode - * @type Node - * @writeOnce - */ - buttonsNode: { - writeOnce: true - }, - /** - * A container within the dock used for docked blocks. - * @attribute itemContainerNode - * @type Node - * @writeOnce - */ - itemContainerNode: { - writeOnce: true - }, - - /** - * Buffer used when containing a panel. - * @attribute bufferPanel - * @type Number - * @default 10 - */ - bufferPanel: { - value: 10, - validator: Y.Lang.isNumber - }, - - /** - * Position of the dock. - * @attribute position - * @type String - * @default left - */ - position: { - value: 'left', - validator: Y.Lang.isString - }, - - /** - * vertical || horizontal determines if we change the title - * @attribute orientation - * @type String - * @default vertical - */ - orientation: { - value: 'vertical', - validator: Y.Lang.isString, - setter: function(value) { - if (value.match(/^vertical$/i)) { - return 'vertical'; - } - return 'horizontal'; - } - }, - - /** - * Space between the top of the dock and the first item. - * @attribute bufferBeforeFirstItem - * @type Number - * @default 10 - */ - bufferBeforeFirstItem: { - value: 10, - validator: Y.Lang.isNumber - }, - - /** - * Icon URL for the icon to undock all blocks - * @attribute undockAllIconUrl - * @type String - * @default t/dock_to_block - */ - undockAllIconUrl: { - value: M.util.image_url((window.right_to_left()) ? 't/dock_to_block_rtl' : 't/dock_to_block', 'moodle'), - validator: Y.Lang.isString - } - } -}); -Y.augment(DOCK, Y.EventTarget); diff --git a/lib/yui/src/dock/js/dockeditem.js b/lib/yui/src/dock/js/dockeditem.js deleted file mode 100644 index 482decc6fc8..00000000000 --- a/lib/yui/src/dock/js/dockeditem.js +++ /dev/null @@ -1,324 +0,0 @@ -/* global LOGNS, DOCKEDITEM */ - -/** - * Dock JS. - * - * This file contains the docked item class. - * - * @module moodle-core-dock - */ - -/** - * Docked item. - * - * @namespace M.core.dock - * @class DockedItem - * @constructor - * @extends Base - * @uses EventTarget - */ -DOCKEDITEM = function() { - DOCKEDITEM.superclass.constructor.apply(this, arguments); -}; -DOCKEDITEM.prototype = { - /** - * Set to true if this item is currently being displayed. - * @property active - * @protected - * @type Boolean - */ - active: false, - /** - * Called during the initialisation process of the object. - * @method initializer - */ - initializer: function() { - var title = this.get('title'), - titlestring, - type; - /** - * Fired before the docked item has been drawn. - * @event dockeditem:drawstart - */ - this.publish('dockeditem:drawstart', {prefix: 'dockeditem'}); - /** - * Fired after the docked item has been drawn. - * @event dockeditem:drawcomplete - */ - this.publish('dockeditem:drawcomplete', {prefix: 'dockeditem'}); - /** - * Fired before the docked item is to be shown. - * @event dockeditem:showstart - */ - this.publish('dockeditem:showstart', {prefix: 'dockeditem'}); - /** - * Fired after the docked item has been shown. - * @event dockeditem:showcomplete - */ - this.publish('dockeditem:showcomplete', {prefix: 'dockeditem'}); - /** - * Fired before the docked item has been hidden. - * @event dockeditem:hidestart - */ - this.publish('dockeditem:hidestart', {prefix: 'dockeditem'}); - /** - * Fired after the docked item has been hidden. - * @event dockeditem:hidecomplete - */ - this.publish('dockeditem:hidecomplete', {prefix: 'dockeditem'}); - /** - * Fired when the docked item is removed from the dock. - * @event dockeditem:itemremoved - */ - this.publish('dockeditem:itemremoved', {prefix: 'dockeditem'}); - if (title) { - type = title.get('nodeName'); - titlestring = title.cloneNode(true); - title = Y.Node.create('<' + type + '>'); - title = M.core.dock.fixTitleOrientation(title, titlestring.get('text')); - this.set('title', title); - this.set('titlestring', titlestring); - } - Y.log('Initialised dockeditem for block with title "' + this._getLogDescription(), 'debug', LOGNS); - }, - /** - * This function draws the item on the dock. - * @method draw - * @return Boolean - */ - draw: function() { - var create = Y.Node.create, - dock = this.get('dock'), - count = dock.count, - docktitle, - dockitem, - closeicon, - closeiconimg, - id = this.get('id'); - - this.fire('dockeditem:drawstart'); - - docktitle = create(''); - docktitle.append(this.get('title')); - dockitem = create('
'); - if (count === 1) { - dockitem.addClass('firstdockitem'); - } - dockitem.append(docktitle); - dock.append(dockitem); - - closeiconimg = create('' + M.util.get_string('hidepanel', 'block') +
-                ''); - closeiconimg.setAttribute('src', M.util.image_url('t/dockclose', 'moodle')); - closeicon = create('').append(closeiconimg); - closeicon.on('forceclose|click', this.hide, this); - closeicon.on('dock:actionkey', this.hide, this, {actions: {enter: true, toggle: true}}); - this.get('commands').append(closeicon); - - this.set('dockTitleNode', docktitle); - this.set('dockItemNode', dockitem); - - this.fire('dockeditem:drawcomplete'); - return true; - }, - /** - * This function toggles makes the item active and shows it. - * @method show - * @return Boolean - */ - show: function() { - var dock = this.get('dock'), - panel = dock.getPanel(), - docktitle = this.get('dockTitleNode'); - - dock.hideActive(); - this.fire('dockeditem:showstart'); - Y.log('Showing ' + this._getLogDescription(), 'debug', LOGNS); - panel.setHeader(this.get('titlestring'), this.get('commands')); - panel.setBody(Y.Node.create('
') - .append(this.get('contents'))); - if (M.core.actionmenu !== undefined) { - M.core.actionmenu.newDOMNode(panel.get('node')); - } - panel.show(); - panel.correctWidth(); - - this.active = true; - // Add active item class first up - docktitle.addClass(CSS.activeitem); - // Set aria-exapanded property to true. - docktitle.set('aria-expanded', "true"); - this.fire('dockeditem:showcomplete'); - dock.resize(); - return true; - }, - /** - * This function hides the item and makes it inactive. - * @method hide - */ - hide: function() { - this.fire('dockeditem:hidestart'); - Y.log('Hiding "' + this._getLogDescription(), 'debug', LOGNS); - if (this.active) { - // No longer active - this.active = false; - // Hide the panel - this.get('dock').getPanel().hide(); - } - // Remove the active class - // Set aria-exapanded property to false - this.get('dockTitleNode').removeClass(CSS.activeitem).set('aria-expanded', "false"); - this.fire('dockeditem:hidecomplete'); - }, - /** - * A toggle between calling show and hide functions based on css.activeitem - * Applies rules to key press events (dock:actionkey) - * @method toggle - * @param {String} action - */ - toggle: function(action) { - var docktitle = this.get('dockTitleNode'); - if (docktitle.hasClass(CSS.activeitem) && action !== 'expand') { - this.hide(); - } else if (!docktitle.hasClass(CSS.activeitem) && action !== 'collapse') { - this.show(); - } - }, - /** - * This function removes the node and destroys it's bits. - * @method remove. - */ - remove: function() { - this.hide(); - // Return the block to its original position. - this.get('block').returnToPage(); - // Remove the dock item node. - this.get('dockItemNode').remove(); - this.fire('dockeditem:itemremoved'); - }, - /** - * Returns the description of this item to use for log calls. - * @method _getLogDescription - * @private - * @return {String} - */ - _getLogDescription: function() { - return this.get('titlestring').get('innerHTML') + ' (' + this.get('blockinstanceid') + ')'; - } -}; -Y.extend(DOCKEDITEM, Y.Base, DOCKEDITEM.prototype, { - NAME: 'moodle-core-dock-dockeditem', - ATTRS: { - /** - * The block this docked item is associated with. - * @attribute block - * @type BLOCK - * @writeOnce - * @required - */ - block: { - writeOnce: 'initOnly' - }, - /** - * The dock itself. - * @attribute dock - * @type DOCK - * @writeOnce - * @required - */ - dock: { - writeOnce: 'initOnly' - }, - /** - * The docked item ID. This will be given by the dock. - * @attribute id - * @type Number - */ - id: {}, - /** - * Block instance id.Taken from the associated block. - * @attribute blockinstanceid - * @type Number - * @writeOnce - */ - blockinstanceid: { - writeOnce: 'initOnly', - setter: function(value) { - return parseInt(value, 10); - } - }, - /** - * The title nodeof the docked item. - * @attribute title - * @type Node - * @default null - */ - title: { - value: null - }, - /** - * The title string. - * @attribute titlestring - * @type String - */ - titlestring: { - value: null - }, - /** - * The contents of the docked item - * @attribute contents - * @type Node - * @writeOnce - * @required - */ - contents: { - writeOnce: 'initOnly' - }, - /** - * Commands associated with the block. - * @attribute commands - * @type Node - * @writeOnce - * @required - */ - commands: { - writeOnce: 'initOnly' - }, - /** - * The block class. - * @attribute blockclass - * @type String - * @writeOnce - * @required - */ - blockclass: { - writeOnce: 'initOnly' - }, - /** - * The title node for the docked block. - * @attribute dockTitleNode - * @type Node - */ - dockTitleNode: { - value: null - }, - /** - * The item node for the docked block. - * @attribute dockItemNode - * @type Node - */ - dockItemNode: { - value: null - }, - /** - * The container for the docked item (will contain the block contents when visible) - * @attribute dockcontainerNode - * @type Node - */ - dockcontainerNode: { - value: null - } - } -}); -Y.augment(DOCKEDITEM, Y.EventTarget); diff --git a/lib/yui/src/dock/js/loader.js b/lib/yui/src/dock/js/loader.js deleted file mode 100644 index e1d0744c6d1..00000000000 --- a/lib/yui/src/dock/js/loader.js +++ /dev/null @@ -1,113 +0,0 @@ -var LOADERNAME = 'moodle-core-dock-loader'; - -M.core = M.core || {}; -M.core.dock = M.core.dock || {}; - -/** - * Creates the move to dock icon for dockable blocks if it doesn't already exist. - * - * @static - * @method M.core.dock.ensureMoveToIconExists - * @param {Node} blocknode The Blocks node (.block[data-instanceid]) - */ -M.core.dock.ensureMoveToIconExists = function(blocknode) { - if (blocknode.one('.moveto')) { - return true; - } - - var commands, - moveto = Y.Node.create(''), - blockaction = blocknode.one('.block_action'), - icon = 't/block_to_dock', - titleh2 = blocknode.one('.header .title h2'); - - // Must set the image src separately of we get an error with XML strict headers - if (Y.one(document.body).hasClass('dir-rtl')) { - icon = icon + '_rtl'; - } - moveto.setAttribute('alt', M.util.get_string('addtodock', 'block')); - if (titleh2) { - moveto.setAttribute('title', Y.Escape.html(M.util.get_string('dockblock', 'block', titleh2.getHTML()))); - } - moveto.setAttribute('src', M.util.image_url(icon, 'moodle')); - - if (blockaction) { - blockaction.prepend(moveto); - } else { - commands = blocknode.one('.header .title .commands'); - if (!commands && blocknode.one('.header .title')) { - commands = Y.Node.create('
'); - blocknode.one('.header .title').append(commands); - } - commands.append(moveto); - } - return true; -}; - -/** - * Dock loader. - * - * The dock loader is repsponsible for loading and initialising the dock only when required. - * By doing this we avoid the need to load unnecessary JavaScript into the page for the dock just incase - * it is being used. - * - * @static - * @namespace M.core.dock - * @class Loader - */ -M.core.dock.loader = M.core.dock.loader || {}; - -/** - * Delegation events - * @property delegationEvents - * @protected - * @type {Array} - */ -M.core.dock.loader.delegationEvents = []; - -/** - * Initialises the dock loader. - * - * The dock loader works by either firing the dock immediately if there are already docked blocks. - * Or if there are not any docked blocks delegating two events and then loading and firing the dock when one of - * those delegated events is triggered. - * - * @method initLoader - */ -M.core.dock.loader.initLoader = function() { - Y.log('Dock loader initialising', 'debug', LOADERNAME); - var dockedblocks = Y.all('.block[data-instanceid][data-dockable]'), - body = Y.one(document.body), - callback; - dockedblocks.each(function() { - var id = parseInt(this.getData('instanceid'), 10); - Y.log('Dock loader watching block with instance id: ' + id, 'debug', LOADERNAME); - M.core.dock.ensureMoveToIconExists(this); - }); - if (dockedblocks.some(function(node) { return node.hasClass('dock_on_load'); })) { - Y.log('Loading dock module', 'debug', LOADERNAME); - Y.use('moodle-core-dock', function() { - M.core.dock.init(); - }); - } else { - callback = function(e) { - var i, - block = this.ancestor('.block[data-instanceid]'), - instanceid = block.getData('instanceid'); - e.halt(); - for (i in M.core.dock.loader.delegationEvents) { - if (Y.Lang.isNumber(i) || Y.Lang.isString(i)) { - M.core.dock.loader.delegationEvents[i].detach(); - } - } - block.addClass('dock_on_load'); - Y.log('Loading dock module', 'debug', LOADERNAME); - Y.use('moodle-core-dock', function() { - M.util.set_user_preference('docked_block_instance_' + instanceid, 1); - M.core.dock.init(); - }); - }; - M.core.dock.loader.delegationEvents.push(body.delegate('click', callback, '.moveto')); - M.core.dock.loader.delegationEvents.push(body.delegate('key', callback, '.moveto', 'enter')); - } -}; diff --git a/lib/yui/src/dock/js/panel.js b/lib/yui/src/dock/js/panel.js deleted file mode 100644 index 83f87c5c546..00000000000 --- a/lib/yui/src/dock/js/panel.js +++ /dev/null @@ -1,238 +0,0 @@ -/* global DOCKPANEL, LOGNS */ - -/** - * Dock JS. - * - * This file contains the panel class used by the dock to display the content of docked blocks. - * - * @module moodle-core-dock - */ - -/** - * Panel. - * - * @namespace M.core.dock - * @class Panel - * @constructor - * @extends Base - * @uses EventTarget - */ -DOCKPANEL = function() { - DOCKPANEL.superclass.constructor.apply(this, arguments); -}; -DOCKPANEL.prototype = { - /** - * True once the panel has been created. - * @property created - * @protected - * @type {Boolean} - */ - created: false, - /** - * Called during the initialisation process of the object. - * @method initializer - */ - initializer: function() { - Y.log('Panel initialising', 'debug', LOGNS); - /** - * Fired before the panel is shown. - * @event dockpane::beforeshow - */ - this.publish('dockpanel:beforeshow', {prefix: 'dockpanel'}); - /** - * Fired after the panel is shown. - * @event dockpanel:shown - */ - this.publish('dockpanel:shown', {prefix: 'dockpanel'}); - /** - * Fired before the panel is hidden. - * @event dockpane::beforehide - */ - this.publish('dockpanel:beforehide', {prefix: 'dockpanel'}); - /** - * Fired after the panel is hidden. - * @event dockpanel:hidden - */ - this.publish('dockpanel:hidden', {prefix: 'dockpanel'}); - /** - * Fired when ever the dock panel is either hidden or shown. - * Always fired after the shown or hidden events. - * @event dockpanel:visiblechange - */ - this.publish('dockpanel:visiblechange', {prefix: 'dockpanel'}); - }, - /** - * Creates the Panel if it has not already been created. - * @method create - * @return {Boolean} - */ - create: function() { - if (this.created) { - return true; - } - this.created = true; - var dock = this.get('dock'), - node = dock.get('dockNode'); - this.set('node', Y.Node.create('
')); - this.set('contentNode', Y.Node.create('
')); - this.set('headerNode', Y.Node.create('
')); - this.set('bodyNode', Y.Node.create('
')); - node.append( - this.get('node').append(this.get('contentNode').append(this.get('headerNode')).append(this.get('bodyNode'))) - ); - }, - /** - * Displays the panel. - * @method show - */ - show: function() { - this.create(); - this.fire('dockpanel:beforeshow'); - this.set('visible', true); - this.get('node').removeClass('dockitempanel_hidden'); - this.fire('dockpanel:shown'); - this.fire('dockpanel:visiblechange'); - }, - /** - * Hides the panel - * @method hide - */ - hide: function() { - this.fire('dockpanel:beforehide'); - this.set('visible', false); - this.get('node').addClass('dockitempanel_hidden'); - this.fire('dockpanel:hidden'); - this.fire('dockpanel:visiblechange'); - }, - /** - * Sets the panel header. - * @method setHeader - * @param {Node|String} content - */ - setHeader: function(content) { - this.create(); - var header = this.get('headerNode'), - i; - header.setContent(content); - if (arguments.length > 1) { - for (i = 1; i < arguments.length; i++) { - if (Y.Lang.isNumber(i) || Y.Lang.isString(i)) { - header.append(arguments[i]); - } - } - } - }, - /** - * Sets the panel body. - * @method setBody - * @param {Node|String} content - */ - setBody: function(content) { - this.create(); - this.get('bodyNode').setContent(content); - }, - /** - * Sets the new top mark of the panel. - * - * @method setTop - * @param {Number} newtop - */ - setTop: function(newtop) { - if (Y.UA.ie > 0 && Y.UA.ie < 7) { - this.get('node').setY(newtop); - } else { - this.get('node').setStyle('top', newtop.toString() + 'px'); - } - }, - /** - * Corrects the width of the panel. - * @method correctWidth - */ - correctWidth: function() { - var bodyNode = this.get('bodyNode'), - // Width of content. - width = bodyNode.get('clientWidth'), - // Scrollable width of content. - scroll = bodyNode.get('scrollWidth'), - // Width of content container with overflow. - offsetWidth = bodyNode.get('offsetWidth'), - // The new width - defaults to the current width. - newWidth = width, - // The max width (80% of screen). - maxWidth = Math.round(bodyNode.get('winWidth') * 0.8); - - // If the scrollable width is more than the visible width - if (scroll > width) { - // Content width - // + the difference - // + any rendering difference (borders, padding) - // + 10px to make it look nice. - newWidth = width + (scroll - width) + ((offsetWidth - width) * 2) + 10; - } - - // Make sure its not more then the maxwidth - if (newWidth > maxWidth) { - newWidth = maxWidth; - } - - // Set the new width if its more than the old width. - if (newWidth > offsetWidth) { - this.get('node').setStyle('width', newWidth + 'px'); - } - } -}; -Y.extend(DOCKPANEL, Y.Base, DOCKPANEL.prototype, { - NAME: 'moodle-core-dock-panel', - ATTRS: { - /** - * The dock itself. - * @attribute dock - * @type DOCK - * @writeonce - */ - dock: { - writeOnce: 'initOnly' - }, - /** - * The node that contains the whole panel. - * @attribute node - * @type Node - */ - node: { - value: null - }, - /** - * The node that contains the header, body and footer. - * @attribute contentNode - * @type Node - */ - contentNode: { - value: null - }, - /** - * The node that contains the header - * @attribute headerNode - * @type Node - */ - headerNode: { - value: null - }, - /** - * The node that contains the body - * @attribute bodyNode - * @type Node - */ - bodyNode: { - value: null - }, - /** - * True if the panel is currently visible. - * @attribute visible - * @type Boolean - */ - visible: { - value: false - } - } -}); -Y.augment(DOCKPANEL, Y.EventTarget); diff --git a/lib/yui/src/dock/js/tabheightmanager.js b/lib/yui/src/dock/js/tabheightmanager.js deleted file mode 100644 index 448d9660b02..00000000000 --- a/lib/yui/src/dock/js/tabheightmanager.js +++ /dev/null @@ -1,121 +0,0 @@ -/* global TABHEIGHTMANAGER, LOGNS */ - -/** - * Dock JS. - * - * This file contains the tab height manager. - * The tab height manager is responsible for ensure all tabs are visible all the time. - * - * @module moodle-core-dock - */ - -/** - * Tab height manager. - * - * @namespace M.core.dock - * @class TabHeightManager - * @constructor - * @extends Base - */ -TABHEIGHTMANAGER = function() { - TABHEIGHTMANAGER.superclass.constructor.apply(this, arguments); -}; -TABHEIGHTMANAGER.prototype = { - /** - * Initialises the dock sizer which then attaches itself to the required - * events in order to monitor the dock - * @method initializer - */ - initializer: function() { - var dock = this.get('dock'); - dock.on('dock:itemschanged', this.checkSizing, this); - Y.on('windowresize', this.checkSizing, this); - }, - /** - * Check if the size dock items needs to be adjusted - * @method checkSizing - */ - checkSizing: function() { - var dock = this.get('dock'), - node = dock.get('dockNode'), - items = dock.dockeditems, - containermargin = parseInt(node.one('.dockeditem_container').getStyle('marginTop').replace('/[^0-9]+$/', ''), 10), - dockheight = node.get('offsetHeight') - containermargin, - controlheight = node.one('.controls').get('offsetHeight'), - buffer = (dock.get('bufferPanel') * 3), - possibleheight = dockheight - controlheight - buffer - (items.length * 2), - totalheight = 0, - id, dockedtitle; - if (items.length > 0) { - for (id in items) { - if (Y.Lang.isNumber(id) || Y.Lang.isString(id)) { - dockedtitle = Y.one(items[id].get('title')).ancestor('.' + CSS.dockedtitle); - if (dockedtitle) { - if (this.get('enabled')) { - dockedtitle.setStyle('height', 'auto'); - } - totalheight += dockedtitle.get('offsetHeight') || 0; - } - } - } - if (totalheight > possibleheight) { - this.enable(possibleheight); - } - } - }, - /** - * Enables the dock sizer and resizes where required. - * @method enable - * @param {Number} possibleheight - */ - enable: function(possibleheight) { - var dock = this.get('dock'), - items = dock.dockeditems, - count = dock.count, - runningcount = 0, - usedheight = 0, - id, itemtitle, itemheight, offsetheight; - Y.log('Enabling the dock tab sizer.', 'debug', LOGNS); - this.set('enabled', true); - for (id in items) { - if (Y.Lang.isNumber(id) || Y.Lang.isString(id)) { - itemtitle = Y.one(items[id].get('title')).ancestor('.' + CSS.dockedtitle); - if (!itemtitle) { - continue; - } - itemheight = Math.floor((possibleheight - usedheight) / (count - runningcount)); - offsetheight = itemtitle.get('offsetHeight'); - itemtitle.setStyle('overflow', 'hidden'); - if (offsetheight > itemheight) { - itemtitle.setStyle('height', itemheight + 'px'); - usedheight += itemheight; - } else { - usedheight += offsetheight; - } - runningcount++; - } - } - } -}; -Y.extend(TABHEIGHTMANAGER, Y.Base, TABHEIGHTMANAGER.prototype, { - NAME: 'moodle-core-tabheightmanager', - ATTRS: { - /** - * The dock. - * @attribute dock - * @type DOCK - * @writeOnce - */ - dock: { - writeOnce: 'initOnly' - }, - /** - * True if the item_sizer is being used, false otherwise. - * @attribute enabled - * @type Bool - */ - enabled: { - value: false - } - } -}); diff --git a/lib/yui/src/dock/meta/dock.json b/lib/yui/src/dock/meta/dock.json deleted file mode 100644 index 7616fbd9600..00000000000 --- a/lib/yui/src/dock/meta/dock.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "moodle-core-dock": { - "requires": [ - "base", - "node", - "event-custom", - "event-mouseenter", - "event-resize", - "escape", - "moodle-core-dock-loader", - "moodle-core-event" - ] - }, - "moodle-core-dock-loader": { - "requires": [ - "escape" - ] - } -} \ No newline at end of file -- 2.43.0