datalist.js 9.6 KB

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