PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/assets/dashboard.index.js

https://github.com/kracher/dashboard
JavaScript | 274 lines | 205 code | 47 blank | 22 comment | 22 complexity | f06ec3c3ba4756678e876fb8063bd01a MD5 | raw file
  1. /*-----------------------------------------------------------------------------
  2. Language strings
  3. -----------------------------------------------------------------------------*/
  4. Symphony.Language.add({
  5. 'Untitled Panel': false,
  6. });
  7. /*-----------------------------------------------------------------------------
  8. Dashboard
  9. -----------------------------------------------------------------------------*/
  10. var Dashboard = {
  11. $dashboard: null,
  12. $h2: null,
  13. edit_mode: false,
  14. init: function() {
  15. var self = this;
  16. this.$dashboard = jQuery('#dashboard');
  17. this.$h2 = jQuery('h2:first');
  18. // Create New button
  19. jQuery('a.edit-mode').bind('click', function(e) {
  20. e.preventDefault();
  21. self.edit_mode = !self.edit_mode;
  22. var text = jQuery(this).text();
  23. var title = jQuery(this).attr('title');
  24. jQuery(this).text(title).attr('title', text);
  25. if (self.edit_mode === true) {
  26. self.$dashboard.addClass('edit');
  27. jQuery('.primary, .secondary').sortable('enable');
  28. } else {
  29. self.$dashboard.removeClass('edit');
  30. jQuery('.primary, .secondary').sortable('disable');
  31. }
  32. });
  33. // Create New button
  34. jQuery('#select-panel-type li').live('click', function(e) {
  35. e.preventDefault();
  36. self.showEditForm(jQuery(this).attr('class'));
  37. });
  38. jQuery('a[id^="select-"]').each(function(e) {
  39. var button = jQuery(this);
  40. var id = button.attr('id').replace(/select-/,'');
  41. var html = jQuery('<div class="create button select-button" id="select-'+id+'"><span>'+button.text()+' &darr;</span><ul/></div>');
  42. button.after(html).remove();
  43. var select = jQuery('select[name="'+id+'"]').addClass('hide');
  44. var button = jQuery('#select-' + id);
  45. var ul = button.find('ul');
  46. select.find('option').each(function(i, el) {
  47. var option = jQuery(el);
  48. ul.append('<li class="'+option.attr('value')+'">'+option.text()+'</li>');
  49. });
  50. });
  51. // Edit panel button
  52. jQuery('.panel a.panel-edit').live('click', function(e) {
  53. e.preventDefault();
  54. var id = jQuery(this).parent().attr('id').replace(/id-/,'');
  55. var panel_type = jQuery(this).parent().attr('class').replace(/panel /,'');
  56. self.showEditForm(panel_type, id);
  57. });
  58. // Delete panel button
  59. jQuery('#save-panel button[name="action[delete]"]').live('click', function(e) {
  60. e.preventDefault();
  61. self.savePanel(jQuery('form').serialize(), 'delete');
  62. });
  63. // Cancel form button
  64. jQuery('#save-panel input[name="action[cancel]"]').live('click', function(e) {
  65. e.preventDefault();
  66. self.hideEditForm(null, true);
  67. });
  68. // Save panel button
  69. jQuery('#save-panel input[name="action[submit]"]').live('click', function(e) {
  70. e.preventDefault();
  71. self.savePanel(jQuery('form').serialize(), 'submit');
  72. });
  73. // Save panel button (form submit default)
  74. jQuery('form').bind('submit', function(e) {
  75. e.preventDefault();
  76. self.savePanel(jQuery('form').serialize(), 'submit');
  77. });
  78. jQuery('.primary, .secondary').sortable({
  79. items: '.panel',
  80. connectWith: '.sortable-container',
  81. placeholder: 'panel-placeholder',
  82. handle: '> h3',
  83. revert: 200,
  84. disabled: true,
  85. start: function(event, ui) {
  86. jQuery('.panel-placeholder').height(ui.helper.height() + parseInt(ui.helper.css('padding-top')) + parseInt(ui.helper.css('padding-bottom')) + parseInt(ui.helper.css('border-top-width')) + parseInt(ui.helper.css('border-bottom-width')));
  87. },
  88. stop: function() {
  89. self.saveReordering();
  90. }
  91. });
  92. jQuery('.primary, .secondary').droppable({
  93. activeClass: 'hover',
  94. hoverClass: 'active'
  95. });
  96. // Panel name
  97. jQuery('#save-panel input[name="panel[label]"]').live('keyup change', function(e) {
  98. var name = jQuery(e.target).val();
  99. var title = jQuery('#save-panel h3 span');
  100. if(name) {
  101. title.text(name);
  102. }
  103. else {
  104. title.text(Symphony.Language.get('Untitled Panel'));
  105. }
  106. });
  107. },
  108. saveReordering: function() {
  109. var post_data = '';
  110. var i = 0;
  111. jQuery('.primary, .secondary').each(function(j) {
  112. var sort_order = 1;
  113. jQuery('.panel', this).each(function() {
  114. post_data += 'panel[' + i + '][id]=' + jQuery(this).attr('id').replace(/^id-/,'') + '&';
  115. post_data += 'panel[' + i + '][placement]=' + ((j == 0) ? 'primary' : 'secondary') + '&';
  116. post_data += 'panel[' + i + '][sort_order]=' + sort_order++ + '&';
  117. i++;
  118. });
  119. });
  120. jQuery.ajax({
  121. type: 'POST',
  122. url: Symphony.Context.get('root') + '/symphony/extension/dashboard/save_order/',
  123. data: post_data,
  124. });
  125. },
  126. hideEditForm: function(callback, enable_dashboard) {
  127. if (enable_dashboard === true) this.$dashboard.fadeTo('fast', 1);
  128. jQuery('#save-panel').slideUp(function() {
  129. jQuery(this).remove();
  130. if (typeof callback == 'function') callback();
  131. });
  132. },
  133. showEditForm: function(panel_type, id) {
  134. var self = this;
  135. jQuery.ajax({
  136. type: 'GET',
  137. url: Symphony.Context.get('root') + '/symphony/extension/dashboard/panel_config/?type=' + panel_type + ((id != null) ? ('&id=' + id) : ''),
  138. success: function(data) {
  139. var form = jQuery('#save-panel');
  140. // if form exists in the DOM it needs to be removed first
  141. // before the new form is revealed
  142. if (form.length) {
  143. self.hideEditForm(function() {
  144. self.revealEditForm(data);
  145. }, false);
  146. } else {
  147. self.revealEditForm(data);
  148. }
  149. // Update title
  150. jQuery('#save-panel input[name="panel[label]"]').change();
  151. }
  152. });
  153. },
  154. revealEditForm: function(html) {
  155. // fade down dashboard panels to give edit form more priority
  156. this.$dashboard.fadeTo('fast', 0.25);
  157. // append form to page (hidden with CSS)
  158. this.$h2.after(html);
  159. jQuery('#save-panel').slideDown();
  160. },
  161. savePanel: function(post_data, action) {
  162. var self = this;
  163. post_data += '&action[' + action + ']=true';
  164. jQuery.ajax({
  165. type: 'POST',
  166. url: Symphony.Context.get('root') + '/symphony/extension/dashboard/panel_config/',
  167. data: post_data,
  168. success: function(data) {
  169. // Must be an error, show the form again:
  170. if (jQuery('response', data).length == 0) {
  171. if (jQuery('#save-panel').length) {
  172. self.hideEditForm(function() {
  173. self.revealEditForm(data);
  174. }, false);
  175. }
  176. else {
  177. self.revealEditForm(data);
  178. }
  179. return;
  180. }
  181. var id = jQuery('response', data).attr('id');
  182. var placement = jQuery('response', data).attr('placement');
  183. var html = jQuery('response', data).text();
  184. var panel = jQuery('#id-' + id);
  185. switch (action) {
  186. case 'delete':
  187. self.hideEditForm(function() {
  188. panel.slideUp('slow', function() {
  189. jQuery(this).remove();
  190. });
  191. }, true);
  192. break;
  193. case 'submit':
  194. // insert new panel
  195. if (panel.length == 0) {
  196. self.hideEditForm(function() {
  197. jQuery('.' + placement).append(html);
  198. jQuery('.new-panel').slideDown('fast', function() {
  199. jQuery(this).removeClass('new-panel');
  200. })
  201. }, true);
  202. }
  203. // update
  204. else {
  205. self.hideEditForm(function() {
  206. var column = panel.parent();
  207. var column_name = ((panel.parent().hasClass('primary')) ? 'primary' : 'secondary');
  208. panel.fadeOut('fast', function() {
  209. if (placement == column_name) {
  210. jQuery(this).after(html).remove();
  211. } else {
  212. jQuery(this).remove();
  213. jQuery('.' + placement).append(html);
  214. }
  215. jQuery('#id-' + id).hide().removeClass('new-panel').fadeIn('fast');
  216. });
  217. }, true);
  218. }
  219. break;
  220. }
  221. }
  222. });
  223. }
  224. };
  225. jQuery(document).ready(function() {
  226. Dashboard.init();
  227. });