//@ts-nocheck /* https://www.layuiweb.com/doc/modules/layer.html#closeBtn */ import $ from "jquery"; import { xU } from "../../ventoseUtils"; import { i_layerOptions } from "./i_layerOptions"; export const KEY = { right: 39, left: 37, esc: 27 }; /* * * * layerTipsId * * */ const $win = $(window); const $html = $("html"); const $document = $(document); /* 缓存常用字符 */ export const DATA_TIPS_FOLLOW_ID = "data-tips-follow-id"; export const DATA_V_UI_MOVE = "data-directive-ui-move"; const TYPE_DIALOG = "dialog"; const TYPE_PAGE = "page"; const TYPE_IFRAME = "iframe"; const TYPE_LOADING = "loading"; const TYPE_TIPS = "tips"; /* */ const LAYUI_LAYER = "layui-layer"; const LAYUI_LAYER_SHADE = "layui-layer-shade"; const LAYUI_LAYER_MOVE = "layui-layer-move"; const LAYUI_LAYER_CONTENT = "layui-layer-content"; const LAYUI_LAYER_CLOSE = "layui-layer-close"; const LAYUI_LAYER_IFRAME = "layui-layer-iframe"; const LAYUI_LAYER_TITLE = "layui-layer-title"; const DOMS_ANIM = [ "layer-anim-00", "layer-anim-01", "layer-anim-02", "layer-anim-03", "layer-anim-04", "layer-anim-05", "layer-anim-06" ]; export const $MoveMask: JQuery = $( `
` ); setTimeout(() => { $html.append($MoveMask); }, 0); export const READY: { zIndex: number; /* layerInstanceForMoveOrResize */ moveOrResizeInstance: any; moveOrResizeWH: any[]; moveOrResizeType: "resize" | "move"; pointMousedown: number[]; basePath: string; } = { zIndex: 0, /* 默认zIndex从2开始 */ pointMousedown: [], /* */ basePath: (function () { var jsPath = document.currentScript ? document.currentScript.src : (function () { var js = document.scripts, last = js.length - 1, src; for (var i = last; i > 0; i--) { if (js[i].readyState === "interactive") { src = js[i].src; break; } } return src || js[last].src; })(); const GLOBAL = {}; return GLOBAL.layer_dir || jsPath.substring(0, jsPath.lastIndexOf("/") + 1); })(), config: {}, end: {}, minIndex: 0, minLeft: [], btn: ["确定", "取消"], /* 五种原始层模式 */ type: ["dialog", "page", "iframe", "loading", "tips"], /* 获取节点的style属性值 */ getStyle: function (node, name) { var style = node.currentStyle ? node.currentStyle : window.getComputedStyle(node, null); return style[style.getPropertyValue ? "getPropertyValue" : "getAttribute"]( name ); }, /* for ie6 恢复select */ reselect() { $.each($("select"), function (index, value) { var sthis = $(this); if (!sthis.parents("." + LAYUI_LAYER)[0]) { sthis.attr("layer") == 1 && $("." + LAYUI_LAYER).length < 1 && sthis.removeAttr("layer").show(); } sthis = null; }); }, /* 记录宽高坐标,用于还原 */ record($eleLayer) { const [windowHeight, windowWidth] = [$win.height(), $win.width()]; const isLimit = $eleLayer.height() > windowHeight; const isLimitWidth = $eleLayer.width() > windowWidth; var area = [ isLimitWidth ? windowWidth - 64 : $eleLayer.width(), isLimit ? windowHeight - 64 : $eleLayer.height(), isLimit ? 32 : $eleLayer.position().top, $eleLayer.position().left + parseFloat($eleLayer.css("margin-left")) ]; $eleLayer.find(".layui-layer-max").addClass("layui-layer-maxmin"); $eleLayer.attr({ area: area }); }, rescollbar(index) { if ($html.attr("layer-full") == index) { if ($html[0].style.removeProperty) { $html[0].style.removeProperty("overflow"); } else { $html[0].style.removeAttribute("overflow"); } $html.removeAttr("layer-full"); } } }; /* 默认内置方法。 */ const LayerUtils = { setZIndex(zIndex: number) { READY.page; READY.zIndex = zIndex; }, /* */ MSG: 0, DIALOG: 1, IFRAME: 2, LOADING: 3, TIPS: 4, UP: 1, RIGHT: 2, BOTTOM: 3, LEFT: 4, v: "3.5.1", ie: ((): number => { /* ie版本 */ var agent = navigator.userAgent.toLowerCase(); if ("ActiveXObject" in window) { let version = agent.match(/msie\s(\d+)/); if (version) { return Number(version[1]); } else { return 11; } } return 0; })(), path: READY.basePath, config: function (options: i_layerOptions, fn) { options = options || {}; LayerUtils.cache = READY.config = $.extend({}, READY.config, options); LayerUtils.path = READY.config.path || LayerUtils.path; typeof options.extend === "string" && (options.extend = [options.extend]); if (!options.extend) { return this; } return this; }, open(options: i_layerOptions) { const layerInstance = new ClassLayer(options); const { _layerKey } = layerInstance; return _layerKey; }, /* 各种快捷引用 */ alert(content, options, yes) { var type = typeof options === "function"; if (type) yes = options; return LayerUtils.open( $.extend( { content: content, yes: yes }, type ? {} : options ) ); }, confirm(content, options, yes, cancel) { if (xU.isFunction(options)) { cancel = yes; yes = options; } return LayerUtils.open( $.extend( { content: content, btn: READY.btn, yes: yes, btn2: cancel }, type ? {} : options ) ); }, msg(content, options: i_layerOptions, end = () => null) { /*最常用提示层*/ var isOptionsIsFunction = xU.isFunction(options), rskin = READY.config.skin; var skin = (rskin ? rskin + " " + rskin + "-msg" : "") || "layui-layer-msg"; var anim = DOMS_ANIM.length - 1; if (isOptionsIsFunction) end = options; return LayerUtils.open( $.extend( { content: content, time: 3000, shade: false, skin: skin, title: false, closeBtn: false, btn: false, resize: false, end: end }, isOptionsIsFunction && !READY.config.skin ? { skin: skin + " layui-layer-hui", anim: anim } : (function () { options = options || {}; if ( options.icon === -1 || (options.icon === undefined && !READY.config.skin) ) { options.skin = skin + " " + (options.skin || "layui-layer-hui"); } return options; })() ) ); }, load(icon, options) { return LayerUtils.open( $.extend( { type: 3, icon: icon || 0, resize: false, shade: 0.01 }, options ) ); }, tips(content, followSelector, options) { return LayerUtils.open( $.extend( { type: LayerUtils.TIPS, content: [content, followSelector], closeBtn: false, time: 3000, shade: false, resize: false, fixed: false, maxWidth: 260 }, options ) ); }, close(layerKey: string) { if (!layerKey) { return Promise.reject(); } return new Promise((resolve, reject) => { try { /* 关闭layer核心方法 */ var $eleLayer = $(`#${LAYUI_LAYER}${layerKey}`); var type = $eleLayer.attr("type"); var closeAnim = "layer-anim-close"; if ($eleLayer.length === 0) { return; } function removeLayerDomFromHtml() { if ( type === "dialog" && $eleLayer.attr("data-content-type") === "object" ) { $eleLayer.children(`:not(.${LAYUI_LAYER_IFRAME})`).remove(); } else { /* 低版本IE 回收 iframe */ if (type === TYPE_IFRAME) { try { var iframe = $(`#${LAYUI_LAYER_CONTENT}${layerKey}`)[0]; iframe.contentWindow.document.write(""); iframe.contentWindow.close(); $eleLayer.find(`.${LAYUI_LAYER_IFRAME}`)[0].removeChild(iframe); } catch (e) {} } } $eleLayer[0].innerHTML = ""; $eleLayer.remove(); try { READY.end[layerKey] && READY.end[layerKey](); delete READY.end[layerKey]; } catch (e) { /* end就是beforeUnmount 的回调函数,如果有,就执行 */ } } if ($eleLayer.data("isOutAnim")) { $eleLayer.addClass("layer-anim " + closeAnim); } $(`#layui-layer-moves, #${LAYUI_LAYER_SHADE}${layerKey}`).remove(); LayerUtils.ie == 6 && READY.reselect(); READY.rescollbar(layerKey); if ($eleLayer.attr("minLeft")) { READY.minIndex--; READY.minLeft.push($eleLayer.attr("minLeft")); } setTimeout(function () { removeLayerDomFromHtml(); resolve(true); }, 200); } catch (error) { console.error(error); reject(false); } }); }, getChildFrame(selector, index) { /* 获取子iframe的DOM */ index = index || $(`.${LAYUI_LAYER_CONTENT}`).attr("data-layer-key"); return $("#" + LAYUI_LAYER + index) .find("iframe") .contents() .find(selector); }, getFrameIndex(name) { /* 得到当前iframe层的索引,子iframe时使用 */ return $("#" + name) .parents(`.${LAYUI_LAYER_CONTENT}`) .attr("data-layer-key"); }, iframeAuto(index) { /* iframe层自适应宽高 */ if (!index) return; var heg = LayerUtils.getChildFrame("html", index).outerHeight(); var $eleLayer = $("#" + LAYUI_LAYER + index); var titHeight = $eleLayer.find(`.${LAYUI_LAYER_TITLE}`).outerHeight() || 0; var btnHeight = $eleLayer.find(`.${LAYUI_LAYER_CONTENT}`).outerHeight() || 0; $eleLayer.css({ height: heg + titHeight + btnHeight }); $eleLayer.find("iframe").css({ height: heg }); }, iframeSrc(index, url) { /* 重置iframe url */ $("#" + LAYUI_LAYER + index) .find("iframe") .attr("src", url); }, style(index, options, limit) { /* 设定层的样式 */ var $eleLayer = $("#" + LAYUI_LAYER + index); const $contentEle = $eleLayer.find(`.${LAYUI_LAYER_CONTENT}`); const type = $eleLayer.attr("type"); const titHeight = $eleLayer.find(`.${LAYUI_LAYER_TITLE}`).outerHeight() || 0; let contentHeight = $eleLayer.find(`.${LAYUI_LAYER_CONTENT}`).outerHeight() || 0; const [windowHeight, windowWidth] = [$win.height(), $win.width()]; var minLeft = $eleLayer.attr("minLeft"); if (type === TYPE_LOADING || type === TYPE_TIPS) { return; } if (!limit) { if (parseFloat(options.width) <= 260) { options.width = 260; } if (parseFloat(options.height) - titHeight - contentHeight <= 64) { options.height = 64 + titHeight + contentHeight; } } if (options.height > windowHeight) { options.height = parseFloat(windowHeight); } $eleLayer.css(options); contentHeight = $contentEle.outerHeight(); if (type === TYPE_IFRAME) { $eleLayer.find("iframe").addClass("flex1"); } else { $contentEle.css({ height: parseFloat(options.height) - titHeight - contentHeight - parseFloat($contentEle.css("padding-top")) - parseFloat($contentEle.css("padding-bottom")) }); } }, min(index, options) { /* 最小化 */ options = options || {}; var $eleLayer = $("#" + LAYUI_LAYER + index), shadeo = $("#" + LAYUI_LAYER_SHADE + index), titHeight = $eleLayer.find(`.${LAYUI_LAYER_TITLE}`).outerHeight() || 0, left = $eleLayer.attr("minLeft") || 181 * READY.minIndex + "px", position = $eleLayer.css("position"), settings = { width: 180, height: titHeight, position: "fixed", overflow: "hidden" }; /* 记录宽高坐标,用于还原 */ READY.record($eleLayer); if (READY.minLeft[0]) { left = READY.minLeft[0]; READY.minLeft.shift(); } /* 是否堆叠在左下角 */ if (options.minStack) { settings.left = left; settings.top = $win.height() - titHeight; /* 初次执行,最小化操作索引自增 */ $eleLayer.attr("minLeft") || READY.minIndex++; $eleLayer.attr("minLeft", left); } $eleLayer.attr("position", position); LayerUtils.style(index, settings, true); $eleLayer.find(".layui-layer-min").hide(); $eleLayer.attr("type") === "page" && $eleLayer.find(LAYUI_LAYER_CONTENT).hide(); READY.rescollbar(index); /* 隐藏遮罩 */ shadeo.hide(); }, restore(index) { /* 还原 */ var $eleLayer = $("#" + LAYUI_LAYER + index), shadeo = $("#" + LAYUI_LAYER_SHADE + index), area = $eleLayer.attr("area").split(","), type = $eleLayer.attr("type"); /* 恢复原来尺寸 */ LayerUtils.style( index, { width: parseFloat(area[0]), height: parseFloat(area[1]), top: parseFloat(area[2]), left: parseFloat(area[3]), position: $eleLayer.attr("position"), overflow: "visible" }, true ); $eleLayer.find(".layui-layer-max").removeClass("layui-layer-maxmin"); $eleLayer.find(".layui-layer-min").show(); $eleLayer.attr("type") === "page" && $eleLayer.find(LAYUI_LAYER_CONTENT).show(); READY.rescollbar(index); /* 恢复遮罩 */ shadeo.show(); }, full(index) { /* 全屏 */ var $eleLayer = $("#" + LAYUI_LAYER + index), timer; READY.record($eleLayer); if (!$html.attr("layer-full")) { $html.css("overflow", "hidden").attr("layer-full", index); } clearTimeout(timer); timer = setTimeout(function () { var isfix = $eleLayer.css("position") === "fixed"; LayerUtils.style( index, { top: isfix ? 0 : $win.scrollTop(), left: isfix ? 0 : $win.scrollLeft(), width: $win.width(), height: $win.height() }, true ); $eleLayer.find(".layui-layer-min").hide(); }, 100); }, title(name, layerKey) { /* 改变title */ $(`#${LAYUI_LAYER}${layerKey}`).find(`.${LAYUI_LAYER_TITLE}`).html(name); }, async closeAll(type: string) { /* 关闭所有层 */ const needClose: any = []; $(`.${LAYUI_LAYER}`).each(function () { const $ele = $(this); if (type) { if ($ele.attr("type") === type) { needClose.push($ele.attr("data-layer-key")); } } else { needClose.push($ele.attr("data-layer-key")); } }); return await Promise.all(needClose.map(LayerUtils.close)); }, setLayerTop($current: JQuery) { const type = $current.attr("type"); if ($current.hasClass("set-layer-top")) { return; } else { const selector = `.set-layer-top[type=${type}]`; /* FIX: 防止不同类型的层重排 */ $(selector).removeClass("set-layer-top"); $current.addClass("set-layer-top").appendTo($html); } } }; class ClassLayer { /* 在 constructor 和 init方法里面完成 init */ _layerKey = 0; _IDLayer = LAYUI_LAYER; _IDShade = LAYUI_LAYER_SHADE; _IDContent = LAYUI_LAYER_CONTENT; zIndex = 0; typeName = ""; ismax = false; isNeedTitle = false; isContentTypeObject = false; $eleLayer: any = null; $eleShade: any = null; config: i_layerOptions = { type: 0, title: "信息", content: "", skin: "", area: "auto", offset: "auto", icon: -1, btn: "确认", btnAlign: "r", closeBtn: "1", shade: "0.3", shadeClose: false, during: 0, id: "", anim: 0, isOutAnim: true, maxmin: false, fixed: true, resize: true, onResizing: false, scrollbar: true, maxWidth: 360, maxHeight: 0, zIndex: 1, move: ".layui-layer-title", moveOut: false, onMoveEnd: false, tips: 2, tipsMore: false, success: false, yes: false, onClickClose: false, end: false, full: false, minStack: true }; constructor(custumSettings: i_layerOptions) { this.initConfig(custumSettings) .insertLayer() .addLayerListener() .handleAnimation(); } get cptDomShade() { const { config, _IDShade } = this; if (!config.shade) { return ""; } return ``; } get cptDomTitle() { const { config, _IDLayer } = this; if (this.isContentTypeObject && !this.isNeedTitle) { return ""; } var isTitleObject = typeof config.title === "object"; if (!isTitleObject) { config.title = [String(config.title), ""]; } const [title, styleString]: any = config.title || ["", ""]; return `