base.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. jQuery(document).ready(function() {
  2. jQuery('html').removeClass('no-js');
  3. Admin.add_pretty_errors(document);
  4. Admin.add_collapsed_toggle();
  5. Admin.add_filters(document);
  6. Admin.set_object_field_value(document);
  7. Admin.setup_collection_buttons(document);
  8. });
  9. var Admin = {
  10. /**
  11. * render log message
  12. * @param mixed
  13. */
  14. log: function() {
  15. var msg = '[Sonata.Admin] ' + Array.prototype.join.call(arguments,', ');
  16. if (window.console && window.console.log) {
  17. window.console.log(msg);
  18. } else if (window.opera && window.opera.postError) {
  19. window.opera.postError(msg);
  20. }
  21. },
  22. /**
  23. * display related errors messages
  24. *
  25. * @param subject
  26. */
  27. add_pretty_errors: function(subject) {
  28. jQuery('div.sonata-ba-field-error', subject).each(function(index, element) {
  29. var input = jQuery('input, textarea, select', element);
  30. var message = jQuery('div.sonata-ba-field-error-messages', element).html();
  31. jQuery('div.sonata-ba-field-error-messages', element).html('');
  32. if (!message) {
  33. message = '';
  34. }
  35. if (message.length == 0) {
  36. return;
  37. }
  38. var target;
  39. /* Hack to handle qTip on select */
  40. if(jQuery(input).is("select")) {
  41. jQuery(element).prepend("<span></span>");
  42. target = jQuery('span', element);
  43. jQuery(input).appendTo(target);
  44. }
  45. else {
  46. target = input;
  47. }
  48. target.qtip({
  49. content: message,
  50. show: 'focusin',
  51. hide: 'focusout',
  52. position: {
  53. corner: {
  54. target: 'rightMiddle',
  55. tooltip: 'leftMiddle'
  56. }
  57. },
  58. style: {
  59. name: 'red',
  60. border: {
  61. radius: 2
  62. },
  63. tip: 'leftMiddle'
  64. }
  65. });
  66. });
  67. },
  68. /**
  69. * Add the collapsed toggle option to the admin
  70. *
  71. * @param subject
  72. */
  73. add_collapsed_toggle: function(subject) {
  74. jQuery('fieldset.sonata-ba-fielset-collapsed').has('.error').addClass('sonata-ba-collapsed-fields-close');
  75. jQuery('fieldset.sonata-ba-fielset-collapsed div.sonata-ba-collapsed-fields').not(':has(.error)').hide();
  76. jQuery('fieldset legend a.sonata-ba-collapsed', subject).live('click', function(event) {
  77. event.preventDefault();
  78. var fieldset = jQuery(this).closest('fieldset');
  79. jQuery('div.sonata-ba-collapsed-fields', fieldset).slideToggle();
  80. fieldset.toggleClass('sonata-ba-collapsed-fields-close');
  81. });
  82. },
  83. stopEvent: function(event) {
  84. // https://github.com/sonata-project/SonataAdminBundle/issues/151
  85. //if it is a standard browser use preventDefault otherwise it is IE then return false
  86. if(event.preventDefault) {
  87. event.preventDefault();
  88. } else {
  89. event.returnValue = false;
  90. }
  91. //if it is a standard browser get target otherwise it is IE then adapt syntax and get target
  92. if (typeof event.target != 'undefined') {
  93. targetElement = event.target;
  94. } else {
  95. targetElement = event.srcElement;
  96. }
  97. return targetElement;
  98. },
  99. add_filters: function(subject) {
  100. jQuery('div.filter_container.inactive', subject).hide();
  101. jQuery('fieldset.filter_legend', subject).click(function(event) {
  102. jQuery('div.filter_container', jQuery(event.target).parent()).toggle();
  103. });
  104. },
  105. /**
  106. * Change object field value
  107. * @param subject
  108. */
  109. set_object_field_value: function(subject) {
  110. this.log(jQuery('a.sonata-ba-edit-inline', subject));
  111. jQuery('a.sonata-ba-edit-inline', subject).click(function(event) {
  112. Admin.stopEvent(event);
  113. var subject = jQuery(this);
  114. jQuery.ajax({
  115. url: subject.attr('href'),
  116. type: 'POST',
  117. success: function(json) {
  118. if(json.status === "OK") {
  119. var elm = jQuery(subject).parent();
  120. elm.children().remove();
  121. // fix issue with html comment ...
  122. elm.html(jQuery(json.content.replace(/<!--[\s\S]*?-->/g, "")).html());
  123. elm.effect("highlight", {'color' : '#57A957'}, 2000);
  124. Admin.set_object_field_value(elm);
  125. } else {
  126. jQuery(subject).parent().effect("highlight", {'color' : '#C43C35'}, 2000);
  127. }
  128. }
  129. });
  130. });
  131. },
  132. setup_collection_buttons: function(subject) {
  133. jQuery(subject).on('click', '.sonata-collection-add', function(event) {
  134. Admin.stopEvent(event);
  135. var container = jQuery(this).closest('[data-prototype]');
  136. var proto = container.attr('data-prototype');
  137. proto = proto.replace(/\$\$name\$\$/g, container.children().length);
  138. jQuery(proto).insertBefore(jQuery(this).parent());
  139. jQuery(this).trigger('sonata-collection-item-added');
  140. });
  141. jQuery(subject).on('click', '.sonata-collection-delete', function(event) {
  142. Admin.stopEvent(event);
  143. jQuery(this).closest('.sonata-collection-row').remove();
  144. jQuery(this).trigger('sonata-collection-item-deleted');
  145. });
  146. }
  147. }