Aucune description

RelatedObjectLookups.js 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*global SelectBox, interpolate*/
  2. // Handles related-objects functionality: lookup link for raw_id_fields
  3. // and Add Another links.
  4. 'use strict';
  5. {
  6. const $ = django.jQuery;
  7. function showAdminPopup(triggeringLink, name_regexp, add_popup) {
  8. const name = triggeringLink.id.replace(name_regexp, '');
  9. const href = new URL(triggeringLink.href);
  10. if (add_popup) {
  11. href.searchParams.set('_popup', 1);
  12. }
  13. const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
  14. win.focus();
  15. return false;
  16. }
  17. function showRelatedObjectLookupPopup(triggeringLink) {
  18. return showAdminPopup(triggeringLink, /^lookup_/, true);
  19. }
  20. function dismissRelatedLookupPopup(win, chosenId) {
  21. const name = win.name;
  22. const elem = document.getElementById(name);
  23. if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
  24. elem.value += ',' + chosenId;
  25. } else {
  26. document.getElementById(name).value = chosenId;
  27. }
  28. win.close();
  29. }
  30. function showRelatedObjectPopup(triggeringLink) {
  31. return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
  32. }
  33. function updateRelatedObjectLinks(triggeringLink) {
  34. const $this = $(triggeringLink);
  35. const siblings = $this.nextAll('.view-related, .change-related, .delete-related');
  36. if (!siblings.length) {
  37. return;
  38. }
  39. const value = $this.val();
  40. if (value) {
  41. siblings.each(function() {
  42. const elm = $(this);
  43. elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
  44. });
  45. } else {
  46. siblings.removeAttr('href');
  47. }
  48. }
  49. function dismissAddRelatedObjectPopup(win, newId, newRepr) {
  50. const name = win.name;
  51. const elem = document.getElementById(name);
  52. if (elem) {
  53. const elemName = elem.nodeName.toUpperCase();
  54. if (elemName === 'SELECT') {
  55. elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
  56. } else if (elemName === 'INPUT') {
  57. if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
  58. elem.value += ',' + newId;
  59. } else {
  60. elem.value = newId;
  61. }
  62. }
  63. // Trigger a change event to update related links if required.
  64. $(elem).trigger('change');
  65. } else {
  66. const toId = name + "_to";
  67. const o = new Option(newRepr, newId);
  68. SelectBox.add_to_cache(toId, o);
  69. SelectBox.redisplay(toId);
  70. }
  71. win.close();
  72. }
  73. function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
  74. const id = win.name.replace(/^edit_/, '');
  75. const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
  76. const selects = $(selectsSelector);
  77. selects.find('option').each(function() {
  78. if (this.value === objId) {
  79. this.textContent = newRepr;
  80. this.value = newId;
  81. }
  82. });
  83. selects.next().find('.select2-selection__rendered').each(function() {
  84. // The element can have a clear button as a child.
  85. // Use the lastChild to modify only the displayed value.
  86. this.lastChild.textContent = newRepr;
  87. this.title = newRepr;
  88. });
  89. win.close();
  90. }
  91. function dismissDeleteRelatedObjectPopup(win, objId) {
  92. const id = win.name.replace(/^delete_/, '');
  93. const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
  94. const selects = $(selectsSelector);
  95. selects.find('option').each(function() {
  96. if (this.value === objId) {
  97. $(this).remove();
  98. }
  99. }).trigger('change');
  100. win.close();
  101. }
  102. window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup;
  103. window.dismissRelatedLookupPopup = dismissRelatedLookupPopup;
  104. window.showRelatedObjectPopup = showRelatedObjectPopup;
  105. window.updateRelatedObjectLinks = updateRelatedObjectLinks;
  106. window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
  107. window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
  108. window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
  109. // Kept for backward compatibility
  110. window.showAddAnotherPopup = showRelatedObjectPopup;
  111. window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
  112. $(document).ready(function() {
  113. $("a[data-popup-opener]").on('click', function(event) {
  114. event.preventDefault();
  115. opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener"));
  116. });
  117. $('body').on('click', '.related-widget-wrapper-link', function(e) {
  118. e.preventDefault();
  119. if (this.href) {
  120. const event = $.Event('django:show-related', {href: this.href});
  121. $(this).trigger(event);
  122. if (!event.isDefaultPrevented()) {
  123. showRelatedObjectPopup(this);
  124. }
  125. }
  126. });
  127. $('body').on('change', '.related-widget-wrapper select', function(e) {
  128. const event = $.Event('django:update-related');
  129. $(this).trigger(event);
  130. if (!event.isDefaultPrevented()) {
  131. updateRelatedObjectLinks(this);
  132. }
  133. });
  134. $('.related-widget-wrapper select').trigger('change');
  135. $('body').on('click', '.related-lookup', function(e) {
  136. e.preventDefault();
  137. const event = $.Event('django:lookup-related');
  138. $(this).trigger(event);
  139. if (!event.isDefaultPrevented()) {
  140. showRelatedObjectLookupPopup(this);
  141. }
  142. });
  143. });
  144. }