a2bei4-utils 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a2bei4.utils.cjs.js +168 -1
- package/dist/a2bei4.utils.cjs.js.map +1 -1
- package/dist/a2bei4.utils.cjs.min.js +1 -1
- package/dist/a2bei4.utils.cjs.min.js.map +1 -1
- package/dist/a2bei4.utils.esm.js +167 -2
- package/dist/a2bei4.utils.esm.js.map +1 -1
- package/dist/a2bei4.utils.esm.min.js +1 -1
- package/dist/a2bei4.utils.esm.min.js.map +1 -1
- package/dist/a2bei4.utils.umd.js +168 -1
- package/dist/a2bei4.utils.umd.js.map +1 -1
- package/dist/a2bei4.utils.umd.min.js +1 -1
- package/dist/a2bei4.utils.umd.min.js.map +1 -1
- package/dist/browser.cjs +106 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +106 -2
- package/dist/browser.js.map +1 -1
- package/dist/download.cjs +3 -0
- package/dist/download.cjs.map +1 -1
- package/dist/download.js +3 -0
- package/dist/download.js.map +1 -1
- package/dist/tree.cjs +59 -0
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +59 -1
- package/dist/tree.js.map +1 -1
- package/package.json +1 -1
- package/types/browser.d.ts +10 -1
- package/types/index.d.ts +32 -1
- package/types/tree.d.ts +23 -1
package/dist/a2bei4.utils.esm.js
CHANGED
|
@@ -355,7 +355,111 @@ function getAllSearchParams() {
|
|
|
355
355
|
function getSearchParam(key) {
|
|
356
356
|
const params = getAllSearchParams();
|
|
357
357
|
return params[key];
|
|
358
|
-
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* 全屏操作辅助工具对象
|
|
362
|
+
* @namespace fullscreenHelper
|
|
363
|
+
*/
|
|
364
|
+
const fullscreenHelper = {
|
|
365
|
+
/**
|
|
366
|
+
* 请求进入全屏模式
|
|
367
|
+
* @param {Element} element - 要全屏显示的元素
|
|
368
|
+
* @returns {Promise<void> | undefined} 全屏请求 Promise(如支持)
|
|
369
|
+
*/
|
|
370
|
+
requestFullscreen: (element) => {
|
|
371
|
+
if (!element) {
|
|
372
|
+
console.warn("未提供有效的 DOM 元素");
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (element.requestFullscreen) {
|
|
376
|
+
return element.requestFullscreen();
|
|
377
|
+
} else if (element.mozRequestFullScreen) {
|
|
378
|
+
return element.mozRequestFullScreen();
|
|
379
|
+
} else if (element.webkitRequestFullscreen) {
|
|
380
|
+
return element.webkitRequestFullscreen();
|
|
381
|
+
} else if (element.msRequestFullscreen) {
|
|
382
|
+
return element.msRequestFullscreen();
|
|
383
|
+
} else {
|
|
384
|
+
console.warn("当前浏览器不支持全屏 API");
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* 退出全屏模式
|
|
390
|
+
* @returns {Promise<void> | undefined} 退出全屏请求 Promise(如支持)
|
|
391
|
+
*/
|
|
392
|
+
exitFullscreen: () => {
|
|
393
|
+
if (document.exitFullscreen) {
|
|
394
|
+
return document.exitFullscreen();
|
|
395
|
+
} else if (document.mozCancelFullScreen) {
|
|
396
|
+
return document.mozCancelFullScreen();
|
|
397
|
+
} else if (document.webkitExitFullscreen) {
|
|
398
|
+
return document.webkitExitFullscreen();
|
|
399
|
+
} else if (document.msExitFullscreen) {
|
|
400
|
+
return document.msExitFullscreen();
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* 获取当前全屏元素
|
|
406
|
+
* @returns {Element | null} 当前处于全屏模式的元素,无则返回 null
|
|
407
|
+
*/
|
|
408
|
+
getFullscreenElement: () => {
|
|
409
|
+
return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement || null;
|
|
410
|
+
},
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* 检测当前是否处于全屏模式
|
|
414
|
+
* @returns {boolean} 是否全屏中
|
|
415
|
+
*/
|
|
416
|
+
isFullscreen: () => {
|
|
417
|
+
return !!(document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement);
|
|
418
|
+
},
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* 检测浏览器是否支持全屏 API
|
|
422
|
+
* @returns {boolean} 是否支持全屏
|
|
423
|
+
*/
|
|
424
|
+
isFullscreenEnabled: () => {
|
|
425
|
+
return !!(document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled);
|
|
426
|
+
},
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* 切换指定元素的全屏状态
|
|
430
|
+
* @param {Element} element - 要切换全屏的元素
|
|
431
|
+
* @returns {Promise<void> | undefined} 全屏操作 Promise
|
|
432
|
+
*/
|
|
433
|
+
toggleFullscreen: (element) => {
|
|
434
|
+
if (fullscreenHelper.isFullscreen()) {
|
|
435
|
+
return fullscreenHelper.exitFullscreen();
|
|
436
|
+
} else {
|
|
437
|
+
return fullscreenHelper.requestFullscreen(element);
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* 监听全屏变化事件
|
|
443
|
+
* @param {Function} callback - 全屏状态变化时的回调函数,参数为 isFullscreen: boolean
|
|
444
|
+
* @returns {Function} 取消监听的函数
|
|
445
|
+
*/
|
|
446
|
+
onFullscreenChange: (callback) => {
|
|
447
|
+
const handler = () => {
|
|
448
|
+
callback(fullscreenHelper.isFullscreen());
|
|
449
|
+
};
|
|
450
|
+
document.addEventListener("fullscreenchange", handler);
|
|
451
|
+
document.addEventListener("webkitfullscreenchange", handler);
|
|
452
|
+
document.addEventListener("mozfullscreenchange", handler);
|
|
453
|
+
document.addEventListener("msfullscreenchange", handler);
|
|
454
|
+
|
|
455
|
+
return () => {
|
|
456
|
+
document.removeEventListener("fullscreenchange", handler);
|
|
457
|
+
document.removeEventListener("webkitfullscreenchange", handler);
|
|
458
|
+
document.removeEventListener("mozfullscreenchange", handler);
|
|
459
|
+
document.removeEventListener("msfullscreenchange", handler);
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
};
|
|
359
463
|
|
|
360
464
|
//#region 数据类型判断
|
|
361
465
|
|
|
@@ -1222,6 +1326,9 @@ async function fetchOrDownloadByUrl(url, fileName) {
|
|
|
1222
1326
|
const urlPathname = new URL(url).pathname;
|
|
1223
1327
|
// 获取路径的最后一部分作为文件名,并移除可能的查询参数
|
|
1224
1328
|
fileName = urlPathname.substring(urlPathname.lastIndexOf("/") + 1).split("?")[0];
|
|
1329
|
+
if (fileName) {
|
|
1330
|
+
fileName = decodeURIComponent(fileName);
|
|
1331
|
+
}
|
|
1225
1332
|
} catch (e) {}
|
|
1226
1333
|
// 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳
|
|
1227
1334
|
if (!fileName) {
|
|
@@ -1897,6 +2004,64 @@ function extractFullyCheckedKeys(treeData, selectedKeys, idKey = "id", childrenK
|
|
|
1897
2004
|
checked: [...checked],
|
|
1898
2005
|
halfChecked: [...halfChecked]
|
|
1899
2006
|
};
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
/**
|
|
2010
|
+
* 在树形结构中查找目标节点的完整路径(从根节点到目标节点,含目标节点自身)。
|
|
2011
|
+
*
|
|
2012
|
+
* @template T extends Record<PropertyKey, any>
|
|
2013
|
+
* @param {T[]} nodes - 树形结构森林(支持多根)
|
|
2014
|
+
* @param {any} targetValue - 目标节点的 key 值
|
|
2015
|
+
* @param {string} [key='id'] - 节点唯一标识字段
|
|
2016
|
+
* @param {string} [parentKey='pid'] - 父节点标识字段(指向父节点的 key 值)
|
|
2017
|
+
* @param {string} [childrenKey='children'] - 子节点数组字段
|
|
2018
|
+
* @returns {T[]} 从根到目标节点的路径数组;未找到返回空数组
|
|
2019
|
+
*
|
|
2020
|
+
* @example
|
|
2021
|
+
* const tree = [
|
|
2022
|
+
* { id: 1, pid: null, children: [
|
|
2023
|
+
* { id: 2, pid: 1, children: [
|
|
2024
|
+
* { id: 3, pid: 2 }
|
|
2025
|
+
* ]}
|
|
2026
|
+
* ]}
|
|
2027
|
+
* ];
|
|
2028
|
+
* findTreeNodePath(tree, 3); // [{id:1, ...}, {id:2, ...}, {id:3, ...}]
|
|
2029
|
+
*/
|
|
2030
|
+
function findTreeNodePath(nodes, targetValue, key = "id", parentKey = "pid", childrenKey = "children") {
|
|
2031
|
+
if (!Array.isArray(nodes) || nodes.length === 0 || targetValue == null) {
|
|
2032
|
+
return [];
|
|
2033
|
+
}
|
|
2034
|
+
|
|
2035
|
+
// 1. 建立节点索引
|
|
2036
|
+
const index = new Map();
|
|
2037
|
+
const stack = [...nodes];
|
|
2038
|
+
|
|
2039
|
+
while (stack.length) {
|
|
2040
|
+
const node = stack.pop();
|
|
2041
|
+
if (!node || typeof node !== "object") continue;
|
|
2042
|
+
|
|
2043
|
+
index.set(node[key], node);
|
|
2044
|
+
|
|
2045
|
+
const children = node[childrenKey];
|
|
2046
|
+
if (Array.isArray(children)) {
|
|
2047
|
+
stack.push(...children);
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
// 2. 回溯路径(防循环引用)
|
|
2052
|
+
const path = [];
|
|
2053
|
+
const visited = new Set();
|
|
2054
|
+
let cur = index.get(targetValue);
|
|
2055
|
+
|
|
2056
|
+
while (cur && !visited.has(cur[key])) {
|
|
2057
|
+
visited.add(cur[key]);
|
|
2058
|
+
path.push(cur);
|
|
2059
|
+
|
|
2060
|
+
const parentValue = cur[parentKey];
|
|
2061
|
+
cur = parentValue != null ? index.get(parentValue) : undefined;
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
return path.reverse();
|
|
1900
2065
|
}
|
|
1901
2066
|
|
|
1902
2067
|
/**
|
|
@@ -2304,5 +2469,5 @@ class WebSocketManager {
|
|
|
2304
2469
|
}
|
|
2305
2470
|
}
|
|
2306
2471
|
|
|
2307
|
-
export { AudioStreamResampler, IntervalTimer, MyEvent, MyEvent_CrossPagePlugin, MyId, WebSocketManager, assignExisting, debounce, deepCloneByJSON, downloadByBlob, downloadByData, downloadByUrl, downloadExcel, downloadJSON, extractFullyCheckedKeys, fetchOrDownloadByUrl, findObjAttrValueById, findTreeNodeById, flatCompleteTree2NestedTree, formatTimeForLocale, getAllSearchParams, getDataType, getFunctionArgNames, getGUID, getSearchParam, getTimePeriodName, getViewportSize, handleDbMenuItems, isBlob, isDate, isFunction, isNonEmptyString, isPlainObject, isPromise, millisecond2Duration, millisecond2DurationMaxDay, millisecond2DurationMaxHour, moveItem, nestedTree2IdMap, pcmToWavBlob, randomDateInRange, randomEnLetter, randomHan, randomHanOrEn, randomIntInRange, readBlobAsText, second2Duration, second2DurationMaxDay, second2DurationMaxHour, shuffle, throttle, toDate };
|
|
2472
|
+
export { AudioStreamResampler, IntervalTimer, MyEvent, MyEvent_CrossPagePlugin, MyId, WebSocketManager, assignExisting, debounce, deepCloneByJSON, downloadByBlob, downloadByData, downloadByUrl, downloadExcel, downloadJSON, extractFullyCheckedKeys, fetchOrDownloadByUrl, findObjAttrValueById, findTreeNodeById, findTreeNodePath, flatCompleteTree2NestedTree, formatTimeForLocale, fullscreenHelper, getAllSearchParams, getDataType, getFunctionArgNames, getGUID, getSearchParam, getTimePeriodName, getViewportSize, handleDbMenuItems, isBlob, isDate, isFunction, isNonEmptyString, isPlainObject, isPromise, millisecond2Duration, millisecond2DurationMaxDay, millisecond2DurationMaxHour, moveItem, nestedTree2IdMap, pcmToWavBlob, randomDateInRange, randomEnLetter, randomHan, randomHanOrEn, randomIntInRange, readBlobAsText, second2Duration, second2DurationMaxDay, second2DurationMaxHour, shuffle, throttle, toDate };
|
|
2308
2473
|
//# sourceMappingURL=a2bei4.utils.esm.js.map
|