handle-click.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { colorLuminance } from './utils';
  2. import { getModal } from './handle-swal-dom';
  3. import { hasClass, isDescendant } from './handle-dom';
  4. /*
  5. * User clicked on "Confirm"/"OK" or "Cancel"
  6. */
  7. var handleButton = function(event, params, modal) {
  8. var e = event || window.event;
  9. var target = e.target || e.srcElement;
  10. var targetedConfirm = target.className.indexOf('confirm') !== -1;
  11. var targetedOverlay = target.className.indexOf('sweet-overlay') !== -1;
  12. var modalIsVisible = hasClass(modal, 'visible');
  13. var doneFunctionExists = (params.doneFunction && modal.getAttribute('data-has-done-function') === 'true');
  14. // Since the user can change the background-color of the confirm button programmatically,
  15. // we must calculate what the color should be on hover/active
  16. var normalColor, hoverColor, activeColor;
  17. if (targetedConfirm && params.confirmButtonColor) {
  18. normalColor = params.confirmButtonColor;
  19. hoverColor = colorLuminance(normalColor, -0.04);
  20. activeColor = colorLuminance(normalColor, -0.14);
  21. }
  22. function shouldSetConfirmButtonColor(color) {
  23. if (targetedConfirm && params.confirmButtonColor) {
  24. target.style.backgroundColor = color;
  25. }
  26. }
  27. switch (e.type) {
  28. case 'mouseover':
  29. shouldSetConfirmButtonColor(hoverColor);
  30. break;
  31. case 'mouseout':
  32. shouldSetConfirmButtonColor(normalColor);
  33. break;
  34. case 'mousedown':
  35. shouldSetConfirmButtonColor(activeColor);
  36. break;
  37. case 'mouseup':
  38. shouldSetConfirmButtonColor(hoverColor);
  39. break;
  40. case 'focus':
  41. let $confirmButton = modal.querySelector('button.confirm');
  42. let $cancelButton = modal.querySelector('button.cancel');
  43. if (targetedConfirm) {
  44. $cancelButton.style.boxShadow = 'none';
  45. } else {
  46. $confirmButton.style.boxShadow = 'none';
  47. }
  48. break;
  49. case 'click':
  50. let clickedOnModal = (modal === target);
  51. let clickedOnModalChild = isDescendant(modal, target);
  52. // Ignore click outside if allowOutsideClick is false
  53. if (!clickedOnModal && !clickedOnModalChild && modalIsVisible && !params.allowOutsideClick) {
  54. break;
  55. }
  56. if (targetedConfirm && doneFunctionExists && modalIsVisible) {
  57. handleConfirm(modal, params);
  58. } else if (doneFunctionExists && modalIsVisible || targetedOverlay) {
  59. handleCancel(modal, params);
  60. } else if (isDescendant(modal, target) && target.tagName === 'BUTTON') {
  61. sweetAlert.close();
  62. }
  63. break;
  64. }
  65. };
  66. /*
  67. * User clicked on "Confirm"/"OK"
  68. */
  69. var handleConfirm = function(modal, params) {
  70. var callbackValue = true;
  71. if (hasClass(modal, 'show-input')) {
  72. callbackValue = modal.querySelector('input').value;
  73. if (!callbackValue) {
  74. callbackValue = '';
  75. }
  76. }
  77. params.doneFunction(callbackValue);
  78. if (params.closeOnConfirm) {
  79. sweetAlert.close();
  80. }
  81. // Disable cancel and confirm button if the parameter is true
  82. if (params.showLoaderOnConfirm) {
  83. sweetAlert.disableButtons();
  84. }
  85. };
  86. /*
  87. * User clicked on "Cancel"
  88. */
  89. var handleCancel = function(modal, params) {
  90. // Check if callback function expects a parameter (to track cancel actions)
  91. var functionAsStr = String(params.doneFunction).replace(/\s/g, '');
  92. var functionHandlesCancel = functionAsStr.substring(0, 9) === 'function(' && functionAsStr.substring(9, 10) !== ')';
  93. if (functionHandlesCancel) {
  94. params.doneFunction(false);
  95. }
  96. if (params.closeOnCancel) {
  97. sweetAlert.close();
  98. }
  99. };
  100. export default {
  101. handleButton,
  102. handleConfirm,
  103. handleCancel
  104. };