4fe74193bbd830617557dcff3a7f834e82593fa3
[autoinstalls/wordpress.git] / wp-admin / js / postbox.js
1 /* global ajaxurl */
2
3 var postboxes;
4
5 (function($) {
6         var $document = $( document );
7
8         postboxes = {
9                 handle_click : function () {
10                         var $el = $( this ),
11                                 p = $el.parent( '.postbox' ),
12                                 id = p.attr( 'id' ),
13                                 ariaExpandedValue;
14
15                         if ( 'dashboard_browser_nag' === id ) {
16                                 return;
17                         }
18
19                         p.toggleClass( 'closed' );
20
21                         ariaExpandedValue = ! p.hasClass( 'closed' );
22
23                         if ( $el.hasClass( 'handlediv' ) ) {
24                                 // The handle button was clicked.
25                                 $el.attr( 'aria-expanded', ariaExpandedValue );
26                         } else {
27                                 // The handle heading was clicked.
28                                 $el.closest( '.postbox' ).find( 'button.handlediv' )
29                                         .attr( 'aria-expanded', ariaExpandedValue );
30                         }
31
32                         if ( postboxes.page !== 'press-this' ) {
33                                 postboxes.save_state( postboxes.page );
34                         }
35
36                         if ( id ) {
37                                 if ( !p.hasClass('closed') && $.isFunction( postboxes.pbshow ) ) {
38                                         postboxes.pbshow( id );
39                                 } else if ( p.hasClass('closed') && $.isFunction( postboxes.pbhide ) ) {
40                                         postboxes.pbhide( id );
41                                 }
42                         }
43
44                         $document.trigger( 'postbox-toggled', p );
45                 },
46
47                 add_postbox_toggles : function (page, args) {
48                         var $handles = $( '.postbox .hndle, .postbox .handlediv' );
49
50                         this.page = page;
51                         this.init( page, args );
52
53                         $handles.on( 'click.postboxes',  this.handle_click );
54
55                         $('.postbox .hndle a').click( function(e) {
56                                 e.stopPropagation();
57                         });
58
59                         $( '.postbox a.dismiss' ).on( 'click.postboxes', function( e ) {
60                                 var hide_id = $(this).parents('.postbox').attr('id') + '-hide';
61                                 e.preventDefault();
62                                 $( '#' + hide_id ).prop('checked', false).triggerHandler('click');
63                         });
64
65                         $('.hide-postbox-tog').bind('click.postboxes', function() {
66                                 var $el = $(this),
67                                         boxId = $el.val(),
68                                         $postbox = $( '#' + boxId );
69
70                                 if ( $el.prop( 'checked' ) ) {
71                                         $postbox.show();
72                                         if ( $.isFunction( postboxes.pbshow ) ) {
73                                                 postboxes.pbshow( boxId );
74                                         }
75                                 } else {
76                                         $postbox.hide();
77                                         if ( $.isFunction( postboxes.pbhide ) ) {
78                                                 postboxes.pbhide( boxId );
79                                         }
80                                 }
81                                 postboxes.save_state( page );
82                                 postboxes._mark_area();
83                                 $document.trigger( 'postbox-toggled', $postbox );
84                         });
85
86                         $('.columns-prefs input[type="radio"]').bind('click.postboxes', function(){
87                                 var n = parseInt($(this).val(), 10);
88
89                                 if ( n ) {
90                                         postboxes._pb_edit(n);
91                                         postboxes.save_order( page );
92                                 }
93                         });
94                 },
95
96                 init : function(page, args) {
97                         var isMobile = $( document.body ).hasClass( 'mobile' ),
98                                 $handleButtons = $( '.postbox .handlediv' );
99
100                         $.extend( this, args || {} );
101                         $('#wpbody-content').css('overflow','hidden');
102                         $('.meta-box-sortables').sortable({
103                                 placeholder: 'sortable-placeholder',
104                                 connectWith: '.meta-box-sortables',
105                                 items: '.postbox',
106                                 handle: '.hndle',
107                                 cursor: 'move',
108                                 delay: ( isMobile ? 200 : 0 ),
109                                 distance: 2,
110                                 tolerance: 'pointer',
111                                 forcePlaceholderSize: true,
112                                 helper: 'clone',
113                                 opacity: 0.65,
114                                 stop: function() {
115                                         var $el = $( this );
116
117                                         if ( $el.find( '#dashboard_browser_nag' ).is( ':visible' ) && 'dashboard_browser_nag' != this.firstChild.id ) {
118                                                 $el.sortable('cancel');
119                                                 return;
120                                         }
121
122                                         postboxes.save_order(page);
123                                 },
124                                 receive: function(e,ui) {
125                                         if ( 'dashboard_browser_nag' == ui.item[0].id )
126                                                 $(ui.sender).sortable('cancel');
127
128                                         postboxes._mark_area();
129                                 }
130                         });
131
132                         if ( isMobile ) {
133                                 $(document.body).bind('orientationchange.postboxes', function(){ postboxes._pb_change(); });
134                                 this._pb_change();
135                         }
136
137                         this._mark_area();
138
139                         // Set the handle buttons `aria-expanded` attribute initial value on page load.
140                         $handleButtons.each( function () {
141                                 var $el = $( this );
142                                 $el.attr( 'aria-expanded', ! $el.parent( '.postbox' ).hasClass( 'closed' ) );
143                         });
144                 },
145
146                 save_state : function(page) {
147                         var closed = $('.postbox').filter('.closed').map(function() { return this.id; }).get().join(','),
148                                 hidden = $('.postbox').filter(':hidden').map(function() { return this.id; }).get().join(',');
149
150                         $.post(ajaxurl, {
151                                 action: 'closed-postboxes',
152                                 closed: closed,
153                                 hidden: hidden,
154                                 closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),
155                                 page: page
156                         });
157                 },
158
159                 save_order : function(page) {
160                         var postVars, page_columns = $('.columns-prefs input:checked').val() || 0;
161
162                         postVars = {
163                                 action: 'meta-box-order',
164                                 _ajax_nonce: $('#meta-box-order-nonce').val(),
165                                 page_columns: page_columns,
166                                 page: page
167                         };
168                         $('.meta-box-sortables').each( function() {
169                                 postVars[ 'order[' + this.id.split( '-' )[0] + ']' ] = $( this ).sortable( 'toArray' ).join( ',' );
170                         } );
171                         $.post( ajaxurl, postVars );
172                 },
173
174                 _mark_area : function() {
175                         var visible = $('div.postbox:visible').length, side = $('#post-body #side-sortables');
176
177                         $( '#dashboard-widgets .meta-box-sortables:visible' ).each( function() {
178                                 var t = $(this);
179
180                                 if ( visible == 1 || t.children('.postbox:visible').length )
181                                         t.removeClass('empty-container');
182                                 else
183                                         t.addClass('empty-container');
184                         });
185
186                         if ( side.length ) {
187                                 if ( side.children('.postbox:visible').length )
188                                         side.removeClass('empty-container');
189                                 else if ( $('#postbox-container-1').css('width') == '280px' )
190                                         side.addClass('empty-container');
191                         }
192                 },
193
194                 _pb_edit : function(n) {
195                         var el = $('.metabox-holder').get(0);
196
197                         if ( el ) {
198                                 el.className = el.className.replace(/columns-\d+/, 'columns-' + n);
199                         }
200
201                         $( document ).trigger( 'postboxes-columnchange' );
202                 },
203
204                 _pb_change : function() {
205                         var check = $( 'label.columns-prefs-1 input[type="radio"]' );
206
207                         switch ( window.orientation ) {
208                                 case 90:
209                                 case -90:
210                                         if ( !check.length || !check.is(':checked') )
211                                                 this._pb_edit(2);
212                                         break;
213                                 case 0:
214                                 case 180:
215                                         if ( $('#poststuff').length ) {
216                                                 this._pb_edit(1);
217                                         } else {
218                                                 if ( !check.length || !check.is(':checked') )
219                                                         this._pb_edit(2);
220                                         }
221                                         break;
222                         }
223                 },
224
225                 /* Callbacks */
226                 pbshow : false,
227
228                 pbhide : false
229         };
230
231 }(jQuery));