sweetalert2.js 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886
  1. /*!
  2. * sweetalert2 v7.3.5
  3. * Released under the MIT License.
  4. */
  5. (function (global, factory) {
  6. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  7. typeof define === 'function' && define.amd ? define(factory) :
  8. (global.Sweetalert2 = factory());
  9. }(this, (function () { 'use strict';
  10. var defaultParams = {
  11. title: '',
  12. titleText: '',
  13. text: '',
  14. html: '',
  15. type: null,
  16. toast: false,
  17. customClass: '',
  18. target: 'body',
  19. backdrop: true,
  20. animation: true,
  21. allowOutsideClick: true,
  22. allowEscapeKey: true,
  23. allowEnterKey: true,
  24. showConfirmButton: true,
  25. showCancelButton: false,
  26. preConfirm: null,
  27. confirmButtonText: 'OK',
  28. confirmButtonAriaLabel: '',
  29. confirmButtonColor: '#3085d6',
  30. confirmButtonClass: null,
  31. cancelButtonText: 'Cancel',
  32. cancelButtonAriaLabel: '',
  33. cancelButtonColor: '#aaa',
  34. cancelButtonClass: null,
  35. buttonsStyling: true,
  36. reverseButtons: false,
  37. focusConfirm: true,
  38. focusCancel: false,
  39. showCloseButton: false,
  40. closeButtonAriaLabel: 'Close this dialog',
  41. showLoaderOnConfirm: false,
  42. imageUrl: null,
  43. imageWidth: null,
  44. imageHeight: null,
  45. imageAlt: '',
  46. imageClass: null,
  47. timer: null,
  48. width: 500,
  49. padding: 20,
  50. background: '#fff',
  51. input: null,
  52. inputPlaceholder: '',
  53. inputValue: '',
  54. inputOptions: {},
  55. inputAutoTrim: true,
  56. inputClass: null,
  57. inputAttributes: {},
  58. inputValidator: null,
  59. grow: false,
  60. position: 'center',
  61. progressSteps: [],
  62. currentProgressStep: null,
  63. progressStepsDistance: '40px',
  64. onBeforeOpen: null,
  65. onOpen: null,
  66. onClose: null,
  67. useRejections: false,
  68. expectRejections: false
  69. };
  70. var deprecatedParams = ['useRejections', 'expectRejections'];
  71. var swalPrefix = 'swal2-';
  72. var prefix = function prefix(items) {
  73. var result = {};
  74. for (var i in items) {
  75. result[items[i]] = swalPrefix + items[i];
  76. }
  77. return result;
  78. };
  79. var swalClasses = prefix(['container', 'shown', 'iosfix', 'popup', 'modal', 'no-backdrop', 'toast', 'toast-shown', 'overlay', 'fade', 'show', 'hide', 'noanimation', 'close', 'title', 'content', 'contentwrapper', 'buttonswrapper', 'confirm', 'cancel', 'icon', 'image', 'input', 'has-input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea', 'inputerror', 'validationerror', 'progresssteps', 'activeprogressstep', 'progresscircle', 'progressline', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen']);
  80. var iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']);
  81. var consolePrefix = 'SweetAlert2:';
  82. /*
  83. * Set hover, active and focus-states for buttons (source: http://www.sitepoint.com/javascript-generate-lighter-darker-color)
  84. */
  85. var colorLuminance = function colorLuminance(hex, lum) {
  86. // Validate hex string
  87. hex = String(hex).replace(/[^0-9a-f]/gi, '');
  88. if (hex.length < 6) {
  89. hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
  90. }
  91. lum = lum || 0;
  92. // Convert to decimal and change luminosity
  93. var rgb = '#';
  94. for (var i = 0; i < 3; i++) {
  95. var c = parseInt(hex.substr(i * 2, 2), 16);
  96. c = Math.round(Math.min(Math.max(0, c + c * lum), 255)).toString(16);
  97. rgb += ('00' + c).substr(c.length);
  98. }
  99. return rgb;
  100. };
  101. /**
  102. * Filter the unique values into a new array
  103. * @param arr
  104. */
  105. var uniqueArray = function uniqueArray(arr) {
  106. var result = [];
  107. for (var i in arr) {
  108. if (result.indexOf(arr[i]) === -1) {
  109. result.push(arr[i]);
  110. }
  111. }
  112. return result;
  113. };
  114. /**
  115. * Standardise console warnings
  116. * @param message
  117. */
  118. var warn = function warn(message) {
  119. console.warn(consolePrefix + ' ' + message);
  120. };
  121. /**
  122. * Standardise console errors
  123. * @param message
  124. */
  125. var error = function error(message) {
  126. console.error(consolePrefix + ' ' + message);
  127. };
  128. /**
  129. * Private global state for `warnOnce`
  130. * @type {Array}
  131. * @private
  132. */
  133. var previousWarnOnceMessages = [];
  134. /**
  135. * Show a console warning, but only if it hasn't already been shown
  136. * @param message
  137. */
  138. var warnOnce = function warnOnce(message) {
  139. if (!(previousWarnOnceMessages.indexOf(message) !== -1)) {
  140. previousWarnOnceMessages.push(message);
  141. warn(message);
  142. }
  143. };
  144. // Remember state in cases where opening and handling a modal will fiddle with it.
  145. var states = {
  146. previousActiveElement: null,
  147. previousBodyPadding: null
  148. // Detect Node env
  149. };var isNodeEnv = function isNodeEnv() {
  150. return typeof window === 'undefined' || typeof document === 'undefined';
  151. };
  152. /*
  153. * Add modal + overlay to DOM
  154. */
  155. var init = function init(params) {
  156. // Clean up the old popup if it exists
  157. var c = getContainer();
  158. if (c) {
  159. c.parentNode.removeChild(c);
  160. removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['has-input'], swalClasses['toast-shown']]);
  161. }
  162. if (isNodeEnv()) {
  163. error('SweetAlert2 requires document to initialize');
  164. return;
  165. }
  166. var container = document.createElement('div');
  167. container.className = swalClasses.container;
  168. container.innerHTML = sweetHTML;
  169. var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target;
  170. targetElement.appendChild(container);
  171. var popup = getPopup();
  172. var input = getChildByClass(popup, swalClasses.input);
  173. var file = getChildByClass(popup, swalClasses.file);
  174. var range = popup.querySelector('.' + swalClasses.range + ' input');
  175. var rangeOutput = popup.querySelector('.' + swalClasses.range + ' output');
  176. var select = getChildByClass(popup, swalClasses.select);
  177. var checkbox = popup.querySelector('.' + swalClasses.checkbox + ' input');
  178. var textarea = getChildByClass(popup, swalClasses.textarea);
  179. // a11y
  180. popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive');
  181. var resetValidationError = function resetValidationError() {
  182. sweetAlert.isVisible() && sweetAlert.resetValidationError();
  183. };
  184. input.oninput = resetValidationError;
  185. file.onchange = resetValidationError;
  186. select.onchange = resetValidationError;
  187. checkbox.onchange = resetValidationError;
  188. textarea.oninput = resetValidationError;
  189. range.oninput = function () {
  190. resetValidationError();
  191. rangeOutput.value = range.value;
  192. };
  193. range.onchange = function () {
  194. resetValidationError();
  195. range.previousSibling.value = range.value;
  196. };
  197. return popup;
  198. };
  199. /*
  200. * Manipulate DOM
  201. */
  202. var sweetHTML = ('\n <div role="dialog" aria-modal="true" aria-labelledby="' + swalClasses.title + '" aria-describedby="' + swalClasses.content + '" class="' + swalClasses.popup + '">\n <ul class="' + swalClasses.progresssteps + '"></ul>\n <div class="' + swalClasses.icon + ' ' + iconTypes.error + '">\n <span class="swal2-x-mark"><span class="swal2-x-mark-line-left"></span><span class="swal2-x-mark-line-right"></span></span>\n </div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.question + '">?</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.warning + '">!</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.info + '">i</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.success + '">\n <div class="swal2-success-circular-line-left"></div>\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n <div class="swal2-success-circular-line-right"></div>\n </div>\n <img class="' + swalClasses.image + '" />\n <div class="' + swalClasses.contentwrapper + '">\n <h2 class="' + swalClasses.title + '" id="' + swalClasses.title + '"></h2>\n <div id="' + swalClasses.content + '" class="' + swalClasses.content + '"></div>\n </div>\n <input class="' + swalClasses.input + '" />\n <input type="file" class="' + swalClasses.file + '" />\n <div class="' + swalClasses.range + '">\n <output></output>\n <input type="range" />\n </div>\n <select class="' + swalClasses.select + '"></select>\n <div class="' + swalClasses.radio + '"></div>\n <label for="' + swalClasses.checkbox + '" class="' + swalClasses.checkbox + '">\n <input type="checkbox" />\n </label>\n <textarea class="' + swalClasses.textarea + '"></textarea>\n <div class="' + swalClasses.validationerror + '" id="' + swalClasses.validationerror + '"></div>\n <div class="' + swalClasses.buttonswrapper + '">\n <button type="button" class="' + swalClasses.confirm + '">OK</button>\n <button type="button" class="' + swalClasses.cancel + '">Cancel</button>\n </div>\n <button type="button" class="' + swalClasses.close + '">\xD7</button>\n </div>\n').replace(/(^|\n)\s*/g, '');
  203. var getContainer = function getContainer() {
  204. return document.body.querySelector('.' + swalClasses.container);
  205. };
  206. var getPopup = function getPopup() {
  207. return getContainer() ? getContainer().querySelector('.' + swalClasses.popup) : null;
  208. };
  209. var getIcons = function getIcons() {
  210. var popup = getPopup();
  211. return popup.querySelectorAll('.' + swalClasses.icon);
  212. };
  213. var elementByClass = function elementByClass(className) {
  214. return getContainer() ? getContainer().querySelector('.' + className) : null;
  215. };
  216. var getTitle = function getTitle() {
  217. return elementByClass(swalClasses.title);
  218. };
  219. var getContent = function getContent() {
  220. return elementByClass(swalClasses.content);
  221. };
  222. var getImage = function getImage() {
  223. return elementByClass(swalClasses.image);
  224. };
  225. var getProgressSteps = function getProgressSteps() {
  226. return elementByClass(swalClasses.progresssteps);
  227. };
  228. var getValidationError = function getValidationError() {
  229. return elementByClass(swalClasses.validationerror);
  230. };
  231. var getConfirmButton = function getConfirmButton() {
  232. return elementByClass(swalClasses.confirm);
  233. };
  234. var getCancelButton = function getCancelButton() {
  235. return elementByClass(swalClasses.cancel);
  236. };
  237. var getButtonsWrapper = function getButtonsWrapper() {
  238. return elementByClass(swalClasses.buttonswrapper);
  239. };
  240. var getCloseButton = function getCloseButton() {
  241. return elementByClass(swalClasses.close);
  242. };
  243. var getFocusableElements = function getFocusableElements() {
  244. var focusableElementsWithTabindex = Array.prototype.slice.call(getPopup().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'))
  245. // sort according to tabindex
  246. .sort(function (a, b) {
  247. a = parseInt(a.getAttribute('tabindex'));
  248. b = parseInt(b.getAttribute('tabindex'));
  249. if (a > b) {
  250. return 1;
  251. } else if (a < b) {
  252. return -1;
  253. }
  254. return 0;
  255. });
  256. var otherFocusableElements = Array.prototype.slice.call(getPopup().querySelectorAll('button, input:not([type=hidden]), textarea, select, a, [tabindex="0"]'));
  257. return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements));
  258. };
  259. var isModal = function isModal() {
  260. return !document.body.classList.contains(swalClasses['toast-shown']);
  261. };
  262. var isToast = function isToast() {
  263. return document.body.classList.contains(swalClasses['toast-shown']);
  264. };
  265. var isLoading = function isLoading() {
  266. return getPopup().hasAttribute('data-loading');
  267. };
  268. var hasClass = function hasClass(elem, className) {
  269. if (elem.classList) {
  270. return elem.classList.contains(className);
  271. }
  272. return false;
  273. };
  274. var focusInput = function focusInput(input) {
  275. input.focus();
  276. // place cursor at end of text in text input
  277. if (input.type !== 'file') {
  278. // http://stackoverflow.com/a/2345915/1331425
  279. var val = input.value;
  280. input.value = '';
  281. input.value = val;
  282. }
  283. };
  284. var addOrRemoveClass = function addOrRemoveClass(target, classList, add) {
  285. if (!target || !classList) {
  286. return;
  287. }
  288. if (typeof classList === 'string') {
  289. classList = classList.split(/\s+/).filter(Boolean);
  290. }
  291. classList.forEach(function (className) {
  292. if (target.forEach) {
  293. target.forEach(function (elem) {
  294. add ? elem.classList.add(className) : elem.classList.remove(className);
  295. });
  296. } else {
  297. add ? target.classList.add(className) : target.classList.remove(className);
  298. }
  299. });
  300. };
  301. var addClass = function addClass(target, classList) {
  302. addOrRemoveClass(target, classList, true);
  303. };
  304. var removeClass = function removeClass(target, classList) {
  305. addOrRemoveClass(target, classList, false);
  306. };
  307. var getChildByClass = function getChildByClass(elem, className) {
  308. for (var i = 0; i < elem.childNodes.length; i++) {
  309. if (hasClass(elem.childNodes[i], className)) {
  310. return elem.childNodes[i];
  311. }
  312. }
  313. };
  314. var show = function show(elem, display) {
  315. if (!display) {
  316. display = elem === getPopup() || elem === getButtonsWrapper() ? 'flex' : 'block';
  317. }
  318. elem.style.opacity = '';
  319. elem.style.display = display;
  320. };
  321. var hide = function hide(elem) {
  322. elem.style.opacity = '';
  323. elem.style.display = 'none';
  324. };
  325. var empty = function empty(elem) {
  326. while (elem.firstChild) {
  327. elem.removeChild(elem.firstChild);
  328. }
  329. };
  330. // borrowed from jquery $(elem).is(':visible') implementation
  331. var isVisible = function isVisible(elem) {
  332. return elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
  333. };
  334. var removeStyleProperty = function removeStyleProperty(elem, property) {
  335. if (elem.style.removeProperty) {
  336. elem.style.removeProperty(property);
  337. } else {
  338. elem.style.removeAttribute(property);
  339. }
  340. };
  341. var animationEndEvent = function () {
  342. // Prevent run in Node env
  343. if (isNodeEnv()) {
  344. return false;
  345. }
  346. var testEl = document.createElement('div');
  347. var transEndEventNames = {
  348. 'WebkitAnimation': 'webkitAnimationEnd',
  349. 'OAnimation': 'oAnimationEnd oanimationend',
  350. 'animation': 'animationend'
  351. };
  352. for (var i in transEndEventNames) {
  353. if (transEndEventNames.hasOwnProperty(i) && typeof testEl.style[i] !== 'undefined') {
  354. return transEndEventNames[i];
  355. }
  356. }
  357. return false;
  358. }();
  359. // Reset previous window keydown handler and focued element
  360. var resetPrevState = function resetPrevState() {
  361. if (states.previousActiveElement && states.previousActiveElement.focus) {
  362. var x = window.scrollX;
  363. var y = window.scrollY;
  364. states.previousActiveElement.focus();
  365. if (typeof x !== 'undefined' && typeof y !== 'undefined') {
  366. // IE doesn't have scrollX/scrollY support
  367. window.scrollTo(x, y);
  368. }
  369. }
  370. };
  371. // Measure width of scrollbar
  372. // https://github.com/twbs/bootstrap/blob/master/js/modal.js#L279-L286
  373. var measureScrollbar = function measureScrollbar() {
  374. var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
  375. if (supportsTouch) {
  376. return 0;
  377. }
  378. var scrollDiv = document.createElement('div');
  379. scrollDiv.style.width = '50px';
  380. scrollDiv.style.height = '50px';
  381. scrollDiv.style.overflow = 'scroll';
  382. document.body.appendChild(scrollDiv);
  383. var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
  384. document.body.removeChild(scrollDiv);
  385. return scrollbarWidth;
  386. };
  387. /**
  388. * Inject a string of CSS into the page header
  389. *
  390. * @param {String} css
  391. */
  392. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
  393. return typeof obj;
  394. } : function (obj) {
  395. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  396. };
  397. var _extends = Object.assign || function (target) {
  398. for (var i = 1; i < arguments.length; i++) {
  399. var source = arguments[i];
  400. for (var key in source) {
  401. if (Object.prototype.hasOwnProperty.call(source, key)) {
  402. target[key] = source[key];
  403. }
  404. }
  405. }
  406. return target;
  407. };
  408. var popupParams = _extends({}, defaultParams);
  409. var queue = [];
  410. var previousWindowKeyDown = void 0;
  411. var windowOnkeydownOverridden = void 0;
  412. /*
  413. * Check for the existence of Promise
  414. * Hopefully to avoid many github issues
  415. */
  416. if (typeof Promise === 'undefined') {
  417. error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)');
  418. }
  419. /**
  420. * Show relevant warnings for given params
  421. *
  422. * @param params
  423. */
  424. var showWarningsForParams = function showWarningsForParams(params) {
  425. for (var param in params) {
  426. if (!sweetAlert.isValidParameter(param)) {
  427. warn('Unknown parameter "' + param + '"');
  428. }
  429. if (sweetAlert.isDeprecatedParameter(param)) {
  430. warnOnce('The parameter "' + param + '" is deprecated and will be removed in the next major release.');
  431. }
  432. }
  433. };
  434. /**
  435. * Set type, text and actions on popup
  436. *
  437. * @param params
  438. * @returns {boolean}
  439. */
  440. var setParameters = function setParameters(params) {
  441. // If a custom element is set, determine if it is valid
  442. if (typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) {
  443. warn('Target parameter is not valid, defaulting to "body"');
  444. params.target = 'body';
  445. }
  446. var popup = void 0;
  447. var oldPopup = getPopup();
  448. var targetElement = typeof params.target === 'string' ? document.querySelector(params.target) : params.target;
  449. // If the model target has changed, refresh the popup
  450. if (oldPopup && targetElement && oldPopup.parentNode !== targetElement.parentNode) {
  451. popup = init(params);
  452. } else {
  453. popup = oldPopup || init(params);
  454. }
  455. // Set popup width
  456. var popupWidth = params.width === defaultParams.width && params.toast ? 'auto' : params.width;
  457. popup.style.width = typeof popupWidth === 'number' ? popupWidth + 'px' : popupWidth;
  458. var popupPadding = params.padding === defaultParams.padding && params.toast ? 'inherit' : params.padding;
  459. popup.style.padding = typeof popupPadding === 'number' ? popupPadding + 'px' : popupPadding;
  460. popup.style.background = params.background;
  461. var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix');
  462. for (var i = 0; i < successIconParts.length; i++) {
  463. successIconParts[i].style.background = params.background;
  464. }
  465. var container = getContainer();
  466. var title = getTitle();
  467. var content = getContent();
  468. var buttonsWrapper = getButtonsWrapper();
  469. var confirmButton = getConfirmButton();
  470. var cancelButton = getCancelButton();
  471. var closeButton = getCloseButton();
  472. // Title
  473. if (params.titleText) {
  474. title.innerText = params.titleText;
  475. } else {
  476. title.innerHTML = params.title.split('\n').join('<br />');
  477. }
  478. if (!params.backdrop) {
  479. addClass([document.documentElement, document.body], swalClasses['no-backdrop']);
  480. }
  481. // Content
  482. if (params.text || params.html) {
  483. if (_typeof(params.html) === 'object') {
  484. content.innerHTML = '';
  485. if (0 in params.html) {
  486. for (var _i = 0; _i in params.html; _i++) {
  487. content.appendChild(params.html[_i].cloneNode(true));
  488. }
  489. } else {
  490. content.appendChild(params.html.cloneNode(true));
  491. }
  492. } else if (params.html) {
  493. content.innerHTML = params.html;
  494. } else if (params.text) {
  495. content.textContent = params.text;
  496. }
  497. show(content);
  498. } else {
  499. hide(content);
  500. }
  501. // Position
  502. if (params.position in swalClasses) {
  503. addClass(container, swalClasses[params.position]);
  504. }
  505. // Grow
  506. if (params.grow && typeof params.grow === 'string') {
  507. var growClass = 'grow-' + params.grow;
  508. if (growClass in swalClasses) {
  509. addClass(container, swalClasses[growClass]);
  510. }
  511. }
  512. // Close button
  513. if (params.showCloseButton) {
  514. closeButton.setAttribute('aria-label', params.closeButtonAriaLabel);
  515. show(closeButton);
  516. } else {
  517. hide(closeButton);
  518. }
  519. // Default Class
  520. popup.className = swalClasses.popup;
  521. if (params.toast) {
  522. addClass([document.documentElement, document.body], swalClasses['toast-shown']);
  523. addClass(popup, swalClasses.toast);
  524. } else {
  525. addClass(popup, swalClasses.modal);
  526. }
  527. // Custom Class
  528. if (params.customClass) {
  529. addClass(popup, params.customClass);
  530. }
  531. // Progress steps
  532. var progressStepsContainer = getProgressSteps();
  533. var currentProgressStep = parseInt(params.currentProgressStep === null ? sweetAlert.getQueueStep() : params.currentProgressStep, 10);
  534. if (params.progressSteps.length) {
  535. show(progressStepsContainer);
  536. empty(progressStepsContainer);
  537. if (currentProgressStep >= params.progressSteps.length) {
  538. warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)');
  539. }
  540. params.progressSteps.forEach(function (step, index) {
  541. var circle = document.createElement('li');
  542. addClass(circle, swalClasses.progresscircle);
  543. circle.innerHTML = step;
  544. if (index === currentProgressStep) {
  545. addClass(circle, swalClasses.activeprogressstep);
  546. }
  547. progressStepsContainer.appendChild(circle);
  548. if (index !== params.progressSteps.length - 1) {
  549. var line = document.createElement('li');
  550. addClass(line, swalClasses.progressline);
  551. line.style.width = params.progressStepsDistance;
  552. progressStepsContainer.appendChild(line);
  553. }
  554. });
  555. } else {
  556. hide(progressStepsContainer);
  557. }
  558. // Icon
  559. var icons = getIcons();
  560. for (var _i2 = 0; _i2 < icons.length; _i2++) {
  561. hide(icons[_i2]);
  562. }
  563. if (params.type) {
  564. var validType = false;
  565. for (var iconType in iconTypes) {
  566. if (params.type === iconType) {
  567. validType = true;
  568. break;
  569. }
  570. }
  571. if (!validType) {
  572. error('Unknown alert type: ' + params.type);
  573. return false;
  574. }
  575. var icon = popup.querySelector('.' + swalClasses.icon + '.' + iconTypes[params.type]);
  576. show(icon);
  577. // Animate icon
  578. if (params.animation) {
  579. switch (params.type) {
  580. case 'success':
  581. addClass(icon, 'swal2-animate-success-icon');
  582. addClass(icon.querySelector('.swal2-success-line-tip'), 'swal2-animate-success-line-tip');
  583. addClass(icon.querySelector('.swal2-success-line-long'), 'swal2-animate-success-line-long');
  584. break;
  585. case 'error':
  586. addClass(icon, 'swal2-animate-error-icon');
  587. addClass(icon.querySelector('.swal2-x-mark'), 'swal2-animate-x-mark');
  588. break;
  589. default:
  590. break;
  591. }
  592. }
  593. }
  594. // Custom image
  595. var image = getImage();
  596. if (params.imageUrl) {
  597. image.setAttribute('src', params.imageUrl);
  598. image.setAttribute('alt', params.imageAlt);
  599. show(image);
  600. if (params.imageWidth) {
  601. image.setAttribute('width', params.imageWidth);
  602. } else {
  603. image.removeAttribute('width');
  604. }
  605. if (params.imageHeight) {
  606. image.setAttribute('height', params.imageHeight);
  607. } else {
  608. image.removeAttribute('height');
  609. }
  610. image.className = swalClasses.image;
  611. if (params.imageClass) {
  612. addClass(image, params.imageClass);
  613. }
  614. } else {
  615. hide(image);
  616. }
  617. // Cancel button
  618. if (params.showCancelButton) {
  619. cancelButton.style.display = 'inline-block';
  620. } else {
  621. hide(cancelButton);
  622. }
  623. // Confirm button
  624. if (params.showConfirmButton) {
  625. removeStyleProperty(confirmButton, 'display');
  626. } else {
  627. hide(confirmButton);
  628. }
  629. // Buttons wrapper
  630. if (!params.showConfirmButton && !params.showCancelButton) {
  631. hide(buttonsWrapper);
  632. } else {
  633. show(buttonsWrapper);
  634. }
  635. // Edit text on confirm and cancel buttons
  636. confirmButton.innerHTML = params.confirmButtonText;
  637. cancelButton.innerHTML = params.cancelButtonText;
  638. // ARIA labels for confirm and cancel buttons
  639. confirmButton.setAttribute('aria-label', params.confirmButtonAriaLabel);
  640. cancelButton.setAttribute('aria-label', params.cancelButtonAriaLabel);
  641. // Set buttons to selected background colors
  642. if (params.buttonsStyling) {
  643. confirmButton.style.backgroundColor = params.confirmButtonColor;
  644. cancelButton.style.backgroundColor = params.cancelButtonColor;
  645. }
  646. // Add buttons custom classes
  647. confirmButton.className = swalClasses.confirm;
  648. addClass(confirmButton, params.confirmButtonClass);
  649. cancelButton.className = swalClasses.cancel;
  650. addClass(cancelButton, params.cancelButtonClass);
  651. // Buttons styling
  652. if (params.buttonsStyling) {
  653. addClass([confirmButton, cancelButton], swalClasses.styled);
  654. } else {
  655. removeClass([confirmButton, cancelButton], swalClasses.styled);
  656. confirmButton.style.backgroundColor = confirmButton.style.borderLeftColor = confirmButton.style.borderRightColor = '';
  657. cancelButton.style.backgroundColor = cancelButton.style.borderLeftColor = cancelButton.style.borderRightColor = '';
  658. }
  659. // CSS animation
  660. if (params.animation === true) {
  661. removeClass(popup, swalClasses.noanimation);
  662. } else {
  663. addClass(popup, swalClasses.noanimation);
  664. }
  665. // showLoaderOnConfirm && preConfirm
  666. if (params.showLoaderOnConfirm && !params.preConfirm) {
  667. warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request');
  668. }
  669. };
  670. /**
  671. * Animations
  672. *
  673. * @param animation
  674. * @param onBeforeOpen
  675. * @param onComplete
  676. */
  677. var openPopup = function openPopup(animation, onBeforeOpen, onComplete) {
  678. var container = getContainer();
  679. var popup = getPopup();
  680. if (onBeforeOpen !== null && typeof onBeforeOpen === 'function') {
  681. onBeforeOpen(popup);
  682. }
  683. if (animation) {
  684. addClass(popup, swalClasses.show);
  685. addClass(container, swalClasses.fade);
  686. removeClass(popup, swalClasses.hide);
  687. } else {
  688. removeClass(popup, swalClasses.fade);
  689. }
  690. show(popup);
  691. // scrolling is 'hidden' until animation is done, after that 'auto'
  692. container.style.overflowY = 'hidden';
  693. if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) {
  694. popup.addEventListener(animationEndEvent, function swalCloseEventFinished() {
  695. popup.removeEventListener(animationEndEvent, swalCloseEventFinished);
  696. container.style.overflowY = 'auto';
  697. });
  698. } else {
  699. container.style.overflowY = 'auto';
  700. }
  701. addClass([document.documentElement, document.body, container], swalClasses.shown);
  702. if (isModal()) {
  703. fixScrollbar();
  704. iOSfix();
  705. }
  706. states.previousActiveElement = document.activeElement;
  707. if (onComplete !== null && typeof onComplete === 'function') {
  708. setTimeout(function () {
  709. onComplete(popup);
  710. });
  711. }
  712. };
  713. var fixScrollbar = function fixScrollbar() {
  714. // for queues, do not do this more than once
  715. if (states.previousBodyPadding !== null) {
  716. return;
  717. }
  718. // if the body has overflow
  719. if (document.body.scrollHeight > window.innerHeight) {
  720. // add padding so the content doesn't shift after removal of scrollbar
  721. states.previousBodyPadding = document.body.style.paddingRight;
  722. document.body.style.paddingRight = measureScrollbar() + 'px';
  723. }
  724. };
  725. var undoScrollbar = function undoScrollbar() {
  726. if (states.previousBodyPadding !== null) {
  727. document.body.style.paddingRight = states.previousBodyPadding;
  728. states.previousBodyPadding = null;
  729. }
  730. };
  731. // Fix iOS scrolling http://stackoverflow.com/q/39626302/1331425
  732. var iOSfix = function iOSfix() {
  733. var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
  734. if (iOS && !hasClass(document.body, swalClasses.iosfix)) {
  735. var offset = document.body.scrollTop;
  736. document.body.style.top = offset * -1 + 'px';
  737. addClass(document.body, swalClasses.iosfix);
  738. }
  739. };
  740. var undoIOSfix = function undoIOSfix() {
  741. if (hasClass(document.body, swalClasses.iosfix)) {
  742. var offset = parseInt(document.body.style.top, 10);
  743. removeClass(document.body, swalClasses.iosfix);
  744. document.body.style.top = '';
  745. document.body.scrollTop = offset * -1;
  746. }
  747. };
  748. // SweetAlert entry point
  749. var sweetAlert = function sweetAlert() {
  750. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  751. args[_key] = arguments[_key];
  752. }
  753. // Prevent run in Node env
  754. if (typeof window === 'undefined') {
  755. return;
  756. }
  757. if (typeof args[0] === 'undefined') {
  758. error('SweetAlert2 expects at least 1 attribute!');
  759. return false;
  760. }
  761. var params = _extends({}, popupParams);
  762. switch (_typeof(args[0])) {
  763. case 'string':
  764. params.title = args[0];
  765. params.html = args[1];
  766. params.type = args[2];
  767. break;
  768. case 'object':
  769. showWarningsForParams(args[0]);
  770. _extends(params, args[0]);
  771. params.extraParams = args[0].extraParams;
  772. if (params.input === 'email' && params.inputValidator === null) {
  773. var inputValidator = function inputValidator(email) {
  774. return new Promise(function (resolve, reject) {
  775. var emailRegex = /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/;
  776. if (emailRegex.test(email)) {
  777. resolve();
  778. } else {
  779. reject('Invalid email address');
  780. }
  781. });
  782. };
  783. params.inputValidator = params.expectRejections ? inputValidator : sweetAlert.adaptInputValidator(inputValidator);
  784. }
  785. if (params.input === 'url' && params.inputValidator === null) {
  786. var _inputValidator = function _inputValidator(url) {
  787. return new Promise(function (resolve, reject) {
  788. // taken from https://stackoverflow.com/a/3809435/1331425
  789. var urlRegex = /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/;
  790. if (urlRegex.test(url)) {
  791. resolve();
  792. } else {
  793. reject('Invalid URL');
  794. }
  795. });
  796. };
  797. params.inputValidator = params.expectRejections ? _inputValidator : sweetAlert.adaptInputValidator(_inputValidator);
  798. }
  799. break;
  800. default:
  801. error('Unexpected type of argument! Expected "string" or "object", got ' + _typeof(args[0]));
  802. return false;
  803. }
  804. setParameters(params);
  805. var container = getContainer();
  806. var popup = getPopup();
  807. return new Promise(function (resolve, reject) {
  808. // functions to handle all resolving/rejecting/settling
  809. var succeedWith = function succeedWith(value) {
  810. sweetAlert.closePopup(params.onClose);
  811. if (params.useRejections) {
  812. resolve(value);
  813. } else {
  814. resolve({ value: value });
  815. }
  816. };
  817. var dismissWith = function dismissWith(dismiss) {
  818. sweetAlert.closePopup(params.onClose);
  819. if (params.useRejections) {
  820. reject(dismiss);
  821. } else {
  822. resolve({ dismiss: dismiss });
  823. }
  824. };
  825. var errorWith = function errorWith(error$$1) {
  826. sweetAlert.closePopup(params.onClose);
  827. reject(error$$1);
  828. };
  829. // Close on timer
  830. if (params.timer) {
  831. popup.timeout = setTimeout(function () {
  832. return dismissWith('timer');
  833. }, params.timer);
  834. }
  835. // Get input element by specified type or, if type isn't specified, by params.input
  836. var getInput = function getInput(inputType) {
  837. inputType = inputType || params.input;
  838. if (!inputType) {
  839. return null;
  840. }
  841. switch (inputType) {
  842. case 'select':
  843. case 'textarea':
  844. case 'file':
  845. return getChildByClass(popup, swalClasses[inputType]);
  846. case 'checkbox':
  847. return popup.querySelector('.' + swalClasses.checkbox + ' input');
  848. case 'radio':
  849. return popup.querySelector('.' + swalClasses.radio + ' input:checked') || popup.querySelector('.' + swalClasses.radio + ' input:first-child');
  850. case 'range':
  851. return popup.querySelector('.' + swalClasses.range + ' input');
  852. default:
  853. return getChildByClass(popup, swalClasses.input);
  854. }
  855. };
  856. // Get the value of the popup input
  857. var getInputValue = function getInputValue() {
  858. var input = getInput();
  859. if (!input) {
  860. return null;
  861. }
  862. switch (params.input) {
  863. case 'checkbox':
  864. return input.checked ? 1 : 0;
  865. case 'radio':
  866. return input.checked ? input.value : null;
  867. case 'file':
  868. return input.files.length ? input.files[0] : null;
  869. default:
  870. return params.inputAutoTrim ? input.value.trim() : input.value;
  871. }
  872. };
  873. // input autofocus
  874. if (params.input) {
  875. setTimeout(function () {
  876. var input = getInput();
  877. if (input) {
  878. focusInput(input);
  879. }
  880. }, 0);
  881. }
  882. var confirm = function confirm(value) {
  883. if (params.showLoaderOnConfirm) {
  884. sweetAlert.showLoading();
  885. }
  886. if (params.preConfirm) {
  887. sweetAlert.resetValidationError();
  888. var preConfirmPromise = Promise.resolve().then(function () {
  889. return params.preConfirm(value, params.extraParams);
  890. });
  891. if (params.expectRejections) {
  892. preConfirmPromise.then(function (preConfirmValue) {
  893. return succeedWith(preConfirmValue || value);
  894. }, function (validationError) {
  895. sweetAlert.hideLoading();
  896. if (validationError) {
  897. sweetAlert.showValidationError(validationError);
  898. }
  899. });
  900. } else {
  901. preConfirmPromise.then(function (preConfirmValue) {
  902. if (isVisible(getValidationError())) {
  903. sweetAlert.hideLoading();
  904. } else {
  905. succeedWith(preConfirmValue || value);
  906. }
  907. }, function (error$$1) {
  908. return errorWith(error$$1);
  909. });
  910. }
  911. } else {
  912. succeedWith(value);
  913. }
  914. };
  915. // Mouse interactions
  916. var onButtonEvent = function onButtonEvent(event) {
  917. var e = event || window.event;
  918. var target = e.target || e.srcElement;
  919. var confirmButton = getConfirmButton();
  920. var cancelButton = getCancelButton();
  921. var targetedConfirm = confirmButton && (confirmButton === target || confirmButton.contains(target));
  922. var targetedCancel = cancelButton && (cancelButton === target || cancelButton.contains(target));
  923. switch (e.type) {
  924. case 'mouseover':
  925. case 'mouseup':
  926. if (params.buttonsStyling) {
  927. if (targetedConfirm) {
  928. confirmButton.style.backgroundColor = colorLuminance(params.confirmButtonColor, -0.1);
  929. } else if (targetedCancel) {
  930. cancelButton.style.backgroundColor = colorLuminance(params.cancelButtonColor, -0.1);
  931. }
  932. }
  933. break;
  934. case 'mouseout':
  935. if (params.buttonsStyling) {
  936. if (targetedConfirm) {
  937. confirmButton.style.backgroundColor = params.confirmButtonColor;
  938. } else if (targetedCancel) {
  939. cancelButton.style.backgroundColor = params.cancelButtonColor;
  940. }
  941. }
  942. break;
  943. case 'mousedown':
  944. if (params.buttonsStyling) {
  945. if (targetedConfirm) {
  946. confirmButton.style.backgroundColor = colorLuminance(params.confirmButtonColor, -0.2);
  947. } else if (targetedCancel) {
  948. cancelButton.style.backgroundColor = colorLuminance(params.cancelButtonColor, -0.2);
  949. }
  950. }
  951. break;
  952. case 'click':
  953. // Clicked 'confirm'
  954. if (targetedConfirm && sweetAlert.isVisible()) {
  955. sweetAlert.disableButtons();
  956. if (params.input) {
  957. var inputValue = getInputValue();
  958. if (params.inputValidator) {
  959. sweetAlert.disableInput();
  960. var validationPromise = Promise.resolve().then(function () {
  961. return params.inputValidator(inputValue, params.extraParams);
  962. });
  963. if (params.expectRejections) {
  964. validationPromise.then(function () {
  965. sweetAlert.enableButtons();
  966. sweetAlert.enableInput();
  967. confirm(inputValue);
  968. }, function (validationError) {
  969. sweetAlert.enableButtons();
  970. sweetAlert.enableInput();
  971. if (validationError) {
  972. sweetAlert.showValidationError(validationError);
  973. }
  974. });
  975. } else {
  976. validationPromise.then(function (validationError) {
  977. sweetAlert.enableButtons();
  978. sweetAlert.enableInput();
  979. if (validationError) {
  980. sweetAlert.showValidationError(validationError);
  981. } else {
  982. confirm(inputValue);
  983. }
  984. }, function (error$$1) {
  985. return errorWith(error$$1);
  986. });
  987. }
  988. } else {
  989. confirm(inputValue);
  990. }
  991. } else {
  992. confirm(true);
  993. }
  994. // Clicked 'cancel'
  995. } else if (targetedCancel && sweetAlert.isVisible()) {
  996. sweetAlert.disableButtons();
  997. dismissWith('cancel');
  998. }
  999. break;
  1000. default:
  1001. }
  1002. };
  1003. var buttons = popup.querySelectorAll('button');
  1004. for (var i = 0; i < buttons.length; i++) {
  1005. buttons[i].onclick = onButtonEvent;
  1006. buttons[i].onmouseover = onButtonEvent;
  1007. buttons[i].onmouseout = onButtonEvent;
  1008. buttons[i].onmousedown = onButtonEvent;
  1009. }
  1010. // Closing popup by close button
  1011. getCloseButton().onclick = function () {
  1012. dismissWith('close');
  1013. };
  1014. if (params.toast) {
  1015. // Closing popup by overlay click
  1016. popup.onclick = function (e) {
  1017. if (e.target !== popup || params.showConfirmButton || params.showCancelButton) {
  1018. return;
  1019. }
  1020. if (params.allowOutsideClick) {
  1021. sweetAlert.closePopup(params.onClose);
  1022. dismissWith('overlay');
  1023. }
  1024. };
  1025. } else {
  1026. var ignoreOutsideClick = false;
  1027. // Ignore click events that had mousedown on the popup but mouseup on the container
  1028. // This can happen when the user drags a slider
  1029. popup.onmousedown = function () {
  1030. container.onmouseup = function (e) {
  1031. container.onmouseup = undefined;
  1032. // We only check if the mouseup target is the container because usually it doesn't
  1033. // have any other direct children aside of the popup
  1034. if (e.target === container) {
  1035. ignoreOutsideClick = true;
  1036. }
  1037. };
  1038. };
  1039. // Ignore click events that had mousedown on the container but mouseup on the popup
  1040. container.onmousedown = function () {
  1041. popup.onmouseup = function (e) {
  1042. popup.onmouseup = undefined;
  1043. // We also need to check if the mouseup target is a child of the popup
  1044. if (e.target === popup || popup.contains(e.target)) {
  1045. ignoreOutsideClick = true;
  1046. }
  1047. };
  1048. };
  1049. container.onclick = function (e) {
  1050. if (ignoreOutsideClick) {
  1051. ignoreOutsideClick = false;
  1052. return;
  1053. }
  1054. if (e.target !== container) {
  1055. return;
  1056. }
  1057. if (params.allowOutsideClick) {
  1058. if (typeof params.allowOutsideClick === 'function') {
  1059. if (params.allowOutsideClick()) {
  1060. dismissWith('overlay');
  1061. }
  1062. } else {
  1063. dismissWith('overlay');
  1064. }
  1065. }
  1066. };
  1067. }
  1068. var buttonsWrapper = getButtonsWrapper();
  1069. var confirmButton = getConfirmButton();
  1070. var cancelButton = getCancelButton();
  1071. // Reverse buttons (Confirm on the right side)
  1072. if (params.reverseButtons) {
  1073. confirmButton.parentNode.insertBefore(cancelButton, confirmButton);
  1074. } else {
  1075. confirmButton.parentNode.insertBefore(confirmButton, cancelButton);
  1076. }
  1077. // Focus handling
  1078. var setFocus = function setFocus(index, increment) {
  1079. var focusableElements = getFocusableElements(params.focusCancel);
  1080. // search for visible elements and select the next possible match
  1081. for (var _i3 = 0; _i3 < focusableElements.length; _i3++) {
  1082. index = index + increment;
  1083. // rollover to first item
  1084. if (index === focusableElements.length) {
  1085. index = 0;
  1086. // go to last item
  1087. } else if (index === -1) {
  1088. index = focusableElements.length - 1;
  1089. }
  1090. // determine if element is visible
  1091. var el = focusableElements[index];
  1092. if (isVisible(el)) {
  1093. return el.focus();
  1094. }
  1095. }
  1096. };
  1097. var handleKeyDown = function handleKeyDown(event) {
  1098. var e = event || window.event;
  1099. var arrowKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Left', 'Right', 'Up', 'Down' // IE11
  1100. ];
  1101. if (e.key === 'Enter' && !e.isComposing) {
  1102. if (e.target === getInput()) {
  1103. if (['textarea', 'file'].indexOf(params.input) !== -1) {
  1104. return; // do not submit
  1105. }
  1106. sweetAlert.clickConfirm();
  1107. e.preventDefault();
  1108. }
  1109. // TAB
  1110. } else if (e.key === 'Tab') {
  1111. var targetElement = e.target || e.srcElement;
  1112. var focusableElements = getFocusableElements(params.focusCancel);
  1113. var btnIndex = -1; // Find the button - note, this is a nodelist, not an array.
  1114. for (var _i4 = 0; _i4 < focusableElements.length; _i4++) {
  1115. if (targetElement === focusableElements[_i4]) {
  1116. btnIndex = _i4;
  1117. break;
  1118. }
  1119. }
  1120. if (!e.shiftKey) {
  1121. // Cycle to the next button
  1122. setFocus(btnIndex, 1);
  1123. } else {
  1124. // Cycle to the prev button
  1125. setFocus(btnIndex, -1);
  1126. }
  1127. e.stopPropagation();
  1128. e.preventDefault();
  1129. // ARROWS - switch focus between buttons
  1130. } else if (arrowKeys.indexOf(e.key) !== -1) {
  1131. // focus Cancel button if Confirm button is currently focused
  1132. if (document.activeElement === confirmButton && isVisible(cancelButton)) {
  1133. cancelButton.focus();
  1134. // and vice versa
  1135. } else if (document.activeElement === cancelButton && isVisible(confirmButton)) {
  1136. confirmButton.focus();
  1137. }
  1138. // ESC
  1139. } else if ((e.key === 'Escape' || e.key === 'Esc') && params.allowEscapeKey === true) {
  1140. dismissWith('esc');
  1141. }
  1142. };
  1143. if (params.toast && windowOnkeydownOverridden) {
  1144. window.onkeydown = previousWindowKeyDown;
  1145. windowOnkeydownOverridden = false;
  1146. }
  1147. if (!params.toast && !windowOnkeydownOverridden) {
  1148. previousWindowKeyDown = window.onkeydown;
  1149. windowOnkeydownOverridden = true;
  1150. window.onkeydown = handleKeyDown;
  1151. }
  1152. // Loading state
  1153. if (params.buttonsStyling) {
  1154. confirmButton.style.borderLeftColor = params.confirmButtonColor;
  1155. confirmButton.style.borderRightColor = params.confirmButtonColor;
  1156. }
  1157. /**
  1158. * Show spinner instead of Confirm button and disable Cancel button
  1159. */
  1160. sweetAlert.hideLoading = sweetAlert.disableLoading = function () {
  1161. if (!params.showConfirmButton) {
  1162. hide(confirmButton);
  1163. if (!params.showCancelButton) {
  1164. hide(getButtonsWrapper());
  1165. }
  1166. }
  1167. removeClass([popup, buttonsWrapper], swalClasses.loading);
  1168. popup.removeAttribute('aria-busy');
  1169. popup.removeAttribute('data-loading');
  1170. confirmButton.disabled = false;
  1171. cancelButton.disabled = false;
  1172. };
  1173. sweetAlert.getTitle = function () {
  1174. return getTitle();
  1175. };
  1176. sweetAlert.getContent = function () {
  1177. return getContent();
  1178. };
  1179. sweetAlert.getInput = function () {
  1180. return getInput();
  1181. };
  1182. sweetAlert.getImage = function () {
  1183. return getImage();
  1184. };
  1185. sweetAlert.getButtonsWrapper = function () {
  1186. return getButtonsWrapper();
  1187. };
  1188. sweetAlert.getConfirmButton = function () {
  1189. return getConfirmButton();
  1190. };
  1191. sweetAlert.getCancelButton = function () {
  1192. return getCancelButton();
  1193. };
  1194. sweetAlert.isLoading = function () {
  1195. return isLoading();
  1196. };
  1197. sweetAlert.enableButtons = function () {
  1198. confirmButton.disabled = false;
  1199. cancelButton.disabled = false;
  1200. };
  1201. sweetAlert.disableButtons = function () {
  1202. confirmButton.disabled = true;
  1203. cancelButton.disabled = true;
  1204. };
  1205. sweetAlert.enableConfirmButton = function () {
  1206. confirmButton.disabled = false;
  1207. };
  1208. sweetAlert.disableConfirmButton = function () {
  1209. confirmButton.disabled = true;
  1210. };
  1211. sweetAlert.enableInput = function () {
  1212. var input = getInput();
  1213. if (!input) {
  1214. return false;
  1215. }
  1216. if (input.type === 'radio') {
  1217. var radiosContainer = input.parentNode.parentNode;
  1218. var radios = radiosContainer.querySelectorAll('input');
  1219. for (var _i5 = 0; _i5 < radios.length; _i5++) {
  1220. radios[_i5].disabled = false;
  1221. }
  1222. } else {
  1223. input.disabled = false;
  1224. }
  1225. };
  1226. sweetAlert.disableInput = function () {
  1227. var input = getInput();
  1228. if (!input) {
  1229. return false;
  1230. }
  1231. if (input && input.type === 'radio') {
  1232. var radiosContainer = input.parentNode.parentNode;
  1233. var radios = radiosContainer.querySelectorAll('input');
  1234. for (var _i6 = 0; _i6 < radios.length; _i6++) {
  1235. radios[_i6].disabled = true;
  1236. }
  1237. } else {
  1238. input.disabled = true;
  1239. }
  1240. };
  1241. // Show block with validation error
  1242. sweetAlert.showValidationError = function (error$$1) {
  1243. var validationError = getValidationError();
  1244. validationError.innerHTML = error$$1;
  1245. show(validationError);
  1246. var input = getInput();
  1247. if (input) {
  1248. input.setAttribute('aria-invalid', true);
  1249. input.setAttribute('aria-describedBy', swalClasses.validationerror);
  1250. focusInput(input);
  1251. addClass(input, swalClasses.inputerror);
  1252. }
  1253. };
  1254. // Hide block with validation error
  1255. sweetAlert.resetValidationError = function () {
  1256. var validationError = getValidationError();
  1257. hide(validationError);
  1258. var input = getInput();
  1259. if (input) {
  1260. input.removeAttribute('aria-invalid');
  1261. input.removeAttribute('aria-describedBy');
  1262. removeClass(input, swalClasses.inputerror);
  1263. }
  1264. };
  1265. sweetAlert.getProgressSteps = function () {
  1266. return params.progressSteps;
  1267. };
  1268. sweetAlert.setProgressSteps = function (progressSteps) {
  1269. params.progressSteps = progressSteps;
  1270. setParameters(params);
  1271. };
  1272. sweetAlert.showProgressSteps = function () {
  1273. show(getProgressSteps());
  1274. };
  1275. sweetAlert.hideProgressSteps = function () {
  1276. hide(getProgressSteps());
  1277. };
  1278. sweetAlert.enableButtons();
  1279. sweetAlert.hideLoading();
  1280. sweetAlert.resetValidationError();
  1281. if (params.input) {
  1282. addClass(document.body, swalClasses['has-input']);
  1283. }
  1284. // inputs
  1285. var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea'];
  1286. var input = void 0;
  1287. for (var _i7 = 0; _i7 < inputTypes.length; _i7++) {
  1288. var inputClass = swalClasses[inputTypes[_i7]];
  1289. var inputContainer = getChildByClass(popup, inputClass);
  1290. input = getInput(inputTypes[_i7]);
  1291. // set attributes
  1292. if (input) {
  1293. for (var j in input.attributes) {
  1294. if (input.attributes.hasOwnProperty(j)) {
  1295. var attrName = input.attributes[j].name;
  1296. if (attrName !== 'type' && attrName !== 'value') {
  1297. input.removeAttribute(attrName);
  1298. }
  1299. }
  1300. }
  1301. for (var attr in params.inputAttributes) {
  1302. input.setAttribute(attr, params.inputAttributes[attr]);
  1303. }
  1304. }
  1305. // set class
  1306. inputContainer.className = inputClass;
  1307. if (params.inputClass) {
  1308. addClass(inputContainer, params.inputClass);
  1309. }
  1310. hide(inputContainer);
  1311. }
  1312. var populateInputOptions = void 0;
  1313. switch (params.input) {
  1314. case 'text':
  1315. case 'email':
  1316. case 'password':
  1317. case 'number':
  1318. case 'tel':
  1319. case 'url':
  1320. input = getChildByClass(popup, swalClasses.input);
  1321. input.value = params.inputValue;
  1322. input.placeholder = params.inputPlaceholder;
  1323. input.type = params.input;
  1324. show(input);
  1325. break;
  1326. case 'file':
  1327. input = getChildByClass(popup, swalClasses.file);
  1328. input.placeholder = params.inputPlaceholder;
  1329. input.type = params.input;
  1330. show(input);
  1331. break;
  1332. case 'range':
  1333. var range = getChildByClass(popup, swalClasses.range);
  1334. var rangeInput = range.querySelector('input');
  1335. var rangeOutput = range.querySelector('output');
  1336. rangeInput.value = params.inputValue;
  1337. rangeInput.type = params.input;
  1338. rangeOutput.value = params.inputValue;
  1339. show(range);
  1340. break;
  1341. case 'select':
  1342. var select = getChildByClass(popup, swalClasses.select);
  1343. select.innerHTML = '';
  1344. if (params.inputPlaceholder) {
  1345. var placeholder = document.createElement('option');
  1346. placeholder.innerHTML = params.inputPlaceholder;
  1347. placeholder.value = '';
  1348. placeholder.disabled = true;
  1349. placeholder.selected = true;
  1350. select.appendChild(placeholder);
  1351. }
  1352. populateInputOptions = function populateInputOptions(inputOptions) {
  1353. for (var optionValue in inputOptions) {
  1354. var option = document.createElement('option');
  1355. option.value = optionValue;
  1356. option.innerHTML = inputOptions[optionValue];
  1357. if (params.inputValue.toString() === optionValue) {
  1358. option.selected = true;
  1359. }
  1360. select.appendChild(option);
  1361. }
  1362. show(select);
  1363. select.focus();
  1364. };
  1365. break;
  1366. case 'radio':
  1367. var radio = getChildByClass(popup, swalClasses.radio);
  1368. radio.innerHTML = '';
  1369. populateInputOptions = function populateInputOptions(inputOptions) {
  1370. for (var radioValue in inputOptions) {
  1371. var radioInput = document.createElement('input');
  1372. var radioLabel = document.createElement('label');
  1373. var radioLabelSpan = document.createElement('span');
  1374. radioInput.type = 'radio';
  1375. radioInput.name = swalClasses.radio;
  1376. radioInput.value = radioValue;
  1377. if (params.inputValue.toString() === radioValue) {
  1378. radioInput.checked = true;
  1379. }
  1380. radioLabelSpan.innerHTML = inputOptions[radioValue];
  1381. radioLabel.appendChild(radioInput);
  1382. radioLabel.appendChild(radioLabelSpan);
  1383. radioLabel.for = radioInput.id;
  1384. radio.appendChild(radioLabel);
  1385. }
  1386. show(radio);
  1387. var radios = radio.querySelectorAll('input');
  1388. if (radios.length) {
  1389. radios[0].focus();
  1390. }
  1391. };
  1392. break;
  1393. case 'checkbox':
  1394. var checkbox = getChildByClass(popup, swalClasses.checkbox);
  1395. var checkboxInput = getInput('checkbox');
  1396. checkboxInput.type = 'checkbox';
  1397. checkboxInput.value = 1;
  1398. checkboxInput.id = swalClasses.checkbox;
  1399. checkboxInput.checked = Boolean(params.inputValue);
  1400. var label = checkbox.getElementsByTagName('span');
  1401. if (label.length) {
  1402. checkbox.removeChild(label[0]);
  1403. }
  1404. label = document.createElement('span');
  1405. label.innerHTML = params.inputPlaceholder;
  1406. checkbox.appendChild(label);
  1407. show(checkbox);
  1408. break;
  1409. case 'textarea':
  1410. var textarea = getChildByClass(popup, swalClasses.textarea);
  1411. textarea.value = params.inputValue;
  1412. textarea.placeholder = params.inputPlaceholder;
  1413. show(textarea);
  1414. break;
  1415. case null:
  1416. break;
  1417. default:
  1418. error('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "' + params.input + '"');
  1419. break;
  1420. }
  1421. if (params.input === 'select' || params.input === 'radio') {
  1422. if (params.inputOptions instanceof Promise) {
  1423. sweetAlert.showLoading();
  1424. params.inputOptions.then(function (inputOptions) {
  1425. sweetAlert.hideLoading();
  1426. populateInputOptions(inputOptions);
  1427. });
  1428. } else if (_typeof(params.inputOptions) === 'object') {
  1429. populateInputOptions(params.inputOptions);
  1430. } else {
  1431. error('Unexpected type of inputOptions! Expected object or Promise, got ' + _typeof(params.inputOptions));
  1432. }
  1433. }
  1434. openPopup(params.animation, params.onBeforeOpen, params.onOpen);
  1435. if (!params.toast) {
  1436. if (!params.allowEnterKey) {
  1437. if (document.activeElement) {
  1438. document.activeElement.blur();
  1439. }
  1440. } else if (params.focusCancel && isVisible(cancelButton)) {
  1441. cancelButton.focus();
  1442. } else if (params.focusConfirm && isVisible(confirmButton)) {
  1443. confirmButton.focus();
  1444. } else {
  1445. setFocus(-1, 1);
  1446. }
  1447. }
  1448. // fix scroll
  1449. getContainer().scrollTop = 0;
  1450. });
  1451. };
  1452. /*
  1453. * Global function to determine if swal2 popup is shown
  1454. */
  1455. sweetAlert.isVisible = function () {
  1456. return !!getPopup();
  1457. };
  1458. /*
  1459. * Global function for chaining sweetAlert popups
  1460. */
  1461. sweetAlert.queue = function (steps) {
  1462. queue = steps;
  1463. var resetQueue = function resetQueue() {
  1464. queue = [];
  1465. document.body.removeAttribute('data-swal2-queue-step');
  1466. };
  1467. var queueResult = [];
  1468. return new Promise(function (resolve, reject) {
  1469. (function step(i, callback) {
  1470. if (i < queue.length) {
  1471. document.body.setAttribute('data-swal2-queue-step', i);
  1472. sweetAlert(queue[i]).then(function (result) {
  1473. if (typeof result.value !== 'undefined') {
  1474. queueResult.push(result.value);
  1475. step(i + 1, callback);
  1476. } else {
  1477. resetQueue();
  1478. resolve({ dismiss: result.dismiss });
  1479. }
  1480. });
  1481. } else {
  1482. resetQueue();
  1483. resolve({ value: queueResult });
  1484. }
  1485. })(0);
  1486. });
  1487. };
  1488. /*
  1489. * Global function for getting the index of current popup in queue
  1490. */
  1491. sweetAlert.getQueueStep = function () {
  1492. return document.body.getAttribute('data-swal2-queue-step');
  1493. };
  1494. /*
  1495. * Global function for inserting a popup to the queue
  1496. */
  1497. sweetAlert.insertQueueStep = function (step, index) {
  1498. if (index && index < queue.length) {
  1499. return queue.splice(index, 0, step);
  1500. }
  1501. return queue.push(step);
  1502. };
  1503. /*
  1504. * Global function for deleting a popup from the queue
  1505. */
  1506. sweetAlert.deleteQueueStep = function (index) {
  1507. if (typeof queue[index] !== 'undefined') {
  1508. queue.splice(index, 1);
  1509. }
  1510. };
  1511. /*
  1512. * Global function to close sweetAlert
  1513. */
  1514. sweetAlert.close = sweetAlert.closePopup = sweetAlert.closeModal = sweetAlert.closeToast = function (onComplete) {
  1515. var container = getContainer();
  1516. var popup = getPopup();
  1517. if (!popup) {
  1518. return;
  1519. }
  1520. removeClass(popup, swalClasses.show);
  1521. addClass(popup, swalClasses.hide);
  1522. clearTimeout(popup.timeout);
  1523. if (!isToast()) {
  1524. resetPrevState();
  1525. window.onkeydown = previousWindowKeyDown;
  1526. windowOnkeydownOverridden = false;
  1527. }
  1528. var removePopupAndResetState = function removePopupAndResetState() {
  1529. if (container.parentNode) {
  1530. container.parentNode.removeChild(container);
  1531. }
  1532. removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['no-backdrop'], swalClasses['has-input'], swalClasses['toast-shown']]);
  1533. if (isModal()) {
  1534. undoScrollbar();
  1535. undoIOSfix();
  1536. }
  1537. };
  1538. // If animation is supported, animate
  1539. if (animationEndEvent && !hasClass(popup, swalClasses.noanimation)) {
  1540. popup.addEventListener(animationEndEvent, function swalCloseEventFinished() {
  1541. popup.removeEventListener(animationEndEvent, swalCloseEventFinished);
  1542. if (hasClass(popup, swalClasses.hide)) {
  1543. removePopupAndResetState();
  1544. }
  1545. });
  1546. } else {
  1547. // Otherwise, remove immediately
  1548. removePopupAndResetState();
  1549. }
  1550. if (onComplete !== null && typeof onComplete === 'function') {
  1551. setTimeout(function () {
  1552. onComplete(popup);
  1553. });
  1554. }
  1555. };
  1556. /*
  1557. * Global function to click 'Confirm' button
  1558. */
  1559. sweetAlert.clickConfirm = function () {
  1560. return getConfirmButton().click();
  1561. };
  1562. /*
  1563. * Global function to click 'Cancel' button
  1564. */
  1565. sweetAlert.clickCancel = function () {
  1566. return getCancelButton().click();
  1567. };
  1568. /**
  1569. * Show spinner instead of Confirm button and disable Cancel button
  1570. */
  1571. sweetAlert.showLoading = sweetAlert.enableLoading = function () {
  1572. var popup = getPopup();
  1573. if (!popup) {
  1574. sweetAlert('');
  1575. }
  1576. popup = getPopup();
  1577. var buttonsWrapper = getButtonsWrapper();
  1578. var confirmButton = getConfirmButton();
  1579. var cancelButton = getCancelButton();
  1580. show(buttonsWrapper);
  1581. show(confirmButton, 'inline-block');
  1582. addClass([popup, buttonsWrapper], swalClasses.loading);
  1583. confirmButton.disabled = true;
  1584. cancelButton.disabled = true;
  1585. popup.setAttribute('data-loading', true);
  1586. popup.setAttribute('aria-busy', true);
  1587. popup.focus();
  1588. };
  1589. /**
  1590. * Is valid parameter
  1591. * @param {String} paramName
  1592. */
  1593. sweetAlert.isValidParameter = function (paramName) {
  1594. return defaultParams.hasOwnProperty(paramName) || paramName === 'extraParams';
  1595. };
  1596. /**
  1597. * Is deprecated parameter
  1598. * @param {String} paramName
  1599. */
  1600. sweetAlert.isDeprecatedParameter = function (paramName) {
  1601. return deprecatedParams.indexOf(paramName) !== -1;
  1602. };
  1603. /**
  1604. * Set default params for each popup
  1605. * @param {Object} userParams
  1606. */
  1607. sweetAlert.setDefaults = function (userParams) {
  1608. if (!userParams || (typeof userParams === 'undefined' ? 'undefined' : _typeof(userParams)) !== 'object') {
  1609. return error('the argument for setDefaults() is required and has to be a object');
  1610. }
  1611. showWarningsForParams(userParams);
  1612. // assign valid params from userParams to popupParams
  1613. for (var param in userParams) {
  1614. if (sweetAlert.isValidParameter(param)) {
  1615. popupParams[param] = userParams[param];
  1616. }
  1617. }
  1618. };
  1619. /**
  1620. * Reset default params for each popup
  1621. */
  1622. sweetAlert.resetDefaults = function () {
  1623. popupParams = _extends({}, defaultParams);
  1624. };
  1625. /**
  1626. * Adapt a legacy inputValidator for use with expectRejections=false
  1627. */
  1628. sweetAlert.adaptInputValidator = function (legacyValidator) {
  1629. return function adaptedInputValidator(inputValue, extraParams) {
  1630. return legacyValidator.call(this, inputValue, extraParams).then(function () {
  1631. return undefined;
  1632. }, function (validationError) {
  1633. return validationError;
  1634. });
  1635. };
  1636. };
  1637. sweetAlert.noop = function () {};
  1638. sweetAlert.version = '7.3.5';
  1639. sweetAlert.default = sweetAlert;
  1640. /**
  1641. * Set default params if `window._swalDefaults` is an object
  1642. */
  1643. if (typeof window !== 'undefined' && _typeof(window._swalDefaults) === 'object') {
  1644. sweetAlert.setDefaults(window._swalDefaults);
  1645. }
  1646. return sweetAlert;
  1647. })));
  1648. if (typeof window !== 'undefined' && window.Sweetalert2) window.sweetAlert = window.swal = window.Sweetalert2;