datalist.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*
  2. * Selects con datalist
  3. */
  4. var click_in_process = false;
  5. var visible = false;
  6. $('.datalist-text .datalist-input').on('focusin', function () {
  7. var elementRoot = $(this).parents('.datalist');
  8. elementRoot.find(".icono").show();
  9. elementRoot.find("ul").show();
  10. elementRoot.find(".datalist-input").trigger("keyup");
  11. });
  12. function ocultaList(e) {
  13. (e.data.padre).find('.icono').removeClass('ing-cancelar iconoAzul pointer').addClass('ing-buscar');
  14. (e.data.padre).find('ul').hide();
  15. // $('.datalist .icono').removeClass('ing-cancelar iconoAzul pointer').addClass('ing-buscar');
  16. // $('.datalist ul').hide();
  17. }
  18. function ocultaTodos() {
  19. $('.datalist .icono').removeClass('ing-cancelar iconoAzul pointer').addClass('ing-buscar');
  20. $('.datalist ul').hide();
  21. }
  22. //$('.datalist-input').click(function(){
  23. $(document).on('click', '.datalist-input', function () {
  24. var elementRoot = $(this).parent();
  25. limpiaInput({ "data": { "padre": elementRoot } });
  26. const alreadyOpen = elementRoot.find('ul').is(':visible');
  27. if (alreadyOpen) {
  28. setTimeout(() => {
  29. ocultaTodos();
  30. }, 0);
  31. // stop all jquery animations
  32. return;
  33. }
  34. if (!elementRoot.hasClass("disabled")) {
  35. elementRoot.find('ul').show();
  36. elementRoot.find('.datalist-input').focus();
  37. elementRoot.find('ul').show();
  38. elementRoot.find('.icono').removeClass('ing-buscar').addClass('ing-cancelar iconoAzul pointer');
  39. elementRoot.find('.icono').on('click', { "padre": elementRoot }, limpiaInput);
  40. elementRoot.find('.icono').on('click', { "padre": elementRoot }, ocultaList);
  41. }
  42. // if other datalist is open, close it
  43. $('.datalist').each(function () {
  44. // get the input hidden from the datalist
  45. var inputHidden = $(this).find('input[type="hidden"]').attr('id');
  46. // get the input hidden from the datalist that was clicked
  47. var inputHiddenClicked = elementRoot.find('input[type="hidden"]').attr('id');
  48. if ($(this).find('ul').is(':visible') && inputHidden != inputHiddenClicked) {
  49. $(this).find('ul').hide();
  50. $(this).find('.icono').removeClass('ing-cancelar iconoAzul pointer').addClass('ing-buscar');
  51. }
  52. });
  53. });
  54. //usar class="selected" para marcar seleccioando por default
  55. $(function () {
  56. $.each($(".datalist").find('ul li:not(.not-selectable)'), function () {
  57. if ($(this).hasClass("selected")) {
  58. var elementRoot = $(this).parents('.datalist');
  59. elementRoot.find('.datalist-input').html($(this).html().replace(/[\t\n]+/g, ' ').trim());
  60. var cid = $(this).data('id');
  61. elementRoot.find("input[type=hidden]").val(cid);
  62. }
  63. });
  64. // add not-selectable class to all li elements and the .datalist-input element
  65. $('.datalist-input ul li, .datalist-input').addClass('user-select-none');
  66. });
  67. $(document).on('click', '.datalist-select > ul li:not(.not-selectable)', function () {
  68. var elementRoot = $(this).parents('.datalist');
  69. elementRoot.find('.datalist-input').html($(this).html().replace(/[\t\n]+/g, ' ').trim());
  70. // $(this).parent('ul').siblings('input[type="text"]').blur();
  71. ocultaList({ "data": { "padre": elementRoot } });
  72. var cid = $(this).data('id');
  73. elementRoot.find("input[type=hidden]").val(cid);
  74. elementRoot.find("li").removeClass("selected");
  75. $(this).addClass("selected");
  76. elementRoot.removeClass("datalist-invalid");
  77. });
  78. $('.modal').on('hide.bs.modal', function (e) {
  79. $('.datalist .icono').removeClass('ing-cancelar iconoAzul pointer').addClass('ing-buscar');
  80. $('.datalist ul').hide();
  81. });
  82. function setDatalist(selector, value = -1) {
  83. var elementRoot = $(selector).parents('.datalist');
  84. $.each(elementRoot.find('ul li:not(.not-selectable)'), function () {
  85. if ($(this).data("id") == value) {
  86. elementRoot.find('.datalist-input').text($(this).html().replace(/[\t\n]+/g, ' ').trim());
  87. $(selector).val(value);
  88. elementRoot.find("li").removeClass("selected");
  89. $(this).addClass("selected");
  90. }
  91. });
  92. }
  93. function setDatalistFirst(selector) {
  94. var index = 1;
  95. var elementRoot = $(selector).parents('.datalist');
  96. var num = elementRoot.find('ul li:not(.not-selectable)').length;
  97. if (index <= num) {
  98. while (elementRoot.find('ul li:nth-child(' + index + ')').hasClass("not-selectable") && index <= num) {
  99. index++;
  100. }
  101. var element = elementRoot.find('ul li:nth-child(' + index + ')');
  102. elementRoot.find('.datalist-input').text(element.html().replace(/[\t\n]+/g, ' ').trim());
  103. $(selector).val(element.data("id"));
  104. elementRoot.find("li").removeClass("selected");
  105. element.addClass("selected");
  106. }
  107. }
  108. function disableDatalist(selector, disabled = true) {
  109. var elementRoot = $(selector).parents('.datalist');
  110. if (disabled) {
  111. elementRoot.addClass("disabled");
  112. ocultaList({ "data": { "padre": elementRoot } });
  113. } else
  114. elementRoot.removeClass("disabled");
  115. }
  116. function invalidDatalist(selector, invalid = true) {
  117. var elementRoot = $(selector).parents('.datalist');
  118. if (invalid) {
  119. elementRoot.addClass("datalist-invalid");
  120. } else
  121. elementRoot.removeClass("datalist-invalid");
  122. }
  123. function buscaDatalist(selector, valor) {
  124. selector.find('ul li').each(function () {
  125. var elem = $(this);
  126. if ($(this).parent().is('li'))
  127. elem = $(this).parent();
  128. if (!$(this).html().toUpperCase().includes(valor.toUpperCase())) {
  129. $(elem).hide();
  130. selector.find('.datalist-input').val("");
  131. selector.find("input[type=hidden]").val("");
  132. } else
  133. $(elem).show();
  134. });
  135. }
  136. function getDatalistText(selector, valor) {
  137. var elementRoot = $(selector).parents('.datalist');
  138. var text = "";
  139. $.each(elementRoot.find('ul li:not(.not-selectable)'), function () {
  140. if ($(this).data("id") == valor) {
  141. text = $(this).html();
  142. }
  143. });
  144. return text;
  145. }
  146. //---
  147. $('.datalist-text .datalist-input').keyup(function () {
  148. var elementRoot = $(this).parents('.datalist');
  149. var input = $(this);
  150. elementRoot.find('ul li').each(function () {
  151. var elem = $(this);
  152. if ($(this).parent().is('li'))
  153. elem = $(this).parent();
  154. if (!$(this).html().toUpperCase().includes(input.val().toUpperCase()))
  155. $(elem).hide();
  156. else
  157. $(elem).show();
  158. });
  159. });
  160. /*
  161. $('.datalist-text input').blur(function() {
  162. var elementRoot = $(this).parents('.datalist');
  163. console.log("Click? "+click_in_process);
  164. if(!click_in_process) {
  165. buscaDatalist(elementRoot, elementRoot.find('.datalist-input').val());
  166. elementRoot.find('.icono').removeClass('ing-cancelar iconoAzul pointer').addClass('ing-buscar');
  167. elementRoot.find('ul').children('li').show();
  168. elementRoot.find('ul').hide();
  169. }
  170. click_in_process = false;
  171. });
  172. */
  173. $('.datalist-text > ul li:not(.not-selectable)').click(function () {
  174. console.log("Li click!" + $(this).html());
  175. var elementRoot = $(this).parents('.datalist');
  176. elementRoot.find('.datalist-input').val($(this).html().replace(/[\t\n]+/g, ' ').trim());
  177. //$(this).parent('ul').siblings('input[type="text"]').blur();
  178. var cid = $(this).data('id');
  179. elementRoot.find("input[type=hidden]").val(cid);
  180. elementRoot.find("li").removeClass("selected");
  181. $(this).addClass("selected");
  182. click_in_process = true;
  183. //elementRoot.find('.datalist-input').blur();
  184. ocultaList({ "data": { "padre": elementRoot } });
  185. });
  186. /* $('.datalist-text .datalist-input').click(function () {
  187. var elementRoot = $(this).parents('.datalist');
  188. limpiaInput({ "data": { "padre": elementRoot } });
  189. const alreadyOpen = elementRoot.find('ul').is(':visible');
  190. console.log("Click! " + alreadyOpen);
  191. elementRoot.find('ul').show();
  192. elementRoot.find('input').focus();
  193. elementRoot.find('ul').show();
  194. elementRoot.find('.icono').removeClass('ing-buscar').addClass('ing-cancelar iconoAzul pointer');
  195. elementRoot.find('.icono').on('click', { "padre": elementRoot }, limpiaInput);
  196. }); */
  197. $(document).on('click', function (e) {
  198. var target = $(e.target);
  199. // or if you click in the .datalist-input and the datalist is visible
  200. let isDatalist = target.parents().addBack().is('.datalist');
  201. // alert(isDatalist);
  202. if (!isDatalist)
  203. ocultaList({ "data": { "padre": $('.datalist') } });
  204. // if the data list is visible and you click in the input, hide the list
  205. });
  206. function limpiaInput(e) {
  207. (e.data.padre).find('.datalist-input').val('');
  208. (e.data.padre).find('.datalist-input').parent().children('ul').children('li').show();
  209. (e.data.padre).find('li:first').focus();
  210. (e.data.padre).find('.datalist-input').focus();
  211. }
  212. // function make required
  213. function makeRequiredDatalist(selector, required = true) {
  214. var elementRoot = $(selector).parents('.datalist');
  215. if (required)
  216. elementRoot.addClass("required");
  217. else
  218. elementRoot.removeClass("required");
  219. }
  220. // function validate
  221. function validateDatalist(selector) {
  222. var elementRoot = $(selector).parents('.datalist');
  223. if (elementRoot.hasClass("required") && $(selector).val() == "") {
  224. invalidDatalist(selector, true);
  225. return false;
  226. }
  227. invalidDatalist(selector, false);
  228. return true;
  229. }