diff --git a/src/main/java/cc/ryanc/halo/model/enums/BlogProperties.java b/src/main/java/cc/ryanc/halo/model/enums/BlogProperties.java new file mode 100644 index 000000000..1dc42a7ad --- /dev/null +++ b/src/main/java/cc/ryanc/halo/model/enums/BlogProperties.java @@ -0,0 +1,169 @@ +package cc.ryanc.halo.model.enums; + +/** + * @author : RYAN0UP + * @date : 2019-03-17 + */ +public enum BlogProperties implements ValueEnum { + + /** + * 博客语言 + */ + BLOG_LOCALE("blog_locale"), + + /** + * 博客标题 + */ + BLOG_TITLE("blog_title"), + + /** + * 博客地址 + */ + BLOG_URL("blog_url"), + + /** + * 文章摘要字数 + */ + POST_SUMMARY("post_summary"), + + /** + * 首页文章条数 + */ + INDEX_POSTS("index_posts"), + + /** + * 每页评论条数 + */ + INDEX_COMMENTS("index_comments"), + + /** + * 是否已经安装 + */ + IS_INSTALL("is_install"), + + /** + * RSS显示文章条数 + */ + RSS_POSTS("rss_posts"), + + /** + * API状态 + */ + API_STATUS("api_status"), + + /** + * 邮箱服务器地址 + */ + MAIL_SMTP_HOST("mail_smtp_host"), + + /** + * 邮箱地址 + */ + MAIL_SMTP_USERNAME("mail_smtp_username"), + + /** + * 邮箱密码/授权码 + */ + MAIL_SMTP_PASSWORD("mail_smtp_password"), + + /** + * 发送者名称 + */ + MAIL_FROM_NAME("mail_from_name"), + + /** + * 启用邮件服务 + */ + SMTP_EMAIL_ENABLE("smtp_email_enable"), + + /** + * 邮件回复通知 + */ + COMMENT_REPLY_NOTICE("comment_reply_notice"), + + /** + * 新评论是否需要审核 + */ + NEW_COMMENT_NEED_CHECK("new_comment_need_check"), + + /** + * 新评论通知 + */ + NEW_COMMENT_NOTICE("new_comment_notice"), + + /** + * 邮件审核通过通知 + */ + COMMENT_PASS_NOTICE("comment_pass_notice"), + + /** + * 站点描述 + */ + SEO_DESC("seo_desc"), + + /** + * 博客主题 + */ + THEME("theme"), + + /** + * 博客搭建日期 + */ + BLOG_START("blog_start"), + + /** + * 仪表盘部件 文章总数 + */ + WIDGET_POSTCOUNT("widget_postcount"), + + /** + * 仪表盘部件 评论总数 + */ + WIDGET_COMMENTCOUNT("widget_commentcount"), + + /** + * 仪表盘部件 附件总数 + */ + WIDGET_ATTACHMENTCOUNT("widget_attachmentcount"), + + /** + * 仪表盘部件 成立天数 + */ + WIDGET_DAYCOUNT("widget_daycount"), + + /** + * 默认缩略图地址 + */ + DEFAULT_THUMBNAIL("/static/halo-content/images/thumbnail/thumbnail.png"), + + /** + * 自动备份 + */ + AUTO_BACKUP("auto_backup"), + + /** + * API Token + */ + API_TOKEN("api_token"), + + /** + * 附件存储位置 + */ + ATTACH_LOC("attach_loc"); + + private String value; + + BlogProperties(String value) { + this.value = value; + } + + /** + * Get enum value. + * + * @return enum value + */ + @Override + public String getValue() { + return value; + } +} diff --git a/src/main/java/cc/ryanc/halo/service/MailService.java b/src/main/java/cc/ryanc/halo/service/MailService.java new file mode 100644 index 000000000..b019975b6 --- /dev/null +++ b/src/main/java/cc/ryanc/halo/service/MailService.java @@ -0,0 +1,42 @@ +package cc.ryanc.halo.service; + +import java.util.Map; + +/** + * Mail server + * + * @author : RYAN0UP + * @date : 2019-03-17 + */ +public interface MailService { + + /** + * Send a simple email + * + * @param to recipient + * @param subject subject + * @param content content + */ + void sendMail(String to, String subject, String content); + + /** + * Send a email with html + * + * @param to recipient + * @param subject subject + * @param content content + * @param templateName template name + */ + void sendTemplateMail(String to, String subject, Map content, String templateName); + + /** + * Send mail with attachments + * + * @param to recipient + * @param subject subject + * @param content content + * @param templateName template name + * @param attachSrc attachment path + */ + void sendAttachMail(String to, String subject, Map content, String templateName, String attachSrc); +} diff --git a/src/main/java/cc/ryanc/halo/service/OptionService.java b/src/main/java/cc/ryanc/halo/service/OptionService.java index a309802e9..5981658c0 100755 --- a/src/main/java/cc/ryanc/halo/service/OptionService.java +++ b/src/main/java/cc/ryanc/halo/service/OptionService.java @@ -18,14 +18,14 @@ public interface OptionService extends CrudService { * @param key key * @param value value */ - void saveOption(String key, String value); + void save(String key, String value); /** * Save multiple options * * @param options options */ - void saveOptions(Map options); + void save(Map options); /** * Get all options diff --git a/src/main/java/cc/ryanc/halo/service/PostService.java b/src/main/java/cc/ryanc/halo/service/PostService.java index 9737965d4..cb8a257e9 100755 --- a/src/main/java/cc/ryanc/halo/service/PostService.java +++ b/src/main/java/cc/ryanc/halo/service/PostService.java @@ -37,7 +37,7 @@ public interface PostService extends CrudService { * @return Page */ @NonNull - Page pageByStatusAndType(PostStatus status, PostType type, Pageable pageable); + Page pageByStatus(PostStatus status, PostType type, Pageable pageable); /** * Count posts by status and type @@ -46,5 +46,5 @@ public interface PostService extends CrudService { * @param type type * @return posts count */ - Long countByStatusAndType(PostStatus status, PostType type); + Long countByStatus(PostStatus status, PostType type); } diff --git a/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java new file mode 100644 index 000000000..2268997e5 --- /dev/null +++ b/src/main/java/cc/ryanc/halo/service/impl/MailServiceImpl.java @@ -0,0 +1,113 @@ +package cc.ryanc.halo.service.impl; + +import cc.ryanc.halo.model.enums.BlogProperties; +import cc.ryanc.halo.service.MailService; +import cc.ryanc.halo.utils.HaloUtils; +import cn.hutool.core.text.StrBuilder; +import freemarker.template.Template; +import io.github.biezhi.ome.OhMyEmail; +import org.springframework.stereotype.Service; +import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; +import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; + +import java.io.File; +import java.util.Map; + +import static cc.ryanc.halo.model.support.HaloConst.OPTIONS; + +/** + * @author : RYAN0UP + * @date : 2019-03-17 + */ +@Service +public class MailServiceImpl implements MailService { + + private final FreeMarkerConfigurer freeMarker; + + public MailServiceImpl(FreeMarkerConfigurer freeMarker) { + this.freeMarker = freeMarker; + } + + /** + * Send a simple email + * + * @param to recipient + * @param subject subject + * @param content content + */ + @Override + public void sendMail(String to, String subject, String content) { + HaloUtils.configMail( + OPTIONS.get(BlogProperties.MAIL_SMTP_HOST.getValue()), + OPTIONS.get(BlogProperties.MAIL_SMTP_USERNAME.getValue()), + OPTIONS.get(BlogProperties.MAIL_SMTP_PASSWORD.getValue())); + try { + OhMyEmail.subject(subject) + .from(OPTIONS.get(BlogProperties.MAIL_FROM_NAME.getValue())) + .to(to) + .text(content) + .send(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Send template mail + * + * @param to recipient + * @param subject subject + * @param content content + * @param templateName template name + */ + @Override + public void sendTemplateMail(String to, String subject, Map content, String templateName) { + HaloUtils.configMail( + OPTIONS.get(BlogProperties.MAIL_SMTP_HOST.getValue()), + OPTIONS.get(BlogProperties.MAIL_SMTP_USERNAME.getValue()), + OPTIONS.get(BlogProperties.MAIL_SMTP_PASSWORD.getValue())); + StrBuilder text = new StrBuilder(); + try { + final Template template = freeMarker.getConfiguration().getTemplate(templateName); + text.append(FreeMarkerTemplateUtils.processTemplateIntoString(template, content)); + OhMyEmail.subject(subject) + .from(OPTIONS.get(BlogProperties.MAIL_FROM_NAME.getValue())) + .to(to) + .html(text.toString()) + .send(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Send mail with attachments + * + * @param to recipient + * @param subject subject + * @param content content + * @param templateName template name + * @param attachSrc attachment path + */ + @Override + public void sendAttachMail(String to, String subject, Map content, String templateName, String attachSrc) { + HaloUtils.configMail( + OPTIONS.get(BlogProperties.MAIL_SMTP_HOST.getValue()), + OPTIONS.get(BlogProperties.MAIL_SMTP_USERNAME.getValue()), + OPTIONS.get(BlogProperties.MAIL_SMTP_PASSWORD.getValue())); + File file = new File(attachSrc); + StrBuilder text = new StrBuilder(); + try { + final Template template = freeMarker.getConfiguration().getTemplate(templateName); + text.append(FreeMarkerTemplateUtils.processTemplateIntoString(template, content)); + OhMyEmail.subject(subject) + .from(OPTIONS.get(BlogProperties.MAIL_FROM_NAME.getValue())) + .to(to) + .html(text.toString()) + .attach(file, file.getName()) + .send(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/cc/ryanc/halo/service/impl/OptionServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/OptionServiceImpl.java index 20ea05d34..dee0e1584 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/OptionServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/OptionServiceImpl.java @@ -34,7 +34,7 @@ public class OptionServiceImpl extends AbstractCrudService impl * @param value value */ @Override - public void saveOption(String key, String value) { + public void save(String key, String value) { if (StrUtil.equals(value, "")) { optionRepository.removeByOptionKey(key); } else if (StrUtil.isNotEmpty(key)) { @@ -61,9 +61,9 @@ public class OptionServiceImpl extends AbstractCrudService impl * @param options options */ @Override - public void saveOptions(Map options) { + public void save(Map options) { if (!CollectionUtils.isEmpty(options)) { - options.forEach(this::saveOption); + options.forEach(this::save); } } diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java index 53a2a7e08..848cd78b1 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java @@ -51,7 +51,7 @@ public class PostServiceImpl extends AbstractCrudService implemen * @return Page */ @Override - public Page pageByStatusAndType(PostStatus status, PostType type, Pageable pageable) { + public Page pageByStatus(PostStatus status, PostType type, Pageable pageable) { Page posts = postRepository.findAllByStatusAndType(status, type, pageable); return posts.map(post -> new PostSimpleOutputDTO().convertFrom(post)); } @@ -65,7 +65,7 @@ public class PostServiceImpl extends AbstractCrudService implemen * @return posts count */ @Override - public Long countByStatusAndType(PostStatus status, PostType type) { + public Long countByStatus(PostStatus status, PostType type) { return postRepository.countByStatusAndType(status,type); } } diff --git a/src/main/java/cc/ryanc/halo/utils/ThemeUtils.java b/src/main/java/cc/ryanc/halo/utils/ThemeUtils.java index 8e2ac4f31..2118659f3 100644 --- a/src/main/java/cc/ryanc/halo/utils/ThemeUtils.java +++ b/src/main/java/cc/ryanc/halo/utils/ThemeUtils.java @@ -107,11 +107,7 @@ public class ThemeUtils { * @return File */ public static File getThemesPath(String themeName) throws FileNotFoundException { - if (isInternal(themeName)) { - return getInternalThemesPath(); - } else { - return getUsersThemesPath(); - } + return isInternal(themeName)?getInternalThemesPath():getUsersThemesPath(); } /** diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java index d3514fed9..9a6b8cd99 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java @@ -43,12 +43,12 @@ public class PostController { public String listPosts(Model model, @PageableDefault(sort = {"topPriority", "createTime"}, direction = DESC) Pageable pageable, @RequestParam(value = "status", defaultValue = "published") PostStatus status) { - final Page postPage = postService.pageByStatusAndType(status, PostType.POST, pageable); + final Page postPage = postService.pageByStatus(status, PostType.POST, pageable); model.addAttribute("posts", postPage); - model.addAttribute("publishedCount", postService.countByStatusAndType(PostStatus.PUBLISHED, PostType.POST)); - model.addAttribute("draftCount", postService.countByStatusAndType(PostStatus.DRAFT, PostType.POST)); - model.addAttribute("recycleCount", postService.countByStatusAndType(PostStatus.RECYCLE, PostType.POST)); + model.addAttribute("publishedCount", postService.countByStatus(PostStatus.PUBLISHED, PostType.POST)); + model.addAttribute("draftCount", postService.countByStatus(PostStatus.DRAFT, PostType.POST)); + model.addAttribute("recycleCount", postService.countByStatus(PostStatus.RECYCLE, PostType.POST)); model.addAttribute("status", status); return "admin/admin_post"; } diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java index 0a254c19b..6712540bc 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/ThemeController.java @@ -69,7 +69,7 @@ public class ThemeController extends BaseController { public JsonResult activeTheme(@RequestParam("themeName") String themeName, HttpServletRequest request) { try { - optionService.saveOption("theme", themeName); + optionService.save("theme", themeName); BaseContentController.THEME = themeName; configuration.setSharedVariable("themeName", themeName); log.info("Changed theme to {}", themeName); diff --git a/src/main/java/cc/ryanc/halo/web/controller/content/IndexController.java b/src/main/java/cc/ryanc/halo/web/controller/content/IndexController.java index 3b1450f61..a3cca1f5e 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/content/IndexController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/content/IndexController.java @@ -1,6 +1,7 @@ package cc.ryanc.halo.web.controller.content; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; /** @@ -12,4 +13,9 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping public class IndexController { + + @GetMapping(value = "/sweetalert") + public String sweetalert(){ + return "sweetalert"; + } } diff --git a/src/main/java/cc/ryanc/halo/web/controller/core/CommonController.java b/src/main/java/cc/ryanc/halo/web/controller/core/CommonController.java index f5966e041..3ef665d91 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/core/CommonController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/core/CommonController.java @@ -100,7 +100,7 @@ public class CommonController implements ErrorController { */ @GetMapping(value = "/404") public String contentNotFround() throws FileNotFoundException { - if (ThemeUtils.isTemplateExist(NOT_FROUND_TEMPLATE)) { + if (!ThemeUtils.isTemplateExist(NOT_FROUND_TEMPLATE)) { return "common/error/404"; } StrBuilder path = new StrBuilder("themes/"); @@ -116,8 +116,8 @@ public class CommonController implements ErrorController { */ @GetMapping(value = "/500") public String contentInternalError() throws FileNotFoundException { - if (ThemeUtils.isTemplateExist(INTERNAL_ERROR_TEMPLATE)) { - return "common/error/404"; + if (!ThemeUtils.isTemplateExist(INTERNAL_ERROR_TEMPLATE)) { + return "common/error/500"; } StrBuilder path = new StrBuilder("themes/"); path.append(BaseContentController.THEME); diff --git a/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java b/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java index 034328c95..5975f2673 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java @@ -1,11 +1,13 @@ package cc.ryanc.halo.web.controller.core; import cc.ryanc.halo.model.entity.*; +import cc.ryanc.halo.model.enums.BlogProperties; import cc.ryanc.halo.model.enums.CommentStatus; import cc.ryanc.halo.model.enums.PostStatus; import cc.ryanc.halo.model.support.JsonResult; import cc.ryanc.halo.service.*; import cc.ryanc.halo.utils.MarkdownUtils; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; @@ -152,19 +154,19 @@ public class InstallController { comment.setIsAdmin(false); commentService.create(comment); - final Map options = new HashMap<>(); -// options.put(BlogPropertiesEnum.IS_INSTALL.getProp(), TrueFalseEnum.TRUE.getDesc()); -// options.put(BlogPropertiesEnum.BLOG_LOCALE.getProp(), blogLocale); -// options.put(BlogPropertiesEnum.BLOG_TITLE.getProp(), blogTitle); -// options.put(BlogPropertiesEnum.BLOG_URL.getProp(), blogUrl); -// options.put(BlogPropertiesEnum.THEME.getProp(), "anatole"); -// options.put(BlogPropertiesEnum.BLOG_START.getProp(), DateUtil.format(DateUtil.date(), "yyyy-MM-dd")); -// options.put(BlogPropertiesEnum.SMTP_EMAIL_ENABLE.getProp(), TrueFalseEnum.FALSE.getDesc()); -// options.put(BlogPropertiesEnum.NEW_COMMENT_NOTICE.getProp(), TrueFalseEnum.FALSE.getDesc()); -// options.put(BlogPropertiesEnum.COMMENT_PASS_NOTICE.getProp(), TrueFalseEnum.FALSE.getDesc()); -// options.put(BlogPropertiesEnum.COMMENT_REPLY_NOTICE.getProp(), TrueFalseEnum.FALSE.getDesc()); -// options.put(BlogPropertiesEnum.ATTACH_LOC.getProp(), AttachLocationEnum.SERVER.getDesc()); - optionService.saveOptions(options); + final Map options = new HashMap<>(); +// options.put(BlogProperties.IS_INSTALL, TrueFalseEnum.TRUE.getDesc()); +// options.put(BlogProperties.BLOG_LOCALE, blogLocale); +// options.put(BlogProperties.BLOG_TITLE, blogTitle); +// options.put(BlogProperties.BLOG_URL, blogUrl); +// options.put(BlogProperties.THEME, "anatole"); +// options.put(BlogProperties.BLOG_START, DateUtil.format(DateUtil.date(), "yyyy-MM-dd")); +// options.put(BlogProperties.SMTP_EMAIL_ENABLE, TrueFalseEnum.FALSE.getDesc()); +// options.put(BlogProperties.NEW_COMMENT_NOTICE, TrueFalseEnum.FALSE.getDesc()); +// options.put(BlogProperties.COMMENT_PASS_NOTICE, TrueFalseEnum.FALSE.getDesc()); +// options.put(BlogProperties.COMMENT_REPLY_NOTICE, TrueFalseEnum.FALSE.getDesc()); +// options.put(BlogProperties.ATTACH_LOC, AttachLocationEnum.SERVER.getDesc()); +// optionService.saveOptions(options); //更新日志 // logsService.save(LogsRecord.INSTALL, "安装成功,欢迎使用Halo。", request); diff --git a/src/main/resources/static/halo-admin/js/halo.js b/src/main/resources/static/halo-admin/js/halo.js index cf6adf753..95e0fa24a 100644 --- a/src/main/resources/static/halo-admin/js/halo.js +++ b/src/main/resources/static/halo-admin/js/halo.js @@ -258,3 +258,61 @@ function saveOptions(option) { } }, 'JSON'); } + +// sweetalert 封装 +$.halo.prototype.alertChoose = function (title,text,btnCancel,btnConfirm,ajaxUrl,ajaxType,data) { + swal({ + title: title, + text: text, + icon: "warning", + buttons: [btnCancel, btnConfirm], + dangerMode: true + }).then(function (isOk) { + if (isOk) { + $.ajax({ + type: ajaxType, + url: ajaxUrl, + dataType: 'JSON', + data: data, + async: false, + success: function (data) { + if(data.code===1){ + swal(data.msg, { + icon: "success", + button: button + }); + }else{ + swal(data.msg, { + icon: "error", + button: button + }); + } + } + }) + } + }) +}; + +$.halo.prototype.alertSimple = function (ajaxUrl,ajaxType,data,button) { + $.ajax({ + type: ajaxType, + url: ajaxUrl, + dataType: 'JSON', + data: data, + async: false, + success: function (data) { + if(data.code===1){ + swal(data.msg, { + icon: "success", + button: button + }); + }else{ + swal(data.msg, { + icon: "error", + button: button + }); + } + } + }) +}; + diff --git a/src/main/resources/static/halo-admin/plugins/sweetalert/sweetalert.min.js b/src/main/resources/static/halo-admin/plugins/sweetalert/sweetalert.min.js new file mode 100644 index 000000000..dc8f5e78e --- /dev/null +++ b/src/main/resources/static/halo-admin/plugins/sweetalert/sweetalert.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.swal=e():t.swal=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=8)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o="swal-button";e.CLASS_NAMES={MODAL:"swal-modal",OVERLAY:"swal-overlay",SHOW_MODAL:"swal-overlay--show-modal",MODAL_TITLE:"swal-title",MODAL_TEXT:"swal-text",ICON:"swal-icon",ICON_CUSTOM:"swal-icon--custom",CONTENT:"swal-content",FOOTER:"swal-footer",BUTTON_CONTAINER:"swal-button-container",BUTTON:o,CONFIRM_BUTTON:o+"--confirm",CANCEL_BUTTON:o+"--cancel",DANGER_BUTTON:o+"--danger",BUTTON_LOADING:o+"--loading",BUTTON_LOADER:o+"__loader"},e.default=e.CLASS_NAMES},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNode=function(t){var e="."+t;return document.querySelector(e)},e.stringToNode=function(t){var e=document.createElement("div");return e.innerHTML=t.trim(),e.firstChild},e.insertAfter=function(t,e){var n=e.nextSibling;e.parentNode.insertBefore(t,n)},e.removeNode=function(t){t.parentElement.removeChild(t)},e.throwErr=function(t){throw t=t.replace(/ +(?= )/g,""),"SweetAlert: "+(t=t.trim())},e.isPlainObject=function(t){if("[object Object]"!==Object.prototype.toString.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype},e.ordinalSuffixOf=function(t){var e=t%10,n=t%100;return 1===e&&11!==n?t+"st":2===e&&12!==n?t+"nd":3===e&&13!==n?t+"rd":t+"th"}},function(t,e,n){"use strict";function o(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}Object.defineProperty(e,"__esModule",{value:!0}),o(n(25));var r=n(26);e.overlayMarkup=r.default,o(n(27)),o(n(28)),o(n(29));var i=n(0),a=i.default.MODAL_TITLE,s=i.default.MODAL_TEXT,c=i.default.ICON,l=i.default.FOOTER;e.iconMarkup='\n
',e.titleMarkup='\n
\n',e.textMarkup='\n
',e.footerMarkup='\n
\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1);e.CONFIRM_KEY="confirm",e.CANCEL_KEY="cancel";var r={visible:!0,text:null,value:null,className:"",closeModal:!0},i=Object.assign({},r,{visible:!1,text:"Cancel",value:null}),a=Object.assign({},r,{text:"OK",value:!0});e.defaultButtonList={cancel:i,confirm:a};var s=function(t){switch(t){case e.CONFIRM_KEY:return a;case e.CANCEL_KEY:return i;default:var n=t.charAt(0).toUpperCase()+t.slice(1);return Object.assign({},r,{text:n,value:t})}},c=function(t,e){var n=s(t);return!0===e?Object.assign({},n,{visible:!0}):"string"==typeof e?Object.assign({},n,{visible:!0,text:e}):o.isPlainObject(e)?Object.assign({visible:!0},n,e):Object.assign({},n,{visible:!1})},l=function(t){for(var e={},n=0,o=Object.keys(t);n=0&&w.splice(e,1)}function s(t){var e=document.createElement("style");return t.attrs.type="text/css",l(e,t.attrs),i(t,e),e}function c(t){var e=document.createElement("link");return t.attrs.type="text/css",t.attrs.rel="stylesheet",l(e,t.attrs),i(t,e),e}function l(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function u(t,e){var n,o,r,i;if(e.transform&&t.css){if(!(i=e.transform(t.css)))return function(){};t.css=i}if(e.singleton){var l=h++;n=g||(g=s(e)),o=f.bind(null,n,l,!1),r=f.bind(null,n,l,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=c(e),o=p.bind(null,n,e),r=function(){a(n),n.href&&URL.revokeObjectURL(n.href)}):(n=s(e),o=d.bind(null,n),r=function(){a(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else r()}}function f(t,e,n,o){var r=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=x(e,r);else{var i=document.createTextNode(r),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(i,a[e]):t.appendChild(i)}}function d(t,e){var n=e.css,o=e.media;if(o&&t.setAttribute("media",o),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}function p(t,e,n){var o=n.css,r=n.sourceMap,i=void 0===e.convertToAbsoluteUrls&&r;(e.convertToAbsoluteUrls||i)&&(o=y(o)),r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var a=new Blob([o],{type:"text/css"}),s=t.href;t.href=URL.createObjectURL(a),s&&URL.revokeObjectURL(s)}var m={},b=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),v=function(t){var e={};return function(n){return void 0===e[n]&&(e[n]=t.call(this,n)),e[n]}}(function(t){return document.querySelector(t)}),g=null,h=0,w=[],y=n(15);t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");e=e||{},e.attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||(e.singleton=b()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=r(t,e);return o(n,e),function(t){for(var i=[],a=0;athis.length)&&-1!==this.indexOf(t,e)}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var n=Object(this),o=n.length>>>0;if(0===o)return!1;for(var r=0|e,i=Math.max(r>=0?r:o-Math.abs(r),0);i=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},n(19),e.setImmediate=setImmediate,e.clearImmediate=clearImmediate},function(t,e,n){(function(t,e){!function(t,n){"use strict";function o(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),n=0;n1)for(var n=1;n',e.default=e.modalMarkup},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.OVERLAY,i='
\n
';e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.ICON;e.errorIconMarkup=function(){var t=r+"--error",e=t+"__line";return'\n
\n \n \n
\n '},e.warningIconMarkup=function(){var t=r+"--warning";return'\n \n \n \n '},e.successIconMarkup=function(){var t=r+"--success";return'\n \n \n\n
\n
\n '}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.CONTENT;e.contentMarkup='\n
\n\n
\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.BUTTON_CONTAINER,i=o.default.BUTTON,a=o.default.BUTTON_LOADER;e.buttonMarkup='\n
\n\n \n\n
\n
\n
\n
\n
\n\n
\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(4),r=n(2),i=n(0),a=i.default.ICON,s=i.default.ICON_CUSTOM,c=["error","warning","success","info"],l={error:r.errorIconMarkup(),warning:r.warningIconMarkup(),success:r.successIconMarkup()},u=function(t,e){var n=a+"--"+t;e.classList.add(n);var o=l[t];o&&(e.innerHTML=o)},f=function(t,e){e.classList.add(s);var n=document.createElement("img");n.src=t,e.appendChild(n)},d=function(t){if(t){var e=o.injectElIntoModal(r.iconMarkup);c.includes(t)?u(t,e):f(t,e)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(2),r=n(4),i=function(t){navigator.userAgent.includes("AppleWebKit")&&(t.style.display="none",t.offsetHeight,t.style.display="")};e.initTitle=function(t){if(t){var e=r.injectElIntoModal(o.titleMarkup);e.textContent=t,i(e)}},e.initText=function(t){if(t){var e=document.createDocumentFragment();t.split("\n").forEach(function(t,n,o){e.appendChild(document.createTextNode(t)),n0}).forEach(function(t){b.classList.add(t)})}n&&t===c.CONFIRM_KEY&&b.classList.add(s),b.textContent=r;var g={};return g[t]=i,f.setActionValue(g),f.setActionOptionsFor(t,{closeModal:p}),b.addEventListener("click",function(){return u.onAction(t)}),m},p=function(t,e){var n=r.injectElIntoModal(l.footerMarkup);for(var o in t){var i=t[o],a=d(o,i,e);i.visible&&n.appendChild(a)}0===n.children.length&&n.remove()};e.default=p},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),r=n(4),i=n(2),a=n(5),s=n(6),c=n(0),l=c.default.CONTENT,u=function(t){t.addEventListener("input",function(t){var e=t.target,n=e.value;a.setActionValue(n)}),t.addEventListener("keyup",function(t){if("Enter"===t.key)return s.onAction(o.CONFIRM_KEY)}),setTimeout(function(){t.focus(),a.setActionValue("")},0)},f=function(t,e,n){var o=document.createElement(e),r=l+"__"+e;o.classList.add(r);for(var i in n){var a=n[i];o[i]=a}"input"===e&&u(o),t.appendChild(o)},d=function(t){if(t){var e=r.injectElIntoModal(i.contentMarkup),n=t.element,o=t.attributes;"string"==typeof n?f(e,n,o):e.appendChild(n)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(2),i=function(){var t=o.stringToNode(r.overlayMarkup);document.body.appendChild(t)};e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(5),r=n(6),i=n(1),a=n(3),s=n(0),c=s.default.MODAL,l=s.default.BUTTON,u=s.default.OVERLAY,f=function(t){t.preventDefault(),v()},d=function(t){t.preventDefault(),g()},p=function(t){if(o.default.isOpen)switch(t.key){case"Escape":return r.onAction(a.CANCEL_KEY)}},m=function(t){if(o.default.isOpen)switch(t.key){case"Tab":return f(t)}},b=function(t){if(o.default.isOpen)return"Tab"===t.key&&t.shiftKey?d(t):void 0},v=function(){var t=i.getNode(l);t&&(t.tabIndex=0,t.focus())},g=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l),n=e.length-1,o=e[n];o&&o.focus()},h=function(t){t[t.length-1].addEventListener("keydown",m)},w=function(t){t[0].addEventListener("keydown",b)},y=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l);e.length&&(h(e),w(e))},x=function(t){if(i.getNode(u)===t.target)return r.onAction(a.CANCEL_KEY)},_=function(t){var e=i.getNode(u);e.removeEventListener("click",x),t&&e.addEventListener("click",x)},k=function(t){o.default.timer&&clearTimeout(o.default.timer),t&&(o.default.timer=window.setTimeout(function(){return r.onAction(a.CANCEL_KEY)},t))},O=function(t){t.closeOnEsc?document.addEventListener("keyup",p):document.removeEventListener("keyup",p),t.dangerMode?v():g(),y(),_(t.closeOnClickOutside),k(t.timer)};e.default=O},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(3),i=n(37),a=n(38),s={title:null,text:null,icon:null,buttons:r.defaultButtonList,content:null,className:null,closeOnClickOutside:!0,closeOnEsc:!0,dangerMode:!1,timer:null},c=Object.assign({},s);e.setDefaults=function(t){c=Object.assign({},s,t)};var l=function(t){var e=t&&t.button,n=t&&t.buttons;return void 0!==e&&void 0!==n&&o.throwErr("Cannot set both 'button' and 'buttons' options!"),void 0!==e?{confirm:e}:n},u=function(t){return o.ordinalSuffixOf(t+1)},f=function(t,e){o.throwErr(u(e)+" argument ('"+t+"') is invalid")},d=function(t,e){var n=t+1,r=e[n];o.isPlainObject(r)||void 0===r||o.throwErr("Expected "+u(n)+" argument ('"+r+"') to be a plain object")},p=function(t,e){var n=t+1,r=e[n];void 0!==r&&o.throwErr("Unexpected "+u(n)+" argument ("+r+")")},m=function(t,e,n,r){var i=typeof e,a="string"===i,s=e instanceof Element;if(a){if(0===n)return{text:e};if(1===n)return{text:e,title:r[0]};if(2===n)return d(n,r),{icon:e};f(e,n)}else{if(s&&0===n)return d(n,r),{content:e};if(o.isPlainObject(e))return p(n,r),e;f(e,n)}};e.getOpts=function(){for(var t=[],e=0;e + + + + Title + + + + + + +