layui/.svn/pristine/dd/dd5ec22e1f9ecc4f555d4376161033407c937389.svn-base
2022-12-09 16:41:41 +08:00

417 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { title } from "process";
import { layer } from "../index";
// 随机数
export function nextId() {
var s: any = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4";
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
}
export function calculateMinArea(minArea: any) {
if (!minArea) {
return ["120px", "100px"];
}
if (typeof minArea == "string") {
return [minArea];
}
return [minArea];
}
export function calculateArea(type: any, area: any, offset: any) {
return type != "drawer"
? calculateBaseArea(area)
: calculateDrawerArea(offset, area);
}
// 计算宽高
// @param area
// @param type
// @return 正确宽高
export function calculateBaseArea(area: any) {
if (area === "auto") {
return [];
}
// @ts-ignore
if (typeof area == "string") {
return [area];
}
return [...area];
}
// 抽屉宽/高
export function calculateDrawerArea(
offset: any,
drawerArea: string[] | string = "30%"
) {
if (drawerArea instanceof Array) {
return drawerArea;
}
if (drawerArea === "auto") {
drawerArea = "30%";
}
if (offset === "l" || offset === "r") {
return [drawerArea, "100%"];
} else if (offset === "t" || offset === "b") {
return ["100%", drawerArea];
}
return [drawerArea, "100%"];
}
// 计算偏移
// @param offset
// @param domSize
// @return 正确位置
export function calculateOffset(offset: any, area: any, type: any) {
var arr = ["t", "r", "b", "l", "lt", "lb", "rt", "rb"];
var t = offset[0];
var l = offset[1];
if (offset instanceof Array && type === "drawer") {
offset = "r";
}
// @ts-ignore
if (arr.indexOf(offset) > -1) {
t = "50%";
l = "50%";
}
// 预备处理
if (arr.indexOf(offset) != -1 || t.indexOf("%") > -1)
t = "calc(" + t + " - (" + (area === "auto" ? "100px" : area[1]) + "/2 ))";
if (arr.indexOf(offset) != -1 || l.indexOf("%") > -1)
l = "calc(" + l + " - (" + (area === "auto" ? "100px" : area[0]) + "/2 ))";
// 关键字处理
if (offset === "t") t = "0px";
else if (offset === "r") l = "calc(100% - " + area[0] + ")";
else if (offset === "b") t = "calc(100% - " + area[1] + ")";
else if (offset === "l") l = "0px";
else if (offset === "lt") {
t = "0px";
l = "0px";
} else if (offset === "lb") {
t = "calc(100% - " + area[1] + ")";
l = "0px";
} else if (offset === "rt") {
t = "0px";
l = "calc(100% - " + area[0] + ")";
} else if (offset === "rb") {
t = "calc(100% - " + area[1] + ")";
l = "calc(100% - " + area[0] + ")";
}
// 返回位置
return [t, l];
}
// 窗体类型
export function calculateType(modalType: number | string) {
if (modalType === "dialog" || modalType == 0) {
return 0;
} else if (modalType === "page" || modalType == 1) {
return 1;
} else if (modalType === "iframe" || modalType == 2) {
return 2;
} else if (modalType === "loading" || modalType == 3) {
return 3;
} else if (modalType === "drawer" || modalType == 4) {
return 4;
} else if (modalType === "photos" || modalType == 5) {
return 5;
} else if (modalType === "notifiy" || modalType == 6) {
return 6;
}
return 0;
}
// 计算高度
// @param height 高度
// @param btn 操作集合
export function calculateContent(
title: any,
height: any,
btn: any,
type: any,
isMessage?: boolean
) {
if (height && height.indexOf("%") != -1) {
height = "100%";
}
if (btn && btn.length > 0) {
if (type == 0) {
if (title) {
return "calc(" + height + " - 137px)";
} else {
return "calc(" + height + " - 86px)";
}
}
if (type == 1 || type == 4) {
if (title) {
return "calc(" + height + " - 102px)";
} else {
return "calc(" + height + " - 51px)";
}
}
if (type == 2) {
if (title) {
return "calc(" + height + " - 102px)";
} else {
return "calc(" + height + " - 51px)";
}
}
} else {
if (type == 0) {
if (title) {
return isMessage ? "" : "calc(" + height + " - 137px)";
} else {
return isMessage ? "" : "calc(" + height + " - 86px)";
}
}
if (type == 1 || type == 4) {
if (title) {
return "calc(" + height + " - 51px)";
} else {
return "calc(" + height + " - 0px)";
}
}
if (type == 2) {
if (title) {
return "calc(" + height + " - 51px)";
} else {
return "calc(" + height + " - 0px)";
}
}
}
}
// 尺寸常量
export function maxArea() {
return { w: "100%", h: "100%" };
}
// 初始位置
export function maxOffset() {
return { t: "0px", l: "0px" };
}
// 最小化尺寸
export function minArea() {
return { w: "180px", h: "51px" };
}
// 最小化位置
export function minOffset(left: any) {
return { t: "calc(100% - 51px)", l: left + "px" };
}
// 元素位置
// @param x 横坐标
// @param y 纵坐标
export function getPosition(dom: any) {
return { x: dom?.style.left, y: dom?.style.top };
}
// 元素宽高
export function getArea(dom: any) {
// @ts-ignore
let width = getComputedStyle(dom, null).width;
// @ts-ignore
let height = getComputedStyle(dom, null).height;
return [width, height];
}
// 最小化的队列
let minArrays: Array<String> = [];
// 更新最小化队列
export function updateMinArrays(id: string, state: Boolean) {
var i = 0;
if (state) {
const index = minArrays.findIndex((v) => v === undefined);
if (index === -1) {
minArrays.push(id);
i = minArrays.length - 1;
} else {
minArrays[index] = id;
i = index;
}
} else {
delete minArrays[minArrays.findIndex((v) => v == id)];
i = -1;
}
return i;
}
// 抽屉动画类
export function getDrawerAnimationClass(offset: any, isClose: boolean = false) {
const prefix = "layer-drawer-anim layer-anim";
let suffix = "rl";
if (offset === "l") {
suffix = "lr";
} else if (offset === "r") {
suffix = "rl";
} else if (offset === "t") {
suffix = "tb";
} else if (offset === "b") {
suffix = "bt";
}
return isClose ? `${prefix}-${suffix}-close` : `${prefix}-${suffix}`;
}
//计算图片大小 并缩放
export async function calculatePhotosArea(
url: string,
options: object
): Promise<Array<string>> {
let img = new Image();
img.src = url;
return new Promise((resolve, reject) => {
if (img.complete) {
resolve(area(img));
return;
}
const layerId = layer.load(2);
img.onload = () => {
layer.close(layerId);
resolve(area(img));
};
img.onerror = () => {
layer.close(layerId);
layer.msg("图片加载失败");
reject(false);
};
});
function area(img: { width: number; height: number }) {
var imgarea = [img.width, img.height];
var winarea = [window.innerWidth - 250, window.innerHeight - 250];
//如果 实际图片的宽或者高比 屏幕大(那么进行缩放)
if (imgarea[0] > winarea[0] || imgarea[1] > winarea[1]) {
let wh = [imgarea[0] / winarea[0], imgarea[1] / winarea[1]]; //取宽度缩放比例、高度缩放比例
if (wh[0] > wh[1]) {
//取缩放比例最大的进行缩放
imgarea[0] = imgarea[0] / wh[0];
imgarea[1] = imgarea[1] / wh[0];
} else if (wh[0] < wh[1]) {
imgarea[0] = imgarea[0] / wh[1];
imgarea[1] = imgarea[1] / wh[1];
}
}
return [imgarea[0] + "px", imgarea[1] + "px"];
}
}
// 计算Notify位置 队列 此处先暂时定义Notify的间距为15px
export function calculateNotifOffset(offset: any, area: any, layerId: string) {
let arr = ["lt", "lb", "rt", "rb"];
let t = "0",
l = "0";
// 间隙
let transOffsetLeft = 15;
let transOffsetTop = 15;
(window as any).NotifiyQueen = (window as any).NotifiyQueen || [];
let notifiyQueen = (window as any).NotifiyQueen;
if (typeof offset != "string" || arr.indexOf(offset) === -1) {
offset = "rt";
}
// 当前区域元素集合
let nodeList = notifiyQueen.filter((e: { offset: any }) => {
if (e.offset === offset) {
return e;
}
});
//前一个元素
let prevNode = nodeList.length > 0 ? nodeList[nodeList.length - 1] : null;
if (prevNode) {
prevNode = document.getElementById(prevNode["id"])?.firstElementChild
?.firstElementChild;
if (offset === "rt" || offset === "lt") {
transOffsetTop +=
prevNode.offsetHeight + parseFloat(prevNode.style["top"]);
} else {
let bottom = parseFloat(prevNode.style["top"].split(" - ")[1]);
transOffsetTop += prevNode.offsetHeight + bottom;
}
} else {
if (offset === "rb" || offset === "lb") {
transOffsetTop += parseFloat(area[1]);
}
}
// 关键字处理
if (offset === "rt") {
t = transOffsetTop + "px";
l = "calc(100% - " + (parseFloat(area[0]) + transOffsetLeft) + "px)";
} else if (offset === "rb") {
t = "calc(100vh - " + transOffsetTop + "px)";
l = "calc(100% - " + (parseFloat(area[0]) + transOffsetLeft) + "px)";
} else if (offset === "lt") {
t = transOffsetTop + "px";
l = transOffsetLeft + "px";
} else if (offset === "lb") {
t = "calc(100vh - " + transOffsetTop + "px)";
l = transOffsetLeft + "px";
}
notifiyQueen.push({
id: layerId,
offset: offset,
});
// 返回位置
return [t, l];
}
//移除Notify队列中某项并且重新计算其他Notify位置
export function removeNotifiyFromQueen(layerId: string) {
// 间隙
let transOffsetTop = 15;
// 删除项的高度
let notifiyDom = document.getElementById(layerId)?.firstElementChild
?.firstElementChild as HTMLElement;
let offsetHeight = notifiyDom.offsetHeight;
(window as any).NotifiyQueen = (window as any).NotifiyQueen || [];
let notifiyQueen = (window as any).NotifiyQueen;
let index = notifiyQueen.findIndex((e: { id: string }) => e.id === layerId);
let offsetType = notifiyQueen[index].offset;
let list = notifiyQueen.filter((e: { offset: any }) => {
if (e.offset === offsetType) {
return e;
}
});
let findIndex = list.findIndex((e: { id: string }) => e.id === layerId);
// //得到需要修改的定位的Notifiy集合
let needCalculatelist = list.slice(findIndex + 1);
needCalculatelist.forEach((e: { id: string }) => {
let dom = document.getElementById(e.id)?.firstElementChild
?.firstElementChild as HTMLElement;
if (offsetType === "rt" || offsetType === "lt") {
dom.style["top"] =
parseFloat(dom.style["top"]) - transOffsetTop - offsetHeight + "px";
} else {
let bottom =
parseFloat(dom.style["top"].split(" - ")[1]) -
transOffsetTop -
offsetHeight;
dom.style["top"] = "calc(100vh - " + bottom + "px)";
}
});
notifiyQueen.splice(index, 1); //删除
}
// Notify动画类
export function getNotifyAnimationClass(offset: any) {
const prefix = "layer-drawer-anim layer-anim";
let suffix = "";
if (offset === "lt" || offset === "lb") {
suffix = "lr";
} else {
suffix = "rl";
}
return `${prefix}-${suffix}`;
}