@whitesev/pops 3.3.3 → 3.3.4

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.
@@ -4,18 +4,7 @@ import type { PopsTitleConfig, PopsDragConfig, PopsGeneralConfig, PopsMoreButton
4
4
  */
5
5
  export type PopsFolderDownloadOption = {
6
6
  /**
7
- * 是否点击后自动触发下载
8
- *
9
- * + `true`: 自动根据设置的`mode`值来选择下载方式
10
- * + `false`: 不触发下载
11
- */
12
- autoDownload: boolean;
13
- /**
14
- * 触发下载后会根据提供的url链接进行下载
15
- */
16
- url: string;
17
- /**
18
- * 下载方式
7
+ * 下载方式,不传入就不下载(不做任何处理)
19
8
  *
20
9
  * + `a`: 使用`a标签`进行下载
21
10
  * + `aBlank`: 使用`a标签`进行下载(添加属性`target="_blank"`)
@@ -26,6 +15,10 @@ export type PopsFolderDownloadOption = {
26
15
  * @default "aBlank"
27
16
  */
28
17
  mode?: "a" | "aBlank" | "iframe" | "open" | "openBlank";
18
+ /**
19
+ * 触发下载后会根据提供的url链接进行下载
20
+ */
21
+ url: string;
29
22
  };
30
23
  /**
31
24
  * pops.folder的folder配置信息
@@ -85,14 +78,22 @@ export interface PopsFolderDataConfig {
85
78
  * 层级
86
79
  */
87
80
  index: number;
81
+ /**
82
+ * 列表项的点击事件回调
83
+ *
84
+ * 如果是配置项,则自动根据配置项来创建下载事件,也可以自定义函数
85
+ *
86
+ * 如果是自定义函数的话,根据返回值来判断,如果为空则什么都不做
87
+ */
88
+ clickEvent?: ((
88
89
  /**
89
90
  * 点击事件
90
91
  */
91
- clickEvent?: (event: MouseEvent | PointerEvent,
92
+ event: MouseEvent | PointerEvent,
92
93
  /**
93
94
  * 当前层级的文件|文件夹信息配置
94
95
  */
95
- config: PopsFolderDataConfig) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>;
96
+ config: PopsFolderDataConfig) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>) | PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void;
96
97
  }
97
98
  /**
98
99
  * pops.folder
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whitesev/pops",
3
- "version": "3.3.3",
3
+ "version": "3.3.4",
4
4
  "description": "弹窗库,包含了alert、confirm、prompt、drawer、folder、loading、iframe、panel、tooltip、searchSuggestion、rightClickMenu组件",
5
5
  "keywords": [
6
6
  "ScriptCat",
@@ -10,7 +10,7 @@ import { popsUtils } from "../../utils/PopsUtils";
10
10
  import { PopsLoading } from "../loading";
11
11
  import { PopsFolderDefaultConfig } from "./defaultConfig";
12
12
  import { Folder_ICON } from "./folderIcon";
13
- import type { PopsFolderDataConfig, PopsFolderConfig, PopsFolderDownloadOption } from "./types";
13
+ import type { PopsFolderConfig, PopsFolderDataConfig, PopsFolderDownloadOption } from "./types";
14
14
 
15
15
  export const PopsFolder = {
16
16
  init(__config__: PopsFolderConfig) {
@@ -517,10 +517,13 @@ export const PopsFolder = {
517
517
  );
518
518
  // 存储原来的值
519
519
  Reflect.set($fileName, "__value__", folderData);
520
- Reflect.set($folder, "folderData", folderData);
520
+ Reflect.set($folder, "__value__", folderData);
521
521
  $folder.appendChild($fileName);
522
522
  return {
523
523
  folderElement: $folder,
524
+ /**
525
+ * 超链接标签的容器
526
+ */
524
527
  fileNameElement: $fileName,
525
528
  };
526
529
  }
@@ -619,8 +622,16 @@ export const PopsFolder = {
619
622
  },
620
623
  addIndexCSS: false,
621
624
  });
625
+ let childConfig: PopsFolderDataConfig[] | undefined;
622
626
  if (typeof dataConfig.clickEvent === "function") {
623
- const childConfig = await dataConfig.clickEvent(clickEvent, dataConfig);
627
+ const result = await dataConfig.clickEvent(clickEvent, dataConfig);
628
+ if (Array.isArray(result)) {
629
+ childConfig = result;
630
+ }
631
+ } else if (Array.isArray(dataConfig.clickEvent)) {
632
+ childConfig = dataConfig.clickEvent;
633
+ }
634
+ if (childConfig) {
624
635
  // 添加顶部导航的箭头
625
636
  folderFileListBreadcrumbPrimaryElement.appendChild(this.createHeaderArrowIcon());
626
637
  // 添加顶部导航的链接文字
@@ -637,54 +648,63 @@ export const PopsFolder = {
637
648
  }
638
649
  loadingMask.close();
639
650
  }
651
+ /**
652
+ * 更新文件的显示的链接信息
653
+ *
654
+ * 这里主要用于鼠标中键或者右键触发,左键触发方式会根据mode进行处理
655
+ * @returns 更新的文件的下载链接
656
+ */
657
+ updateFileLink($row: HTMLElement, downloadInfo: PopsFolderDownloadOption) {
658
+ const downloadUrl = typeof downloadInfo?.url === "string" ? downloadInfo.url.trim() : "";
659
+ if (downloadUrl !== "" && downloadUrl !== "null" && downloadUrl !== "undefined") {
660
+ const $link = $row.querySelector("a")!;
661
+ $link.setAttribute("href", downloadUrl);
662
+ return downloadUrl;
663
+ }
664
+ }
640
665
  /**
641
666
  * 文件的点击事件 - 下载文件
642
- * @param $target
667
+ * @param evt 点击事件
668
+ * @param $row 列表项
643
669
  * @param dataConfig
644
670
  */
645
- async downloadFile(clickEvent: MouseEvent | PointerEvent, $row: HTMLElement, dataConfig: PopsFolderDataConfig) {
646
- popsDOMUtils.preventEvent(clickEvent);
647
-
648
- const $link = $row.querySelector("a")!;
671
+ async onFileClick(evt: MouseEvent | PointerEvent, $row: HTMLElement, dataConfig: PopsFolderDataConfig) {
672
+ let downloadInfo: PopsFolderDownloadOption | undefined;
649
673
  if (typeof dataConfig.clickEvent === "function") {
650
- const downloadInfo = await dataConfig.clickEvent(clickEvent, dataConfig)!;
651
- if (
652
- downloadInfo != null &&
653
- typeof downloadInfo === "object" &&
654
- !Array.isArray(downloadInfo) &&
655
- typeof downloadInfo.url === "string" &&
656
- downloadInfo.url.trim() !== ""
657
- ) {
658
- $link.setAttribute("href", downloadInfo.url);
659
- $link.setAttribute("target", "_blank");
660
- if (downloadInfo.autoDownload) {
661
- if (downloadInfo.mode == null || String(downloadInfo.mode) === "") {
662
- // 未设置mode的话默认为aBlank
663
- downloadInfo.mode = "aBlank";
664
- }
674
+ const result = await dataConfig.clickEvent(evt, dataConfig);
675
+ if (typeof result === "object" && result != null && !Array.isArray(result)) {
676
+ downloadInfo = result;
677
+ }
678
+ } else if (
679
+ typeof dataConfig.clickEvent === "object" &&
680
+ dataConfig.clickEvent != null &&
681
+ !Array.isArray(dataConfig.clickEvent)
682
+ ) {
683
+ downloadInfo = dataConfig.clickEvent;
684
+ }
685
+ if (downloadInfo) {
686
+ const downloadUrl = this.updateFileLink($row, downloadInfo);
687
+ if (downloadUrl) {
688
+ if (typeof downloadInfo.mode === "string") {
665
689
  if (downloadInfo.mode === "a" || downloadInfo.mode === "aBlank") {
666
690
  // a标签下载
667
691
  const $anchor = popsDOMUtils.createElement("a");
668
-
669
692
  if (downloadInfo.mode === "aBlank") {
670
693
  $anchor.setAttribute("target", "_blank");
671
694
  }
672
-
673
- $anchor.href = downloadInfo.url;
695
+ $anchor.href = downloadUrl;
674
696
  $anchor.click();
675
697
  } else if (downloadInfo.mode === "open" || downloadInfo.mode === "openBlank") {
676
698
  // window.open下载
677
-
678
699
  if (downloadInfo.mode === "openBlank") {
679
- globalThis.open(downloadInfo.url, "_blank");
700
+ globalThis.open(downloadUrl, "_blank");
680
701
  } else {
681
- globalThis.open(downloadInfo.url);
702
+ globalThis.open(downloadUrl);
682
703
  }
683
704
  } else if (downloadInfo.mode === "iframe") {
684
705
  // iframe下载
685
706
  const $downloadIframe = popsDOMUtils.createElement("iframe");
686
-
687
- $downloadIframe.src = downloadInfo.url;
707
+ $downloadIframe.src = downloadUrl;
688
708
  $downloadIframe.onload = function () {
689
709
  popsUtils.setTimeout(() => {
690
710
  $downloadIframe.remove();
@@ -860,9 +880,14 @@ export const PopsFolder = {
860
880
  // 文件 - 点击事件
861
881
  popsDOMUtils.on<MouseEvent | PointerEvent>(fileNameElement, "click", (event) => {
862
882
  // 下载文件
863
- this.downloadFile(event, fileNameElement, item);
883
+ popsDOMUtils.preventEvent(event);
884
+ this.onFileClick(event, fileNameElement, item);
864
885
  });
865
-
886
+ // 如果clickEvent不是函数,那么现在就可以进行配置
887
+ if (typeof item.clickEvent === "object" && item.clickEvent !== null && !Array.isArray(item.clickEvent)) {
888
+ // {} 单文件配置
889
+ this.updateFileLink(fileNameElement, item.clickEvent);
890
+ }
866
891
  folderListBodyElement.appendChild(folderElement);
867
892
  }
868
893
  });
@@ -10,18 +10,7 @@ import type {
10
10
  */
11
11
  export type PopsFolderDownloadOption = {
12
12
  /**
13
- * 是否点击后自动触发下载
14
- *
15
- * + `true`: 自动根据设置的`mode`值来选择下载方式
16
- * + `false`: 不触发下载
17
- */
18
- autoDownload: boolean;
19
- /**
20
- * 触发下载后会根据提供的url链接进行下载
21
- */
22
- url: string;
23
- /**
24
- * 下载方式
13
+ * 下载方式,不传入就不下载(不做任何处理)
25
14
  *
26
15
  * + `a`: 使用`a标签`进行下载
27
16
  * + `aBlank`: 使用`a标签`进行下载(添加属性`target="_blank"`)
@@ -32,6 +21,10 @@ export type PopsFolderDownloadOption = {
32
21
  * @default "aBlank"
33
22
  */
34
23
  mode?: "a" | "aBlank" | "iframe" | "open" | "openBlank";
24
+ /**
25
+ * 触发下载后会根据提供的url链接进行下载
26
+ */
27
+ url: string;
35
28
  };
36
29
  /**
37
30
  * pops.folder的folder配置信息
@@ -96,15 +89,28 @@ export interface PopsFolderDataConfig {
96
89
  */
97
90
  index: number;
98
91
  /**
99
- * 点击事件
92
+ * 列表项的点击事件回调
93
+ *
94
+ * 如果是配置项,则自动根据配置项来创建下载事件,也可以自定义函数
95
+ *
96
+ * 如果是自定义函数的话,根据返回值来判断,如果为空则什么都不做
100
97
  */
101
- clickEvent?: (
102
- event: MouseEvent | PointerEvent,
103
- /**
104
- * 当前层级的文件|文件夹信息配置
105
- */
106
- config: PopsFolderDataConfig
107
- ) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>;
98
+ clickEvent?:
99
+ | ((
100
+ /**
101
+ * 点击事件
102
+ */
103
+ event: MouseEvent | PointerEvent,
104
+ /**
105
+ * 当前层级的文件|文件夹信息配置
106
+ */
107
+ config: PopsFolderDataConfig
108
+ ) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>)
109
+ | PopsFolderDownloadOption
110
+ | PopsFolderDataConfig[]
111
+ | null
112
+ | undefined
113
+ | void;
108
114
  }
109
115
 
110
116
  /**