inlines.test.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /* global QUnit */
  2. /* eslint strict: 0 */
  3. 'use strict';
  4. QUnit.module('admin.inlines: tabular formsets', {
  5. beforeEach: function() {
  6. const $ = django.jQuery;
  7. const that = this;
  8. this.addText = 'Add another';
  9. $('#qunit-fixture').append($('#tabular-formset').text());
  10. this.table = $('table.inline');
  11. this.inlineRow = this.table.find('tr');
  12. this.inlineRow.tabularFormset('table.inline tr.form-row', {
  13. prefix: 'first',
  14. addText: that.addText,
  15. deleteText: 'Remove'
  16. });
  17. }
  18. });
  19. QUnit.test('no forms', function(assert) {
  20. assert.ok(this.inlineRow.hasClass('dynamic-first'));
  21. assert.equal(this.table.find('.add-row a').text(), this.addText);
  22. });
  23. QUnit.test('add form', function(assert) {
  24. const addButton = this.table.find('.add-row a');
  25. assert.equal(addButton.text(), this.addText);
  26. addButton.click();
  27. assert.ok(this.table.find('#first-1'));
  28. });
  29. QUnit.test('added form has remove button', function(assert) {
  30. const addButton = this.table.find('.add-row a');
  31. assert.equal(addButton.text(), this.addText);
  32. addButton.click();
  33. assert.equal(this.table.find('#first-1 .inline-deletelink').length, 1);
  34. });
  35. QUnit.test('add/remove form events', function(assert) {
  36. assert.expect(6);
  37. const $ = django.jQuery;
  38. const $document = $(document);
  39. const addButton = this.table.find('.add-row a');
  40. $document.on('formset:added', function(event, $row, formsetName) {
  41. assert.ok(true, 'event `formset:added` triggered');
  42. assert.equal(true, $row.is('#first-1'));
  43. assert.equal(formsetName, 'first');
  44. $document.off('formset:added');
  45. });
  46. addButton.click();
  47. const deletedRow = $('#first-1');
  48. const deleteLink = this.table.find('.inline-deletelink');
  49. $document.on('formset:removed', function(event, $row, formsetName) {
  50. assert.ok(true, 'event `formset:removed` triggered');
  51. assert.equal(true, $row.is(deletedRow));
  52. assert.equal(formsetName, 'first');
  53. $document.off('formset:removed');
  54. });
  55. deleteLink.trigger($.Event('click', {target: deleteLink}));
  56. });
  57. QUnit.test('existing add button', function(assert) {
  58. const $ = django.jQuery;
  59. $('#qunit-fixture').empty(); // Clear the table added in beforeEach
  60. $('#qunit-fixture').append($('#tabular-formset').text());
  61. this.table = $('table.inline');
  62. this.inlineRow = this.table.find('tr');
  63. this.table.append('<i class="add-button"></i>');
  64. const addButton = this.table.find('.add-button');
  65. this.inlineRow.tabularFormset('table.inline tr', {
  66. prefix: 'first',
  67. deleteText: 'Remove',
  68. addButton: addButton
  69. });
  70. assert.equal(this.table.find('.add-row a').length, 0);
  71. addButton.click();
  72. assert.ok(this.table.find('#first-1'));
  73. });
  74. QUnit.module('admin.inlines: tabular formsets with validation errors', {
  75. beforeEach: function() {
  76. const $ = django.jQuery;
  77. $('#qunit-fixture').append($('#tabular-formset-with-validation-error').text());
  78. this.table = $('table.inline');
  79. this.inlineRows = this.table.find('tr.form-row');
  80. this.inlineRows.tabularFormset('table.inline tr.form-row', {
  81. prefix: 'second'
  82. });
  83. }
  84. });
  85. QUnit.test('first form has delete checkbox and no button', function(assert) {
  86. const tr = this.inlineRows.slice(0, 1);
  87. assert.ok(tr.hasClass('dynamic-second'));
  88. assert.ok(tr.hasClass('has_original'));
  89. assert.equal(tr.find('td.delete input').length, 1);
  90. assert.equal(tr.find('td.delete .inline-deletelink').length, 0);
  91. });
  92. QUnit.test('dynamic form has remove button', function(assert) {
  93. const tr = this.inlineRows.slice(1, 2);
  94. assert.ok(tr.hasClass('dynamic-second'));
  95. assert.notOk(tr.hasClass('has_original'));
  96. assert.equal(tr.find('.inline-deletelink').length, 1);
  97. });
  98. QUnit.test('dynamic template has nothing', function(assert) {
  99. const tr = this.inlineRows.slice(2, 3);
  100. assert.ok(tr.hasClass('empty-form'));
  101. assert.notOk(tr.hasClass('dynamic-second'));
  102. assert.notOk(tr.hasClass('has_original'));
  103. assert.equal(tr.find('td.delete')[0].innerHTML, '');
  104. });
  105. QUnit.test('removing a form-row also removed related row with non-field errors', function(assert) {
  106. const $ = django.jQuery;
  107. assert.ok(this.table.find('.row-form-errors').length);
  108. const tr = this.inlineRows.slice(1, 2);
  109. const trWithErrors = tr.prev();
  110. assert.ok(trWithErrors.hasClass('row-form-errors'));
  111. const deleteLink = tr.find('a.inline-deletelink');
  112. deleteLink.trigger($.Event('click', {target: deleteLink}));
  113. assert.notOk(this.table.find('.row-form-errors').length);
  114. });
  115. QUnit.module('admin.inlines: tabular formsets with max_num', {
  116. beforeEach: function() {
  117. const $ = django.jQuery;
  118. $('#qunit-fixture').append($('#tabular-formset-with-validation-error').text());
  119. this.table = $('table.inline');
  120. this.maxNum = $('input.id_second-MAX_NUM_FORMS');
  121. this.maxNum.val(2);
  122. this.inlineRows = this.table.find('tr.form-row');
  123. this.inlineRows.tabularFormset('table.inline tr.form-row', {
  124. prefix: 'second'
  125. });
  126. }
  127. });
  128. QUnit.test('does not show the add button if already at max_num', function(assert) {
  129. const addButton = this.table.find('tr.add_row > td > a');
  130. assert.notOk(addButton.is(':visible'));
  131. });
  132. QUnit.test('make addButton visible again', function(assert) {
  133. const $ = django.jQuery;
  134. const addButton = this.table.find('tr.add_row > td > a');
  135. const removeButton = this.table.find('tr.form-row:first').find('a.inline-deletelink');
  136. removeButton.trigger($.Event( "click", { target: removeButton } ));
  137. assert.notOk(addButton.is(':visible'));
  138. });
  139. QUnit.module('admin.inlines: tabular formsets with min_num', {
  140. beforeEach: function() {
  141. const $ = django.jQuery;
  142. $('#qunit-fixture').append($('#tabular-formset-with-validation-error').text());
  143. this.table = $('table.inline');
  144. this.minNum = $('input#id_second-MIN_NUM_FORMS');
  145. this.minNum.val(2);
  146. this.inlineRows = this.table.find('tr.form-row');
  147. this.inlineRows.tabularFormset('table.inline tr.form-row', {
  148. prefix: 'second'
  149. });
  150. }
  151. });
  152. QUnit.test('does not show the remove buttons if already at min_num', function(assert) {
  153. assert.notOk(this.table.find('.inline-deletelink:visible').length);
  154. });
  155. QUnit.test('make removeButtons visible again', function(assert) {
  156. const $ = django.jQuery;
  157. const addButton = this.table.find('tr.add-row > td > a');
  158. addButton.trigger($.Event( "click", { target: addButton } ));
  159. assert.equal(this.table.find('.inline-deletelink:visible').length, 2);
  160. });