@whitesev/pops
Version:
弹窗库
360 lines (346 loc) • 10.9 kB
text/typescript
import type { PopsAlertDetails } from "../components/alert/indexType";
import type { PopsConfirmDetails } from "../components/confirm/indexType";
import type { PopsIframeDetails } from "../components/iframe/indexType";
import { pops } from "../Pops";
import type { PopsIcon } from "../types/icon";
import type {
PopsSupportAnim,
PopsSupportBottomBtn,
PopsSupportContent,
PopsSupportHeaderTitle,
PopsTypeSupportAnim,
PopsTypeSupportBottomBtn,
PopsTypeSupportContent,
PopsTypeSupportHeaderTitle,
} from "../types/main";
import { popsUtils } from "../utils/PopsUtils";
export const PopsElementHandler = {
/**
* 获取遮罩层HTML
* @param guid
* @param zIndex z-index
* @param style
*/
getMaskHTML(guid: string, zIndex: number = 101, style = ""): string {
zIndex = zIndex - 100;
if (style.startsWith(";")) {
style = style.replace(";", "");
}
return `<div class="pops-mask" data-guid="${guid}" style="z-index:${zIndex};${style}"></div>`;
},
/**
* 获取动画层HTML
* @param guid
* @param type
* @param config
* @param html
* @param bottomBtnHTML
* @param zIndex
*/
getAnimHTML(
guid: string,
type: PopsTypeSupportAnim,
config: PopsSupportAnim[keyof PopsSupportAnim],
html = "",
bottomBtnHTML = "",
zIndex: number
) {
let __config = config as PopsAlertDetails;
let popsAnimStyle = "";
let popsStyle = "";
let popsPosition = __config.position || "";
if (config.zIndex != null) {
popsAnimStyle += `z-index: ${zIndex};`;
popsStyle += `z-index: ${zIndex};`;
}
if (__config.width != null) {
popsStyle += `width: ${__config.width};`;
}
if (__config.height != null) {
popsStyle += `height: ${__config.height};`;
}
let hasBottomBtn = bottomBtnHTML.trim() === "" ? false : true;
return /*html*/ `
<div
class="pops-anim"
anim="${__config.animation || ""}"
style="${popsAnimStyle}"
data-guid="${guid}">
${
config.style != null
? `<style tyle="text/css">${config.style}</style>`
: ""
}
<div
class="pops ${config.class || ""}"
data-bottom-btn="${hasBottomBtn}"
type-value="${type}"
style="${popsStyle}"
position="${popsPosition}"
data-guid="${guid}">
${html}
</div>
</div>`;
},
/**
* 获取顶部按钮层HTML
* @param type
* @param config
*/
getHeaderBtnHTML(
type: PopsTypeSupportHeaderTitle,
config: PopsSupportHeaderTitle[keyof PopsSupportHeaderTitle]
): string {
if (!config.btn) {
return "";
}
let __config_confirm = config as PopsConfirmDetails;
if (type !== "iframe" && !__config_confirm.btn?.close?.enable) {
return "";
}
let resultHTML = "";
// let btnStyle = "";
let closeHTML = "";
let __config_iframe = config as PopsIframeDetails;
if (type === "iframe" && __config_iframe.topRightButton?.trim() !== "") {
/* iframe的 */
let topRightButtonHTML = "";
__config_iframe.topRightButton.split("|").forEach((item: string) => {
item = item.toLowerCase();
topRightButtonHTML += `
<button class="pops-header-control" type="${item}">
<i class="pops-icon">${
(pops.config.iconSVG as any)[item]
}</i>
</button>`;
});
resultHTML = `
<div class="pops-header-controls" data-margin>
${topRightButtonHTML}
</div>`;
} else {
if (__config_confirm.btn?.close?.enable) {
closeHTML = `
<div class="pops-header-controls">
<button class="pops-header-control" type="close" data-header>
<i class="pops-icon">${pops.config.iconSVG["close"]}</i>
</button>
</div>`;
}
resultHTML = closeHTML;
}
return resultHTML;
},
/**
* 获取底部按钮层HTML
* @param type
* @param config
*/
getBottomBtnHTML(
type: PopsTypeSupportBottomBtn,
config: Omit<PopsSupportBottomBtn[keyof PopsSupportBottomBtn], "content">
): string {
if (!config.btn) {
// 未设置btn参数
return "";
}
let __config_confirm = config as Required<PopsConfirmDetails>;
if (
!(
config.btn?.ok?.enable ||
__config_confirm.btn?.cancel?.enable ||
__config_confirm.btn?.other?.enable
)
) {
// 确定、取消、其它按钮都未启用直接返回
return "";
}
let btnStyle = "";
let resultHTML = "";
let okHTML = "";
let cancelHTML = "";
let ohterHTML = "";
if (config.btn.position) {
btnStyle += `justify-content: ${config.btn.position};`;
}
if (__config_confirm.btn.reverse) {
btnStyle += "flex-direction: row-reverse;";
}
if (config.btn?.ok?.enable) {
/* 处理确定按钮的尺寸问题 */
let okButtonSizeClassName = "";
if (config.btn.ok.size === "large") {
okButtonSizeClassName = "pops-button-" + config.btn.ok.size;
} else if (config.btn.ok.size === "small") {
okButtonSizeClassName = "pops-button-" + config.btn.ok.size;
}
let okIconHTML = "";
let okIcon = __config_confirm.btn.ok!.icon! as PopsIcon | string;
if (okIcon !== "") {
// 判断图标是否是svg库内的
let iconHTML = "";
if (okIcon in pops.config.iconSVG) {
iconHTML = pops.config.iconSVG[okIcon as PopsIcon];
} else {
iconHTML = okIcon;
}
iconHTML = iconHTML || "";
okIconHTML = `
<i class="pops-bottom-icon" is-loading="${config.btn.ok.iconIsLoading}">
${iconHTML}
</i>`;
}
okHTML = `
<button
class="pops-${type}-btn-ok ${okButtonSizeClassName}"
type="${__config_confirm.btn.ok?.type}"
data-has-icon="${(__config_confirm.btn.ok!.icon || "") !== ""}"
data-rightIcon="${__config_confirm.btn.ok?.rightIcon}"
>
${okIconHTML}
<span>${config.btn.ok.text}</span>
</button>`;
}
if (__config_confirm.btn?.cancel?.enable) {
/* 处理取消按钮的尺寸问题 */
let cancelButtonSizeClassName = "";
if (__config_confirm.btn.cancel.size === "large") {
cancelButtonSizeClassName =
"pops-button-" + __config_confirm.btn.cancel.size;
} else if (__config_confirm.btn.cancel.size === "small") {
cancelButtonSizeClassName =
"pops-button-" + __config_confirm.btn.cancel.size;
}
let cancelIconHTML = "";
let cancelIcon = __config_confirm.btn.cancel!.icon as PopsIcon | string;
if (cancelIcon !== "") {
let iconHTML = "";
// 判断图标是否是svg库内的
if (cancelIcon in pops.config.iconSVG) {
iconHTML = pops.config.iconSVG[cancelIcon as PopsIcon];
} else {
iconHTML = cancelIcon;
}
iconHTML = iconHTML || "";
cancelIconHTML = `
<i class="pops-bottom-icon" is-loading="${__config_confirm.btn.cancel.iconIsLoading}">
${iconHTML}
</i>`;
}
cancelHTML = `
<button
class="pops-${type}-btn-cancel ${cancelButtonSizeClassName}"
type="${__config_confirm.btn.cancel.type}"
data-has-icon="${(__config_confirm.btn.cancel.icon || "") !== ""}"
data-rightIcon="${__config_confirm.btn.cancel.rightIcon}"
>
${cancelIconHTML}
<span>${__config_confirm.btn.cancel.text}</span>
</button>`;
}
if (__config_confirm.btn?.other?.enable) {
/* 处理其它按钮的尺寸问题 */
let otherButtonSizeClassName = "";
if (__config_confirm.btn.other.size === "large") {
otherButtonSizeClassName =
"pops-button-" + __config_confirm.btn.other.size;
} else if (__config_confirm.btn.other.size === "small") {
otherButtonSizeClassName =
"pops-button-" + __config_confirm.btn.other.size;
}
let otherIconHTML = "";
let otherIcon = __config_confirm.btn.other!.icon as PopsIcon | string;
if (otherIcon !== "") {
let iconHTML = "";
// 判断图标是否是svg库内的
if (otherIcon in pops.config.iconSVG) {
iconHTML = pops.config.iconSVG[otherIcon as PopsIcon];
} else {
otherIcon;
}
iconHTML = iconHTML || "";
otherIconHTML = `
<i class="pops-bottom-icon" is-loading="${__config_confirm.btn.other.iconIsLoading}">
${iconHTML}
</i>`;
}
ohterHTML = `
<button
class="pops-${type}-btn-other ${otherButtonSizeClassName}"
type="${__config_confirm.btn.other.type}"
data-has-icon="${(__config_confirm.btn.other.icon || "") !== ""}"
data-rightIcon="${__config_confirm.btn.other.rightIcon}"
>
${otherIconHTML}
<span>${__config_confirm.btn.other.text}</span>
</button>`;
}
if (__config_confirm.btn.merge) {
let flexStyle = "display: flex;";
if (__config_confirm.btn.mergeReverse) {
flexStyle += "flex-direction: row-reverse;";
} else {
flexStyle += "flex-direction: row;";
}
resultHTML = `
<div class="pops-${type}-btn" style="${btnStyle}">
${ohterHTML}
<div
class="pops-${type}-btn-merge"
style="${flexStyle}">
${okHTML}
${cancelHTML}
</div>
</div>
`;
} else {
resultHTML = `
<div class="pops-${type}-btn" style="${btnStyle}">
${okHTML}
${cancelHTML}
${ohterHTML}
</div>
`;
}
return resultHTML;
},
/**
* 获取标题style
* @param type
* @param config
*/
getHeaderStyle(
type: PopsTypeSupportHeaderTitle,
config: PopsSupportHeaderTitle[keyof PopsSupportHeaderTitle]
) {
return {
headerStyle: config?.title?.html ? config?.title?.style || "" : "",
headerPStyle: config?.title?.html ? "" : config?.title?.style || "",
};
},
/**
* 获取内容style
* @param type
* @param config
*/
getContentStyle(
type: PopsTypeSupportContent,
config: PopsSupportContent[keyof PopsSupportContent]
) {
return {
contentStyle: (config?.content as any)?.html
? config?.content?.style || ""
: "",
contentPStyle: (config?.content as any)?.html
? ""
: config?.content?.style || "",
};
},
/**
* 将html转换成元素
* @param html
*/
parseElement<T extends HTMLElement>(html: string): T {
return popsUtils.parseTextToDOM(html);
},
};