container.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. describe('container form option', function() {
  2. beforeEach(function() {
  3. $([
  4. '<form id="containerForm" class="form-horizontal">',
  5. '<div class="form-group">',
  6. '<label class="col-lg-3 control-label">Full name</label>',
  7. '<div class="col-lg-4">',
  8. '<input type="text" class="form-control" name="firstName" required placeholder="First name" data-bv-notempty-message="The first name is required" />',
  9. '</div>',
  10. '<div class="col-lg-4">',
  11. '<input type="text" class="form-control" name="lastName" required placeholder="Last name" data-bv-notempty-message="The last name is required" />',
  12. '</div>',
  13. '</div>',
  14. '<div id="errors"></div>',
  15. '</form>'
  16. ].join('')).appendTo('body');
  17. });
  18. afterEach(function() {
  19. $('#containerForm').bootstrapValidator('destroy').remove();
  20. });
  21. it('form container declarative', function() {
  22. $('#containerForm')
  23. .attr('data-bv-container', '#errors')
  24. .bootstrapValidator();
  25. this.bv = $('#containerForm').data('bootstrapValidator');
  26. this.$firstName = this.bv.getFieldElements('firstName');
  27. this.$lastName = this.bv.getFieldElements('lastName');
  28. expect($('#errors').find('.help-block').length).toBeGreaterThan(0);
  29. this.$firstName.val('First');
  30. this.$lastName.val('');
  31. this.bv.validate();
  32. expect($('#errors').find('.help-block:visible[data-bv-for="firstName"]').length).toEqual(0);
  33. expect($('#errors').find('.help-block:visible[data-bv-for="lastName"]').length).toBeGreaterThan(0);
  34. });
  35. it('form container programmatically', function() {
  36. $('#containerForm').bootstrapValidator({
  37. container: '#errors'
  38. });
  39. this.bv = $('#containerForm').data('bootstrapValidator');
  40. this.$firstName = this.bv.getFieldElements('firstName');
  41. this.$lastName = this.bv.getFieldElements('lastName');
  42. expect($('#errors').find('.help-block').length).toBeGreaterThan(0);
  43. this.$firstName.val('');
  44. this.$lastName.val('Last');
  45. this.bv.validate();
  46. expect($('#errors').find('.help-block:visible[data-bv-for="firstName"]').length).toBeGreaterThan(0);
  47. expect($('#errors').find('.help-block:visible[data-bv-for="lastName"]').length).toEqual(0);
  48. this.bv.resetForm();
  49. this.$firstName.val('First');
  50. this.$lastName.val('Last');
  51. this.bv.validate();
  52. expect($('#errors').find('.help-block:visible').length).toEqual(0);
  53. });
  54. });
  55. describe('container field option', function() {
  56. beforeEach(function() {
  57. $([
  58. '<form id="containerForm" class="form-horizontal">',
  59. '<div class="form-group">',
  60. '<label class="col-lg-3 control-label">Full name</label>',
  61. '<div class="col-lg-4">',
  62. '<input type="text" class="form-control" name="firstName" required placeholder="First name" data-bv-notempty-message="The first name is required" data-bv-container="#firstNameMessage" />',
  63. '<span class="help-block" id="firstNameMessage" />',
  64. '</div>',
  65. '<div class="col-lg-4">',
  66. '<input type="text" class="form-control" name="lastName" required placeholder="Last name" data-bv-notempty-message="The last name is required" />',
  67. '<span class="help-block lastNameMessage" />',
  68. '</div>',
  69. '</div>',
  70. '</form>'
  71. ].join('')).appendTo('body');
  72. $('#containerForm').bootstrapValidator({
  73. feedbackIcons: {
  74. valid: 'glyphicon glyphicon-ok',
  75. invalid: 'glyphicon glyphicon-remove',
  76. validating: 'glyphicon glyphicon-refresh'
  77. },
  78. fields: {
  79. lastName: {
  80. container: '.lastNameMessage'
  81. }
  82. }
  83. });
  84. this.bv = $('#containerForm').data('bootstrapValidator');
  85. this.$firstName = this.bv.getFieldElements('firstName');
  86. this.$lastName = this.bv.getFieldElements('lastName');
  87. });
  88. afterEach(function() {
  89. $('#containerForm').bootstrapValidator('destroy').remove();
  90. });
  91. it('field container declarative', function() {
  92. expect($.trim($('#firstNameMessage').text())).toEqual('The first name is required');
  93. expect($.trim($('.lastNameMessage').text())).toEqual('The last name is required');
  94. });
  95. it('field container programmatically', function() {
  96. this.$firstName.val('First');
  97. this.$lastName.val('');
  98. this.bv.validate();
  99. expect($('#firstNameMessage').find('.help-block:visible').length).toEqual(0);
  100. expect($('.lastNameMessage').find('.help-block:visible').length).toBeGreaterThan(0);
  101. this.bv.resetForm();
  102. this.$firstName.val('');
  103. this.$lastName.val('Last');
  104. this.bv.validate();
  105. expect($('#firstNameMessage').find('.help-block:visible').length).toBeGreaterThan(0);
  106. expect($('.lastNameMessage').find('.help-block:visible').length).toEqual(0);
  107. });
  108. });
  109. describe('container tooltip/popover', function() {
  110. beforeEach(function() {
  111. $([
  112. '<form id="containerForm" class="form-horizontal">',
  113. '<div class="form-group">',
  114. '<label class="col-lg-3 control-label">Full name</label>',
  115. '<div class="col-lg-4">',
  116. '<input type="text" class="form-control" name="firstName" required placeholder="First name" data-bv-notempty-message="The first name is required" />',
  117. '</div>',
  118. '<div class="col-lg-4">',
  119. '<input type="text" class="form-control" name="lastName" required placeholder="Last name" data-bv-notempty-message="The last name is required" />',
  120. '</div>',
  121. '</div>',
  122. '<div id="errors"></div>',
  123. '</form>'
  124. ].join('')).appendTo('body');
  125. });
  126. afterEach(function() {
  127. $('#containerForm').bootstrapValidator('destroy').remove();
  128. });
  129. it('container declarative', function() {
  130. $('#containerForm')
  131. .attr('data-bv-container', 'tooltip')
  132. .find('[name="lastName"]')
  133. .attr('data-bv-container', 'popover')
  134. .end()
  135. .bootstrapValidator();
  136. this.bv = $('#containerForm').data('bootstrapValidator');
  137. this.$firstName = this.bv.getFieldElements('firstName');
  138. this.$lastName = this.bv.getFieldElements('lastName');
  139. this.bv.validate();
  140. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined();
  141. expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip');
  142. expect(this.$lastName.parent().find('i').data('bs.popover')).toBeDefined();
  143. expect(this.$lastName.parent().find('i').data('bs.popover').type).toEqual('popover');
  144. this.bv.resetForm();
  145. this.$firstName.val('First');
  146. this.$lastName.val('Last');
  147. this.bv.validate();
  148. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined();
  149. expect(this.$lastName.parent().find('i').data('bs.popover')).toBeUndefined();
  150. });
  151. it('container programmatically', function() {
  152. $('#containerForm').bootstrapValidator({
  153. container: 'tooltip',
  154. fields: {
  155. lastName: {
  156. container: 'popover'
  157. }
  158. }
  159. });
  160. this.bv = $('#containerForm').data('bootstrapValidator');
  161. this.$firstName = this.bv.getFieldElements('firstName');
  162. this.$lastName = this.bv.getFieldElements('lastName');
  163. this.bv.validate();
  164. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined();
  165. expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip');
  166. expect(this.$lastName.parent().find('i').data('bs.popover')).toBeDefined();
  167. expect(this.$lastName.parent().find('i').data('bs.popover').type).toEqual('popover');
  168. this.bv.resetForm();
  169. this.$firstName.val('First');
  170. this.$lastName.val('Last');
  171. this.bv.validate();
  172. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined();
  173. expect(this.$lastName.parent().find('i').data('bs.popover')).toBeUndefined();
  174. });
  175. // #991: Validate once when setting trigger: blur, container: tooltip
  176. it('trigger: blur, container: tooltip', function() {
  177. $('#containerForm').bootstrapValidator({
  178. container: 'tooltip',
  179. trigger: 'blur',
  180. fields: {
  181. firstName: {
  182. validators: {
  183. stringLength: {
  184. min: 5,
  185. message: 'The first name must be more than 5 characters'
  186. },
  187. notEmpty: {
  188. message: 'The first name is required'
  189. },
  190. regexp: {
  191. regexp: /^[a-z]+$/i,
  192. message: 'The first name must consist of a-z, A-Z characters only'
  193. }
  194. }
  195. },
  196. lastName: {
  197. validators: {
  198. stringLength: {
  199. min: 5,
  200. message: 'The last name must be more than 5 characters'
  201. },
  202. notEmpty: {
  203. message: 'The last name is required'
  204. },
  205. regexp: {
  206. regexp: /^[a-z]+$/i,
  207. message: 'The last name must consist of a-z, A-Z characters only'
  208. }
  209. }
  210. }
  211. }
  212. });
  213. this.bv = $('#containerForm').data('bootstrapValidator');
  214. this.$firstName = this.bv.getFieldElements('firstName');
  215. this.$lastName = this.bv.getFieldElements('lastName');
  216. this.$firstName.val('').trigger('blur');
  217. this.bv.validate();
  218. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined();
  219. expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip');
  220. expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name is required');
  221. this.bv.resetForm();
  222. this.$firstName.val('@not#valid');
  223. this.$lastName.val('').focus();
  224. this.bv.validate();
  225. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined();
  226. expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip');
  227. expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name must consist of a-z, A-Z characters only');
  228. this.bv.resetForm();
  229. this.$firstName.val('Phuo');
  230. this.$lastName.val('').focus();
  231. this.bv.validate();
  232. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined();
  233. expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip');
  234. expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name must be more than 5 characters');
  235. this.bv.resetForm();
  236. this.$firstName.val('Phuoc');
  237. this.$lastName.val('').focus();
  238. this.bv.validate();
  239. expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined();
  240. });
  241. });