danielebarchiesi@0
|
1 /**
|
danielebarchiesi@0
|
2 * @file
|
danielebarchiesi@0
|
3 * Attaches behaviors for the Dashboard module.
|
danielebarchiesi@0
|
4 */
|
danielebarchiesi@0
|
5
|
danielebarchiesi@0
|
6 (function ($) {
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Implements Drupal.behaviors for the Dashboard module.
|
danielebarchiesi@0
|
10 */
|
danielebarchiesi@0
|
11 Drupal.behaviors.dashboard = {
|
danielebarchiesi@0
|
12 attach: function (context, settings) {
|
danielebarchiesi@0
|
13 $('#dashboard', context).once(function () {
|
danielebarchiesi@0
|
14 $(this).prepend('<div class="customize clearfix"><ul class="action-links"><li><a href="#">' + Drupal.t('Customize dashboard') + '</a></li></ul><div class="canvas"></div></div>');
|
danielebarchiesi@0
|
15 $('.customize .action-links a', this).click(Drupal.behaviors.dashboard.enterCustomizeMode);
|
danielebarchiesi@0
|
16 });
|
danielebarchiesi@0
|
17 Drupal.behaviors.dashboard.addPlaceholders();
|
danielebarchiesi@0
|
18 if (Drupal.settings.dashboard.launchCustomize) {
|
danielebarchiesi@0
|
19 Drupal.behaviors.dashboard.enterCustomizeMode();
|
danielebarchiesi@0
|
20 }
|
danielebarchiesi@0
|
21 },
|
danielebarchiesi@0
|
22
|
danielebarchiesi@0
|
23 addPlaceholders: function() {
|
danielebarchiesi@0
|
24 $('#dashboard .dashboard-region .region').each(function () {
|
danielebarchiesi@0
|
25 var empty_text = "";
|
danielebarchiesi@0
|
26 // If the region is empty
|
danielebarchiesi@0
|
27 if ($('.block', this).length == 0) {
|
danielebarchiesi@0
|
28 // Check if we are in customize mode and grab the correct empty text
|
danielebarchiesi@0
|
29 if ($('#dashboard').hasClass('customize-mode')) {
|
danielebarchiesi@0
|
30 empty_text = Drupal.settings.dashboard.emptyRegionTextActive;
|
danielebarchiesi@0
|
31 } else {
|
danielebarchiesi@0
|
32 empty_text = Drupal.settings.dashboard.emptyRegionTextInactive;
|
danielebarchiesi@0
|
33 }
|
danielebarchiesi@0
|
34 // We need a placeholder.
|
danielebarchiesi@0
|
35 if ($('.placeholder', this).length == 0) {
|
danielebarchiesi@0
|
36 $(this).append('<div class="placeholder"></div>');
|
danielebarchiesi@0
|
37 }
|
danielebarchiesi@0
|
38 $('.placeholder', this).html(empty_text);
|
danielebarchiesi@0
|
39 }
|
danielebarchiesi@0
|
40 else {
|
danielebarchiesi@0
|
41 $('.placeholder', this).remove();
|
danielebarchiesi@0
|
42 }
|
danielebarchiesi@0
|
43 });
|
danielebarchiesi@0
|
44 },
|
danielebarchiesi@0
|
45
|
danielebarchiesi@0
|
46 /**
|
danielebarchiesi@0
|
47 * Enters "customize" mode by displaying disabled blocks.
|
danielebarchiesi@0
|
48 */
|
danielebarchiesi@0
|
49 enterCustomizeMode: function () {
|
danielebarchiesi@0
|
50 $('#dashboard').addClass('customize-mode customize-inactive');
|
danielebarchiesi@0
|
51 Drupal.behaviors.dashboard.addPlaceholders();
|
danielebarchiesi@0
|
52 // Hide the customize link
|
danielebarchiesi@0
|
53 $('#dashboard .customize .action-links').hide();
|
danielebarchiesi@0
|
54 // Load up the disabled blocks
|
danielebarchiesi@0
|
55 $('div.customize .canvas').load(Drupal.settings.dashboard.drawer, Drupal.behaviors.dashboard.setupDrawer);
|
danielebarchiesi@0
|
56 },
|
danielebarchiesi@0
|
57
|
danielebarchiesi@0
|
58 /**
|
danielebarchiesi@0
|
59 * Exits "customize" mode by simply forcing a page refresh.
|
danielebarchiesi@0
|
60 */
|
danielebarchiesi@0
|
61 exitCustomizeMode: function () {
|
danielebarchiesi@0
|
62 $('#dashboard').removeClass('customize-mode customize-inactive');
|
danielebarchiesi@0
|
63 Drupal.behaviors.dashboard.addPlaceholders();
|
danielebarchiesi@0
|
64 location.href = Drupal.settings.dashboard.dashboard;
|
danielebarchiesi@0
|
65 },
|
danielebarchiesi@0
|
66
|
danielebarchiesi@0
|
67 /**
|
danielebarchiesi@0
|
68 * Sets up the drag-and-drop behavior and the 'close' button.
|
danielebarchiesi@0
|
69 */
|
danielebarchiesi@0
|
70 setupDrawer: function () {
|
danielebarchiesi@0
|
71 $('div.customize .canvas-content input').click(Drupal.behaviors.dashboard.exitCustomizeMode);
|
danielebarchiesi@0
|
72 $('div.customize .canvas-content').append('<a class="button" href="' + Drupal.settings.dashboard.dashboard + '">' + Drupal.t('Done') + '</a>');
|
danielebarchiesi@0
|
73
|
danielebarchiesi@0
|
74 // Initialize drag-and-drop.
|
danielebarchiesi@0
|
75 var regions = $('#dashboard div.region');
|
danielebarchiesi@0
|
76 regions.sortable({
|
danielebarchiesi@0
|
77 connectWith: regions,
|
danielebarchiesi@0
|
78 cursor: 'move',
|
danielebarchiesi@0
|
79 cursorAt: {top:0},
|
danielebarchiesi@0
|
80 dropOnEmpty: true,
|
danielebarchiesi@0
|
81 items: '> div.block, > div.disabled-block',
|
danielebarchiesi@0
|
82 placeholder: 'block-placeholder clearfix',
|
danielebarchiesi@0
|
83 tolerance: 'pointer',
|
danielebarchiesi@0
|
84 start: Drupal.behaviors.dashboard.start,
|
danielebarchiesi@0
|
85 over: Drupal.behaviors.dashboard.over,
|
danielebarchiesi@0
|
86 sort: Drupal.behaviors.dashboard.sort,
|
danielebarchiesi@0
|
87 update: Drupal.behaviors.dashboard.update
|
danielebarchiesi@0
|
88 });
|
danielebarchiesi@0
|
89 },
|
danielebarchiesi@0
|
90
|
danielebarchiesi@0
|
91 /**
|
danielebarchiesi@0
|
92 * Makes the block appear as a disabled block while dragging.
|
danielebarchiesi@0
|
93 *
|
danielebarchiesi@0
|
94 * This function is called on the jQuery UI Sortable "start" event.
|
danielebarchiesi@0
|
95 *
|
danielebarchiesi@0
|
96 * @param event
|
danielebarchiesi@0
|
97 * The event that triggered this callback.
|
danielebarchiesi@0
|
98 * @param ui
|
danielebarchiesi@0
|
99 * An object containing information about the item that is being dragged.
|
danielebarchiesi@0
|
100 */
|
danielebarchiesi@0
|
101 start: function (event, ui) {
|
danielebarchiesi@0
|
102 $('#dashboard').removeClass('customize-inactive');
|
danielebarchiesi@0
|
103 var item = $(ui.item);
|
danielebarchiesi@0
|
104
|
danielebarchiesi@0
|
105 // If the block is already in disabled state, don't do anything.
|
danielebarchiesi@0
|
106 if (!item.hasClass('disabled-block')) {
|
danielebarchiesi@0
|
107 item.css({height: 'auto'});
|
danielebarchiesi@0
|
108 }
|
danielebarchiesi@0
|
109 },
|
danielebarchiesi@0
|
110
|
danielebarchiesi@0
|
111 /**
|
danielebarchiesi@0
|
112 * Adapts block's width to the region it is moved into while dragging.
|
danielebarchiesi@0
|
113 *
|
danielebarchiesi@0
|
114 * This function is called on the jQuery UI Sortable "over" event.
|
danielebarchiesi@0
|
115 *
|
danielebarchiesi@0
|
116 * @param event
|
danielebarchiesi@0
|
117 * The event that triggered this callback.
|
danielebarchiesi@0
|
118 * @param ui
|
danielebarchiesi@0
|
119 * An object containing information about the item that is being dragged.
|
danielebarchiesi@0
|
120 */
|
danielebarchiesi@0
|
121 over: function (event, ui) {
|
danielebarchiesi@0
|
122 var item = $(ui.item);
|
danielebarchiesi@0
|
123
|
danielebarchiesi@0
|
124 // If the block is in disabled state, remove width.
|
danielebarchiesi@0
|
125 if ($(this).closest('#disabled-blocks').length) {
|
danielebarchiesi@0
|
126 item.css('width', '');
|
danielebarchiesi@0
|
127 }
|
danielebarchiesi@0
|
128 else {
|
danielebarchiesi@0
|
129 item.css('width', $(this).width());
|
danielebarchiesi@0
|
130 }
|
danielebarchiesi@0
|
131 },
|
danielebarchiesi@0
|
132
|
danielebarchiesi@0
|
133 /**
|
danielebarchiesi@0
|
134 * Adapts a block's position to stay connected with the mouse pointer.
|
danielebarchiesi@0
|
135 *
|
danielebarchiesi@0
|
136 * This function is called on the jQuery UI Sortable "sort" event.
|
danielebarchiesi@0
|
137 *
|
danielebarchiesi@0
|
138 * @param event
|
danielebarchiesi@0
|
139 * The event that triggered this callback.
|
danielebarchiesi@0
|
140 * @param ui
|
danielebarchiesi@0
|
141 * An object containing information about the item that is being dragged.
|
danielebarchiesi@0
|
142 */
|
danielebarchiesi@0
|
143 sort: function (event, ui) {
|
danielebarchiesi@0
|
144 var item = $(ui.item);
|
danielebarchiesi@0
|
145
|
danielebarchiesi@0
|
146 if (event.pageX > ui.offset.left + item.width()) {
|
danielebarchiesi@0
|
147 item.css('left', event.pageX);
|
danielebarchiesi@0
|
148 }
|
danielebarchiesi@0
|
149 },
|
danielebarchiesi@0
|
150
|
danielebarchiesi@0
|
151 /**
|
danielebarchiesi@0
|
152 * Sends block order to the server, and expand previously disabled blocks.
|
danielebarchiesi@0
|
153 *
|
danielebarchiesi@0
|
154 * This function is called on the jQuery UI Sortable "update" event.
|
danielebarchiesi@0
|
155 *
|
danielebarchiesi@0
|
156 * @param event
|
danielebarchiesi@0
|
157 * The event that triggered this callback.
|
danielebarchiesi@0
|
158 * @param ui
|
danielebarchiesi@0
|
159 * An object containing information about the item that was just dropped.
|
danielebarchiesi@0
|
160 */
|
danielebarchiesi@0
|
161 update: function (event, ui) {
|
danielebarchiesi@0
|
162 $('#dashboard').addClass('customize-inactive');
|
danielebarchiesi@0
|
163 var item = $(ui.item);
|
danielebarchiesi@0
|
164
|
danielebarchiesi@0
|
165 // If the user dragged a disabled block, load the block contents.
|
danielebarchiesi@0
|
166 if (item.hasClass('disabled-block')) {
|
danielebarchiesi@0
|
167 var module, delta, itemClass;
|
danielebarchiesi@0
|
168 itemClass = item.attr('class');
|
danielebarchiesi@0
|
169 // Determine the block module and delta.
|
danielebarchiesi@0
|
170 module = itemClass.match(/\bmodule-(\S+)\b/)[1];
|
danielebarchiesi@0
|
171 delta = itemClass.match(/\bdelta-(\S+)\b/)[1];
|
danielebarchiesi@0
|
172
|
danielebarchiesi@0
|
173 // Load the newly enabled block's content.
|
danielebarchiesi@0
|
174 $.get(Drupal.settings.dashboard.blockContent + '/' + module + '/' + delta, {},
|
danielebarchiesi@0
|
175 function (block) {
|
danielebarchiesi@0
|
176 if (block) {
|
danielebarchiesi@0
|
177 item.html(block);
|
danielebarchiesi@0
|
178 }
|
danielebarchiesi@0
|
179
|
danielebarchiesi@0
|
180 if (item.find('div.content').is(':empty')) {
|
danielebarchiesi@0
|
181 item.find('div.content').html(Drupal.settings.dashboard.emptyBlockText);
|
danielebarchiesi@0
|
182 }
|
danielebarchiesi@0
|
183
|
danielebarchiesi@0
|
184 Drupal.attachBehaviors(item);
|
danielebarchiesi@0
|
185 },
|
danielebarchiesi@0
|
186 'html'
|
danielebarchiesi@0
|
187 );
|
danielebarchiesi@0
|
188 // Remove the "disabled-block" class, so we don't reload its content the
|
danielebarchiesi@0
|
189 // next time it's dragged.
|
danielebarchiesi@0
|
190 item.removeClass("disabled-block");
|
danielebarchiesi@0
|
191 }
|
danielebarchiesi@0
|
192
|
danielebarchiesi@0
|
193 Drupal.behaviors.dashboard.addPlaceholders();
|
danielebarchiesi@0
|
194
|
danielebarchiesi@0
|
195 // Let the server know what the new block order is.
|
danielebarchiesi@0
|
196 $.post(Drupal.settings.dashboard.updatePath, {
|
danielebarchiesi@0
|
197 'form_token': Drupal.settings.dashboard.formToken,
|
danielebarchiesi@0
|
198 'regions': Drupal.behaviors.dashboard.getOrder
|
danielebarchiesi@0
|
199 }
|
danielebarchiesi@0
|
200 );
|
danielebarchiesi@0
|
201 },
|
danielebarchiesi@0
|
202
|
danielebarchiesi@0
|
203 /**
|
danielebarchiesi@0
|
204 * Returns the current order of the blocks in each of the sortable regions.
|
danielebarchiesi@0
|
205 *
|
danielebarchiesi@0
|
206 * @return
|
danielebarchiesi@0
|
207 * The current order of the blocks, in query string format.
|
danielebarchiesi@0
|
208 */
|
danielebarchiesi@0
|
209 getOrder: function () {
|
danielebarchiesi@0
|
210 var order = [];
|
danielebarchiesi@0
|
211 $('#dashboard div.region').each(function () {
|
danielebarchiesi@0
|
212 var region = $(this).parent().attr('id').replace(/-/g, '_');
|
danielebarchiesi@0
|
213 var blocks = $(this).sortable('toArray');
|
danielebarchiesi@0
|
214 $.each(blocks, function() {
|
danielebarchiesi@0
|
215 order.push(region + '[]=' + this);
|
danielebarchiesi@0
|
216 });
|
danielebarchiesi@0
|
217 });
|
danielebarchiesi@0
|
218 order = order.join('&');
|
danielebarchiesi@0
|
219 return order;
|
danielebarchiesi@0
|
220 }
|
danielebarchiesi@0
|
221 };
|
danielebarchiesi@0
|
222
|
danielebarchiesi@0
|
223 })(jQuery);
|