@gkd-kit/inspect 0.0.1788402967532 → 0.0.1788443658697
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/README.md +2 -6
- package/dist/404.html +24 -22
- package/dist/assets/DevicePage-mBNklLwb.js +47 -0
- package/dist/assets/DevicePage-mBNklLwb.js.map +1 -0
- package/dist/assets/FileSaver.min-fk8nTGM3.js +17 -0
- package/dist/assets/FileSaver.min-fk8nTGM3.js.map +1 -0
- package/dist/assets/GkSvg-BrGn5sVr.css +1 -0
- package/dist/assets/GkSvg-Dkvlr88l.js +259 -0
- package/dist/assets/GkSvg-Dkvlr88l.js.map +1 -0
- package/dist/assets/HomePage-CjD46NH9.js +7 -0
- package/dist/assets/HomePage-CjD46NH9.js.map +1 -0
- package/dist/assets/HomePage-DD3iwAfV.css +1 -0
- package/dist/assets/Icon-BHdFz8RC.js +276 -0
- package/dist/assets/Icon-BHdFz8RC.js.map +1 -0
- package/dist/assets/ImportPage-XOAqNe_N.js +2 -0
- package/dist/assets/ImportPage-XOAqNe_N.js.map +1 -0
- package/dist/assets/LogPage-BaCESXfq.js +448 -0
- package/dist/assets/LogPage-BaCESXfq.js.map +1 -0
- package/dist/assets/{_404Page-CgesYbt5.js → NotFoundPage-CKUNNSi3.js} +2 -2
- package/dist/assets/NotFoundPage-CKUNNSi3.js.map +1 -0
- package/dist/assets/PageBackButton-Dwz2frwk.js +2 -0
- package/dist/assets/PageBackButton-Dwz2frwk.js.map +1 -0
- package/dist/assets/Select-Cm2UFID-.js +411 -0
- package/dist/assets/Select-Cm2UFID-.js.map +1 -0
- package/dist/assets/SelectorLibraryDialog-DDt-WY-W.js +15 -0
- package/dist/assets/SelectorLibraryDialog-DDt-WY-W.js.map +1 -0
- package/dist/assets/SelectorLibraryPage-DHtJivqo.css +1 -0
- package/dist/assets/SelectorLibraryPage-XNxTzTWb.js +7 -0
- package/dist/assets/SelectorLibraryPage-XNxTzTWb.js.map +1 -0
- package/dist/assets/SelectorPage-xZby_SLo.js +2 -0
- package/dist/assets/SelectorPage-xZby_SLo.js.map +1 -0
- package/dist/assets/SelectorSyntaxInput-BCMgwjeh.css +1 -0
- package/dist/assets/SelectorSyntaxInput-KmQ9LVNv.js +106 -0
- package/dist/assets/SelectorSyntaxInput-KmQ9LVNv.js.map +1 -0
- package/dist/assets/SelectorText-CVH_L8-J.js +2 -0
- package/dist/assets/SelectorText-CVH_L8-J.js.map +1 -0
- package/dist/assets/{TrackGraph-DO7dm8ir.js → SelectorTrackGraph-rZn2-Gxn.js} +3 -3
- package/dist/assets/SelectorTrackGraph-rZn2-Gxn.js.map +1 -0
- package/dist/assets/SettingsModal-BFyYWuUn.js +103 -0
- package/dist/assets/SettingsModal-BFyYWuUn.js.map +1 -0
- package/dist/assets/SnapshotActionCard--z5EaDpt.js +2 -0
- package/dist/assets/SnapshotActionCard--z5EaDpt.js.map +1 -0
- package/dist/assets/SnapshotPage-B3KRzrSS.css +1 -0
- package/dist/assets/SnapshotPage-blnc7yDH.js +102 -0
- package/dist/assets/SnapshotPage-blnc7yDH.js.map +1 -0
- package/dist/assets/Spin-BOIbC1yK.js +115 -0
- package/dist/assets/{Spin-CAO46Hzy.js.map → Spin-BOIbC1yK.js.map} +1 -1
- package/dist/assets/SvgPage-CCtY1Yv9.js +2 -0
- package/dist/assets/SvgPage-CCtY1Yv9.js.map +1 -0
- package/dist/assets/Tooltip-BAJeKww5.js +118 -0
- package/dist/assets/Tooltip-BAJeKww5.js.map +1 -0
- package/dist/assets/Tree-9ikLeibg.js +163 -0
- package/dist/assets/Tree-9ikLeibg.js.map +1 -0
- package/dist/assets/_Uint8Array-Cx6yqGy0.js +2 -0
- package/dist/assets/_Uint8Array-Cx6yqGy0.js.map +1 -0
- package/dist/assets/_baseIteratee-CqFoWjuq.js +2 -0
- package/dist/assets/{_baseIteratee-xM9ekbiY.js.map → _baseIteratee-CqFoWjuq.js.map} +1 -1
- package/dist/assets/async-DuglrXBM.js +2 -0
- package/dist/assets/async-DuglrXBM.js.map +1 -0
- package/dist/assets/browserStorage-f5-02Xgl.js +2 -0
- package/dist/assets/browserStorage-f5-02Xgl.js.map +1 -0
- package/dist/assets/{check-CP3hden6.js → check-Dd1A8hI9.js} +1 -1
- package/dist/assets/check-Dd1A8hI9.js.map +1 -0
- package/dist/assets/chunk-Cef-YbNA.js +4 -0
- package/dist/assets/chunk-Cef-YbNA.js.map +1 -0
- package/dist/assets/colors-XOfetx1R.js +2 -0
- package/dist/assets/colors-XOfetx1R.js.map +1 -0
- package/dist/assets/directives-YHTO-_6A.js +652 -0
- package/dist/assets/directives-YHTO-_6A.js.map +1 -0
- package/dist/assets/dist-DSKcjXAK.js +232 -0
- package/dist/assets/dist-DSKcjXAK.js.map +1 -0
- package/dist/assets/dist-KfNVg4oh.js +2 -0
- package/dist/assets/dist-KfNVg4oh.js.map +1 -0
- package/dist/assets/feedback-BCD3yAcw.js +332 -0
- package/dist/assets/feedback-BCD3yAcw.js.map +1 -0
- package/dist/assets/files-D010eUui.js +2 -0
- package/dist/assets/files-D010eUui.js.map +1 -0
- package/dist/assets/icons-BcxJvc-5.js +2 -0
- package/dist/assets/icons-BcxJvc-5.js.map +1 -0
- package/dist/assets/import-BqcBJI6N.js +2 -0
- package/dist/assets/import-BqcBJI6N.js.map +1 -0
- package/dist/assets/index-DmhOsxcU.css +2 -0
- package/dist/assets/index-osN3J6f3.js +12 -0
- package/dist/assets/index-osN3J6f3.js.map +1 -0
- package/dist/assets/{jszip.min-BKIRWEnM.js → jszip.min-s_6hcuOu.js} +1 -1
- package/dist/assets/{jszip.min-BKIRWEnM.js.map → jszip.min-s_6hcuOu.js.map} +1 -1
- package/dist/assets/light-4onLjMnA.js +2 -0
- package/dist/assets/light-4onLjMnA.js.map +1 -0
- package/dist/assets/light-B50bMGBy.js +2 -0
- package/dist/assets/light-B50bMGBy.js.map +1 -0
- package/dist/assets/{light-CRsZK_dh.js → light-BLFyB18q.js} +2 -2
- package/dist/assets/{light-CRsZK_dh.js.map → light-BLFyB18q.js.map} +1 -1
- package/dist/assets/light-Bjkp4dJF.js +2 -0
- package/dist/assets/light-Bjkp4dJF.js.map +1 -0
- package/dist/assets/light-C0aZgUPN.js +277 -0
- package/dist/assets/light-C0aZgUPN.js.map +1 -0
- package/dist/assets/light-DeLio8id.js +2 -0
- package/dist/assets/{light-BZ7Gh872.js.map → light-DeLio8id.js.map} +1 -1
- package/dist/assets/light-DgQ7Og3u.js +2 -0
- package/dist/assets/light-DgQ7Og3u.js.map +1 -0
- package/dist/assets/light-NrEx3Kav.js +2 -0
- package/dist/assets/light-NrEx3Kav.js.map +1 -0
- package/dist/assets/localforage-DfYJ3rxR.js +2 -0
- package/dist/assets/localforage-DfYJ3rxR.js.map +1 -0
- package/dist/assets/log_url-DKPTdfpj.js +2 -0
- package/dist/assets/log_url-DKPTdfpj.js.map +1 -0
- package/dist/assets/{node-DIgJnl-n.js → node-CIZrLyi1.js} +1 -1
- package/dist/assets/node-CIZrLyi1.js.map +1 -0
- package/dist/assets/{parser-CWCNmfFi.js → parser-hURRPML_.js} +2 -2
- package/dist/assets/parser-hURRPML_.js.map +1 -0
- package/dist/assets/{polyfills-C_CdBzSc.js → polyfills-AuHtLQoY.js} +2 -2
- package/dist/assets/{polyfills-C_CdBzSc.js.map → polyfills-AuHtLQoY.js.map} +1 -1
- package/dist/assets/{runtime-core.esm-bundler-spSacuTK.js → runtime-core.esm-bundler-ChiMl8Ql.js} +1 -1
- package/dist/assets/{runtime-core.esm-bundler-spSacuTK.js.map → runtime-core.esm-bundler-ChiMl8Ql.js.map} +1 -1
- package/dist/assets/{sql-wasm-browser-B3yPEBWl.js → sql-wasm-browser-_wXhwvqf.js} +2 -2
- package/dist/assets/{sql-wasm-browser-B3yPEBWl.js.map → sql-wasm-browser-_wXhwvqf.js.map} +1 -1
- package/dist/assets/storage-TSr2iVMY.js +2 -0
- package/dist/assets/storage-TSr2iVMY.js.map +1 -0
- package/dist/assets/store-B9nnNZ7h.js +2 -0
- package/dist/assets/store-B9nnNZ7h.js.map +1 -0
- package/dist/assets/store-BymkFfe0.js +2 -0
- package/dist/assets/store-BymkFfe0.js.map +1 -0
- package/dist/assets/store-DPUVqAzO.js +2 -0
- package/dist/assets/store-DPUVqAzO.js.map +1 -0
- package/dist/assets/useBatchActions-Cd0QgszF.js +6 -0
- package/dist/assets/useBatchActions-Cd0QgszF.js.map +1 -0
- package/dist/assets/useTheme-HkFChu_v.js +2 -0
- package/dist/assets/useTheme-HkFChu_v.js.map +1 -0
- package/dist/assets/{vue-router-tY0NRlIK.js → vue-router-cP2OY2w9.js} +2 -2
- package/dist/assets/{vue-router-tY0NRlIK.js.map → vue-router-cP2OY2w9.js.map} +1 -1
- package/dist/assets/{worker-entry-retrace.worker-75p7B8UM.js → worker-entry-retrace.worker-DCL15ehV.js} +2 -2
- package/dist/assets/worker-entry-retrace.worker-DCL15ehV.js.map +1 -0
- package/dist/assets/{worker-entry-sqlite.worker-BtS31qB6.js → worker-entry-sqlite.worker-CgS8gdJy.js} +2 -2
- package/dist/assets/worker-entry-sqlite.worker-CgS8gdJy.js.map +1 -0
- package/dist/index.html +24 -22
- package/package.json +8 -5
- package/dist/assets/ActionCard-D_iLeBVk.js +0 -17
- package/dist/assets/ActionCard-D_iLeBVk.js.map +0 -1
- package/dist/assets/DevicePage-bq3R3IFM.js +0 -47
- package/dist/assets/DevicePage-bq3R3IFM.js.map +0 -1
- package/dist/assets/Ellipsis-CtARjP2c.js +0 -677
- package/dist/assets/Ellipsis-CtARjP2c.js.map +0 -1
- package/dist/assets/HomePage-DsR4CjeG.js +0 -7
- package/dist/assets/HomePage-DsR4CjeG.js.map +0 -1
- package/dist/assets/Icon-ibvjqfR5.js +0 -126
- package/dist/assets/Icon-ibvjqfR5.js.map +0 -1
- package/dist/assets/ImportPage-DS_tp8lh.js +0 -2
- package/dist/assets/ImportPage-DS_tp8lh.js.map +0 -1
- package/dist/assets/Input-B54NcGN0.js +0 -259
- package/dist/assets/Input-B54NcGN0.js.map +0 -1
- package/dist/assets/LogPage-CmagiuAs.js +0 -448
- package/dist/assets/LogPage-CmagiuAs.js.map +0 -1
- package/dist/assets/SelectorPage-Br868vz2.js +0 -2
- package/dist/assets/SelectorPage-Br868vz2.js.map +0 -1
- package/dist/assets/SelectorText-C0YdokmN.js +0 -2
- package/dist/assets/SelectorText-C0YdokmN.js.map +0 -1
- package/dist/assets/SettingsModal-Bb0PnjpH.js +0 -103
- package/dist/assets/SettingsModal-Bb0PnjpH.js.map +0 -1
- package/dist/assets/SnapshotPage-D240dKnI.css +0 -1
- package/dist/assets/SnapshotPage-DNILCSZv.js +0 -90
- package/dist/assets/SnapshotPage-DNILCSZv.js.map +0 -1
- package/dist/assets/Spin-CAO46Hzy.js +0 -115
- package/dist/assets/SvgPage-fUt9ktGA.js +0 -2
- package/dist/assets/SvgPage-fUt9ktGA.js.map +0 -1
- package/dist/assets/TrackGraph-DO7dm8ir.js.map +0 -1
- package/dist/assets/Tree-B97cAa5_.js +0 -163
- package/dist/assets/Tree-B97cAa5_.js.map +0 -1
- package/dist/assets/_404Page-CgesYbt5.js.map +0 -1
- package/dist/assets/_baseIteratee-xM9ekbiY.js +0 -2
- package/dist/assets/check-CP3hden6.js.map +0 -1
- package/dist/assets/chunk-D0DXU6x0.js +0 -4
- package/dist/assets/chunk-D0DXU6x0.js.map +0 -1
- package/dist/assets/directives-C7Nknv_C.js +0 -652
- package/dist/assets/directives-C7Nknv_C.js.map +0 -1
- package/dist/assets/discrete-D77KcvaH.js +0 -607
- package/dist/assets/discrete-D77KcvaH.js.map +0 -1
- package/dist/assets/dist-B9UyETbi.js +0 -232
- package/dist/assets/dist-B9UyETbi.js.map +0 -1
- package/dist/assets/dist-Bfoo-x20.js +0 -15
- package/dist/assets/dist-Bfoo-x20.js.map +0 -1
- package/dist/assets/import-D-7G2WmW.js +0 -2
- package/dist/assets/import-D-7G2WmW.js.map +0 -1
- package/dist/assets/index-Br6rqmTy.js +0 -12
- package/dist/assets/index-Br6rqmTy.js.map +0 -1
- package/dist/assets/index-OjId7Sle.css +0 -2
- package/dist/assets/light-BZ7Gh872.js +0 -2
- package/dist/assets/light-CxzI_aug.js +0 -2
- package/dist/assets/light-CxzI_aug.js.map +0 -1
- package/dist/assets/light-KRL2pqKU.js +0 -2
- package/dist/assets/light-KRL2pqKU.js.map +0 -1
- package/dist/assets/light-oHycPjah.js +0 -2
- package/dist/assets/light-oHycPjah.js.map +0 -1
- package/dist/assets/localforage-C67borAd.js +0 -2
- package/dist/assets/localforage-C67borAd.js.map +0 -1
- package/dist/assets/log_url-CtJSt5Wg.js +0 -2
- package/dist/assets/log_url-CtJSt5Wg.js.map +0 -1
- package/dist/assets/node-DIgJnl-n.js.map +0 -1
- package/dist/assets/others-D6OXBwtH.css +0 -1
- package/dist/assets/others-vYrfQ6w3.js +0 -2
- package/dist/assets/others-vYrfQ6w3.js.map +0 -1
- package/dist/assets/parser-CWCNmfFi.js.map +0 -1
- package/dist/assets/preload-helper-xBbMyY7u.js +0 -1
- package/dist/assets/storage-BXhV0leF.js +0 -2
- package/dist/assets/storage-BXhV0leF.js.map +0 -1
- package/dist/assets/storage-CLIxXbgg.js +0 -2
- package/dist/assets/storage-CLIxXbgg.js.map +0 -1
- package/dist/assets/svg-BzU3qpbU.js +0 -2
- package/dist/assets/svg-BzU3qpbU.js.map +0 -1
- package/dist/assets/useBatchActions-AtuG715E.js +0 -6
- package/dist/assets/useBatchActions-AtuG715E.js.map +0 -1
- package/dist/assets/useTheme-BdO-SmMr.js +0 -2
- package/dist/assets/useTheme-BdO-SmMr.js.map +0 -1
- package/dist/assets/worker-entry-retrace.worker-75p7B8UM.js.map +0 -1
- package/dist/assets/worker-entry-sqlite.worker-BtS31qB6.js.map +0 -1
- /package/dist/assets/{_plugin-vue_export-helper-DSZ7Ymws.js → _plugin-vue_export-helper-CLgcYIH-.js} +0 -0
package/README.md
CHANGED
|
@@ -10,6 +10,8 @@ GKD 网页端审查工具,
|
|
|
10
10
|
- 连接调试 GKD 内部 HTTP Server
|
|
11
11
|
- 实时启用订阅规则, 实时执行点击选择器
|
|
12
12
|
- 选择器路径视图
|
|
13
|
+
- 按全局、应用或界面范围收藏并复用选择器
|
|
14
|
+
- 可配置生成规则, 支持静态诊断和截图点击生成 `position`
|
|
13
15
|
|
|
14
16
|
## 运行环境
|
|
15
17
|
|
|
@@ -46,9 +48,3 @@ GKD 网页端审查工具,
|
|
|
46
48
|
- <https://i.gkd.li/i/14018243>
|
|
47
49
|
- <https://i.gkd.li/i/14011298>
|
|
48
50
|
- <https://i.gkd.li/i/13999908>
|
|
49
|
-
|
|
50
|
-
## 其它
|
|
51
|
-
|
|
52
|
-
[本项目 CDN 加速及安全防护由 Tencent EdgeOne 赞助](https://edgeone.ai/zh?from=github)
|
|
53
|
-
|
|
54
|
-
<img src="https://edgeone.ai/media/34fe3a45-492d-4ea4-ae5d-ea1087ca7b4b.png" alt="" width="75%" />
|
package/dist/404.html
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="zh">
|
|
3
3
|
<head>
|
|
4
|
-
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
4
|
+
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/polyfills-AuHtLQoY.js"></script>
|
|
5
5
|
|
|
6
6
|
<meta charset="UTF-8" />
|
|
7
7
|
<link
|
|
@@ -12,27 +12,29 @@
|
|
|
12
12
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
13
13
|
<meta name="referrer" content="no-referrer" />
|
|
14
14
|
<title>GKD</title>
|
|
15
|
-
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
16
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
17
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
18
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
19
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
20
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
21
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
22
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
23
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
24
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
25
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
26
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
27
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
28
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
29
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
30
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
31
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
32
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
33
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
34
|
-
<link rel="
|
|
35
|
-
<link rel="
|
|
15
|
+
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/index-osN3J6f3.js"></script>
|
|
16
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/chunk-62oNxeRG.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/runtime-core.esm-bundler-ChiMl8Ql.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/_Uint8Array-Cx6yqGy0.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/dist-DSKcjXAK.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/gkd-selector-CB_8ygle.js">
|
|
21
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-BLFyB18q.js">
|
|
22
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/log_url-DKPTdfpj.js">
|
|
23
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-C0aZgUPN.js">
|
|
24
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-B50bMGBy.js">
|
|
25
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-NrEx3Kav.js">
|
|
26
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-DgQ7Og3u.js">
|
|
27
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-DeLio8id.js">
|
|
28
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-Bjkp4dJF.js">
|
|
29
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/light-4onLjMnA.js">
|
|
30
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/localforage-DfYJ3rxR.js">
|
|
31
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/browserStorage-f5-02Xgl.js">
|
|
32
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/store-B9nnNZ7h.js">
|
|
33
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/useTheme-HkFChu_v.js">
|
|
34
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/vue-router-cP2OY2w9.js">
|
|
35
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/store-BymkFfe0.js">
|
|
36
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/check-Dd1A8hI9.js">
|
|
37
|
+
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1788443658697/files/dist/assets/index-DmhOsxcU.css">
|
|
36
38
|
</head>
|
|
37
39
|
<body>
|
|
38
40
|
</body>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import{i as e}from"./chunk-62oNxeRG.js";import{It as t,h as n}from"./dist-DSKcjXAK.js";import{t as r}from"./Tooltip-BAJeKww5.js";import{t as i}from"./Select-Cm2UFID-.js";import{Dt as a,F as o,J as s,M as c,at as l,d as u,dt as d,f,g as p,h as m,i as h,it as g,l as _,p as v,st as y,u as b,v as x}from"./runtime-core.esm-bundler-ChiMl8Ql.js";import{a as S}from"./light-C0aZgUPN.js";import{n as ee,t as C}from"./GkSvg-Dkvlr88l.js";import{i as w,n as T}from"./directives-YHTO-_6A.js";import{l as E}from"./Icon-BHdFz8RC.js";import{r as D}from"./feedback-BCD3yAcw.js";import{g as O,m as k,p as A,t as j}from"./SnapshotActionCard--z5EaDpt.js";import{o as M}from"./vue-router-cP2OY2w9.js";import{t as N}from"./check-Dd1A8hI9.js";import{i as P,r as F}from"./chunk-Cef-YbNA.js";import{n as te}from"./async-DuglrXBM.js";import{i as I,n as L,t as R}from"./SelectorLibraryDialog-DDt-WY-W.js";import{i as z,t as B}from"./storage-TSr2iVMY.js";import{i as ne,n as re,t as ie}from"./useBatchActions-Cd0QgszF.js";import{t as ae}from"./PageBackButton-Dwz2frwk.js";var oe=e=>{let t=y(e),n=y(),r=new AbortController,i=()=>{r.abort(),r=new AbortController,t.value=void 0,n.value=void 0},a=async(e,n,i)=>{if(!t.value)throw Error(`origin must exist`);let a=await P(new URL(`/api/`+e,t.value),{...n,signal:r.signal},i).catch(t=>{throw t instanceof DOMException&&t.name==`AbortError`||D.error(`网络错误:`+e),t});if(!a.ok)throw D.error(`接口错误:`+e+`:`+a.status),a;if(a.headers.get(`Content-Type`)?.includes(`application/json`)){let e=await a.clone().json();if(e.__error)throw D.error(e.message),a}return a},o=async(e,t={},n)=>a(e,{method:`post`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)},n),s=async(e,t={})=>o(e,t).then(e=>e.json()),c=async(e,t={})=>o(e,t,e=>(e.responseType=`arraybuffer`,e)).then(e=>e.arrayBuffer());return{origin:t,api:{getServerInfo:async()=>s(`getServerInfo`),getSnapshot:async e=>n.value?.gkdAppInfo?.versionName===`1.10.4`?a(`snapshot?id=`+e.id).then(e=>e.json()):s(`getSnapshot`,e),getScreenshot:async e=>c(`getScreenshot`,e),captureSnapshot:async()=>s(`captureSnapshot`),getSnapshots:async()=>s(`getSnapshots`),updateSubscription:async e=>s(`updateSubscription`,{...e,id:-1,name:`内存订阅`,version:0}),execSelector:async e=>(e=structuredClone(e),e.action||=void 0,s(`execSelector`,e)),deleteSnapshot:async e=>s(`deleteSnapshot`,e)},serverInfo:n,disconnect:i}},V=e(L(),1),H={class:`mt-8px flex justify-end`},U={flex:``,"gap-10px":``,"flex-items-center":``},se=x({__name:`DeviceActionDialogs`,props:{api:{},selectorShow:{type:Boolean},subscriptionShow:{type:Boolean}},emits:[`update:selectorShow`,`update:subscriptionShow`],setup(e,{emit:t}){let r=e,a=t,c=y(``),u=l({selector:``,action:`click`,quickFind:!1}),f=e=>{c.value=e},g=e=>{u.selector=e},_=e=>{u.quickFind=e},x=e=>{u.action=e},C=y(!1),w=()=>{C.value=!0},T=e=>{C.value=e},A=e=>{g(e)},j=[{label:`仅查询`,value:``},{value:`click`,label:`click`},{value:`clickNode`,label:`clickNode`},{value:`clickCenter`,label:`clickCenter`},{value:`back`,label:`back`},{value:`longClick`,label:`longClick`},{value:`longClickNode`,label:`longClickNode`},{value:`longClickCenter`,label:`longClickCenter`}],M=k(async()=>{let e=I(()=>V.default.parse(c.value.trim()));if(e){if(e.categories||e.globalGroups||e.apps)await r.api.updateSubscription(e);else if(typeof e.id==`string`)await r.api.updateSubscription({apps:[e]});else if(Array.isArray(e)&&typeof e[0].id==`string`)await r.api.updateSubscription({apps:e});else if(typeof e.key==`number`)await r.api.updateSubscription({globalGroups:[e]});else if(Array.isArray(e)&&typeof e[0].key==`number`)await r.api.updateSubscription({globalGroups:e});else{D.error(`无法识别的订阅文本`);return}D.success(`修改成功`)}}),N=k(async()=>{let e=await r.api.execSelector({...u,fastQuery:u.quickFind});if(e.message){D.success(`操作成功:`+e.message);return}e.action?D.success((e.result?`操作成功:`:`操作失败`)+e.action):e.result&&D.success(`查询成功`)});return(t,r)=>{let l=ee,y=S,D=n,k=E,P=O,F=i;return o(),v(h,null,[p(y,{show:e.subscriptionShow,preset:`dialog`,style:{width:`800px`},title:`修改内存订阅`,maskClosable:!1,positiveText:`确认`,positiveButtonProps:{loading:d(M).loading,onClick:d(M).invoke},"onUpdate:show":r[0]||=e=>a(`update:subscriptionShow`,e)},{default:s(()=>[p(l,{value:d(c),disabled:d(M).loading,type:`textarea`,class:`gkd_code`,autosize:{minRows:20,maxRows:25},placeholder:d(`请输入订阅文本(JSON5语法):
|
|
2
|
+
示例1-更新单个应用的规则:
|
|
3
|
+
{
|
|
4
|
+
id: 'appId',
|
|
5
|
+
groups: []
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
示例2-更新多个应用的规则:
|
|
9
|
+
[
|
|
10
|
+
{
|
|
11
|
+
id: 'appId1',
|
|
12
|
+
groups: []
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 'appId2',
|
|
16
|
+
groups: []
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
示例3-更新全局规则(1.7.0):
|
|
21
|
+
{
|
|
22
|
+
name: '全局规则-1',
|
|
23
|
+
key: 0,
|
|
24
|
+
rules: []
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
示例3-更新多个全局规则(1.7.0):
|
|
28
|
+
[
|
|
29
|
+
{
|
|
30
|
+
name: '全局规则-1',
|
|
31
|
+
key: 0,
|
|
32
|
+
rules: []
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: '全局规则-2',
|
|
36
|
+
key: 1,
|
|
37
|
+
rules: []
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
示例4-更新整个订阅(1.7.0):
|
|
42
|
+
{
|
|
43
|
+
apps: [],
|
|
44
|
+
globalGroups: [],
|
|
45
|
+
categories: [],
|
|
46
|
+
}`),"onUpdate:value":f},null,8,[`value`,`disabled`,`placeholder`])]),_:1},8,[`show`,`positiveButtonProps`]),p(y,{show:e.selectorShow,preset:`dialog`,style:{width:`800px`},title:`执行选择器`,maskClosable:!1,positiveText:`确认`,positiveButtonProps:{loading:d(N).loading,onClick:d(N).invoke},"onUpdate:show":r[1]||=e=>a(`update:selectorShow`,e)},{default:s(()=>[p(l,{value:d(u).selector,disabled:d(N).loading,type:`textarea`,class:`gkd_code`,autosize:{minRows:4,maxRows:10},placeholder:`请输入合法的选择器`,"onUpdate:value":g},null,8,[`value`,`disabled`]),b(`div`,H,[p(D,{secondary:``,onClick:w},{default:s(()=>[...r[2]||=[m(`选择器库`,-1)]]),_:1})]),r[6]||=b(`div`,{"h-15px":``},null,-1),p(P,null,{default:s(()=>[p(k,{checked:d(u).quickFind,"onUpdate:checked":_},{default:s(()=>[...r[3]||=[m(` 快速查找 `,-1)]]),_:1},8,[`checked`]),r[4]||=b(`a`,{href:`https://gkd.li/api/interfaces/RawCommonProps.html#quickfind`,target:`_blank`,rel:`noopener noreferrer`},` 查找说明 `,-1)]),_:1}),r[7]||=b(`div`,{"h-10px":``},null,-1),b(`div`,U,[p(F,{value:d(u).action,options:j,class:`w-150px`,"onUpdate:value":x},null,8,[`value`]),r[5]||=b(`a`,{href:`https://gkd.li/api/interfaces/RawRuleProps#action`,target:`_blank`,rel:`noopener noreferrer`},` 操作说明 `,-1)])]),_:1},8,[`show`,`positiveButtonProps`]),p(R,{show:d(C),onUse:A,"onUpdate:show":T},null,8,[`show`])],64)}}}),ce={"page-size":``,flex:``,"flex-col":``,"p-10px":``,"gap-10px":``},le={flex:``,"items-center":``,"gap-24px":``},ue={key:1,gkd_code:``,"pl-16px":``,"whitespace-nowrap":``,flex:``,"items-center":``},W=x({__name:`DeviceControlView`,setup(e){let i=M(),{api:x,origin:S,serverInfo:E,disconnect:O}=oe(),P=y(localStorage.getItem(`device_link`)||``),L=y([]),R=0,V=e=>{P.value=e},H=async(e=R)=>{let t=await x.getSnapshots();e==R&&(t.sort((e,t)=>t.id-e.id),L.value=t)},U=k(async()=>{if(!P.value)return;let e=++R;S.value=I(()=>new URL(P.value.trim()),()=>`非法设备地址`).origin,P.value=S.value,localStorage.setItem(`device_link`,P.value);let t=await x.getServerInfo();e==R&&(E.value=t,document.title=W.value,await H(e))}),W=_(()=>{if(!E.value)return`未连接设备`;let e=E.value.device,t=E.value.gkdAppInfo;return`${e.manufacturer} Android${e.release} - GKD${t.versionName}`});c(async()=>{await te(500),N(P.value)&&U.invoke()});let G=k(async()=>{let e=await x.captureSnapshot(),t=await x.getScreenshot({id:e.id});await z.setItem(e.id,e),await B.setItem(e.id,t),D.success(`捕获并保存快照成功`),await H()}),K=k(async()=>{let e=(await x.getSnapshots()).map(e=>e.id),t=new Set((await B.keys()).map(e=>parseInt(e))),n=e.filter(e=>!t.has(e));if(n.length==0){D.success(`没有新记录可导入`);return}let r=0,i=F(3);await Promise.all(n.map(e=>i(async()=>{let[t,n]=await Promise.all([x.getSnapshot({id:e}),x.getScreenshot({id:e})]);t.nodes&&(await Promise.all([z.setItem(e,t),B.setItem(e,n)]),r++)}))),D.success(`导入${r}条新记录`)}),{activityIdCol:de,appIdCol:fe,appNameCol:pe,ctimeCol:q,appVersionCodeCol:me,appVersionNameCol:he,resetColWidth:J}=ne(),ge=e=>{e.columnKey==q.key&&(q.sortOrder=e.order)},Y=A(async e=>{if(!await z.hasItem(e.id)){let t=await x.getSnapshot({id:e.id});await z.setItem(e.id,t)}if(!await B.hasItem(e.id)){let t=await x.getScreenshot({id:e.id});await B.setItem(e.id,t)}window.open(i.resolve({name:`snapshot`,params:{snapshotId:e.id}}).href)},e=>e.id),_e=[{type:`selection`},q,pe,fe,me,he,de,{key:`actions`,title:`操作`,fixed:`right`,width:`160px`,render(e){return p(j,{snapshot:e,showExport:!1,showShare:!1,deleteConfirmText:`是否确认删除? 此操作不可恢复!\n快照ID:${e.id}`,onPreview:()=>Y.invoke(e),previewLoading:Y.loading[e.id],onBeforeDelete:async()=>await x.deleteSnapshot({id:e.id}),onDelete:()=>{L.value=L.value.filter(t=>t.id!==e.id)}},null)}}],X=g([]),{batchDelete:ve}=ie(X,{beforeDeleteItem:async e=>await x.deleteSnapshot({id:e}),onAfterDelete:async()=>{await H()}}),Z=l({page:1,pageSize:50,showSizePicker:!0,pageSizes:[50,100],onChange:e=>{Z.page=e,J()},onUpdatePageSize:e=>{Z.pageSize=e,Z.page=1,J()}}),ye=y(!1),be=y(!1),Q=e=>{ye.value=e},$=e=>{be.value=e},xe=e=>{X.value=e.filter(e=>typeof e==`number`)},Se=()=>{R++,O(),L.value=[],X.value=[],Q(!1),$(!1),document.title=`连接设备`};return(e,i)=>{let c=n,l=r,g=ee,_=w,y=T;return o(),v(h,null,[(o(),u(se,{key:d(S)?.toString(),api:d(x),subscriptionShow:d(ye),selectorShow:d(be),"onUpdate:subscriptionShow":Q,"onUpdate:selectorShow":$},null,8,[`api`,`subscriptionShow`,`selectorShow`])),b(`div`,ce,[b(`div`,le,[p(ae,{class:`ml-12px`}),p(_,null,{default:s(()=>[p(g,{value:d(P),placeholder:`请输入设备地址`,class:`gkd_code`,style:{width:`240px`},onKeyup:t(d(U).invoke,[`enter`]),"onUpdate:value":V},{suffix:s(()=>[p(l,null,{trigger:s(()=>[p(c,{text:``,style:{"--n-icon-size":`20px`},loading:d(U).loading,onClick:d(U).invoke},{icon:s(()=>[p(C,{name:`refresh`})]),_:1},8,[`loading`,`onClick`])]),default:s(()=>[i[2]||=m(` 刷新连接 `,-1)]),_:1})]),_:1},8,[`value`,`onKeyup`]),d(U).loading?(o(),u(c,{key:0,secondary:``,type:`error`,onClick:Se},{default:s(()=>[...i[3]||=[m(` 停止 `,-1)]]),_:1})):f(``,!0),d(E)?(o(),v(`div`,ue,a(d(W)),1)):f(``,!0)]),_:1}),d(E)?(o(),v(h,{key:0},[p(re,{checkedCount:d(X).length,batchDelete:d(ve)},null,8,[`checkedCount`,`batchDelete`]),p(l,null,{trigger:s(()=>[p(c,{text:``,style:{"--n-icon-size":`24px`},loading:d(G).loading,onClick:d(G).invoke},{icon:s(()=>[p(C,{name:`Snapshot`})]),_:1},8,[`loading`,`onClick`])]),default:s(()=>[i[4]||=m(` 捕获快照 `,-1)]),_:1}),p(l,null,{trigger:s(()=>[p(c,{text:``,style:{"--n-icon-size":`24px`},loading:d(K).loading,onClick:d(K).invoke},{icon:s(()=>[p(C,{name:`Down-all`})]),_:1},8,[`loading`,`onClick`])]),default:s(()=>[i[5]||=m(` 下载所有快照 `,-1)]),_:1}),p(l,null,{trigger:s(()=>[p(c,{text:``,style:{"--n-icon-size":`24px`},onClick:i[0]||=e=>Q(!0)},{icon:s(()=>[p(C,{name:`CacheSub`})]),_:1})]),default:s(()=>[i[6]||=m(` 修改内存订阅 `,-1)]),_:1}),p(l,null,{trigger:s(()=>[p(c,{text:``,style:{"--n-icon-size":`24px`},onClick:i[1]||=e=>$(!0)},{icon:s(()=>[p(C,{name:`Exe-Sel`})]),_:1})]),default:s(()=>[i[7]||=m(` 执行选择器 `,-1)]),_:1})],64)):f(``,!0)]),p(y,{checkedRowKeys:d(X),striped:``,"flex-height":``,data:d(L),columns:_e,pagination:d(Z),rowKey:e=>e.id,size:`small`,class:`flex-1`,scrollX:1200,"onUpdate:checkedRowKeys":xe,"onUpdate:sorter":ge},null,8,[`checkedRowKeys`,`data`,`pagination`,`rowKey`])])],64)}}}),G=x({__name:`DevicePage`,setup(e){return(e,t)=>(o(),u(W))}});export{G as default};
|
|
47
|
+
//# sourceMappingURL=DevicePage-mBNklLwb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevicePage-mBNklLwb.js","names":[],"sources":["../../src/features/device-control/api.ts","../../src/features/device-control/DeviceActionDialogs.vue","../../src/features/device-control/DeviceActionDialogs.vue","../../src/features/device-control/DeviceControlView.vue","../../src/features/device-control/DeviceControlView.vue","../../src/pages/device/DevicePage.vue","../../src/pages/device/DevicePage.vue"],"sourcesContent":["import type { Snapshot } from '@/entities/snapshot/types';\nimport type { RpcError, ServerInfo } from '@/features/device-control/types';\nimport { message } from '@/shared/services/feedback';\nimport { enhanceFetch } from '@/features/network-access/enhanceFetch';\nimport type { GmXhrOptions } from '@/shared/api/gm';\n\ninterface Reqid {\n id: number;\n}\n\nexport const useDeviceApi = (initOrigin?: string) => {\n const origin = shallowRef(initOrigin);\n const serverInfo = shallowRef<ServerInfo>();\n let requestController = new AbortController();\n const disconnect = () => {\n requestController.abort();\n requestController = new AbortController();\n origin.value = undefined;\n serverInfo.value = undefined;\n };\n const request = async (\n name: string,\n init?: RequestInit,\n xhrDetails?: (arg: GmXhrOptions) => GmXhrOptions,\n ) => {\n if (!origin.value) {\n throw new Error(`origin must exist`);\n }\n const u = new URL(`/api/` + name, origin.value);\n const response = await enhanceFetch(\n u,\n { ...init, signal: requestController.signal },\n xhrDetails,\n ).catch((e) => {\n if (!(e instanceof DOMException && e.name == 'AbortError')) {\n message.error(`网络错误:` + name);\n }\n throw e;\n });\n if (!response.ok) {\n message.error(`接口错误:` + name + `:` + response.status);\n throw response;\n }\n if (response.headers.get(`Content-Type`)?.includes(`application/json`)) {\n const error = (await response.clone().json()) as RpcError;\n if (error.__error) {\n message.error(error.message);\n throw response;\n }\n }\n return response;\n };\n const baseRpc = async (\n name: string,\n data: object = {},\n xhrDetails?: (arg: GmXhrOptions) => GmXhrOptions,\n ) => {\n return request(\n name,\n {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n },\n xhrDetails,\n );\n };\n const jsonRpc = async <T>(name: string, data: object = {}): Promise<T> => {\n return baseRpc(name, data).then((r) => r.json());\n };\n const bfRpc = async (\n name: string,\n data: object = {},\n ): Promise<ArrayBuffer> => {\n return baseRpc(name, data, (v) => {\n // must set responseType to get binary data\n v.responseType = 'arraybuffer';\n return v;\n }).then((r) => r.arrayBuffer());\n };\n const api = {\n getServerInfo: async () => jsonRpc<ServerInfo>(`getServerInfo`),\n getSnapshot: async (data: Reqid): Promise<Snapshot> => {\n if (serverInfo.value?.gkdAppInfo?.versionName === '1.10.4') {\n // 兼容旧版本 BUG\n // https://github.com/gkd-kit/gkd/blob/v1.10.4/app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt#L198\n return request('snapshot?id=' + data.id).then((r) => r.json());\n }\n return jsonRpc(`getSnapshot`, data);\n },\n getScreenshot: async (data: Reqid) => {\n return bfRpc(`getScreenshot`, data);\n },\n captureSnapshot: async () => jsonRpc<Snapshot>(`captureSnapshot`),\n getSnapshots: async () => jsonRpc<Snapshot[]>(`getSnapshots`),\n updateSubscription: async (data: any) => {\n return jsonRpc(`updateSubscription`, {\n ...data,\n id: -1,\n name: '内存订阅',\n version: 0,\n });\n },\n execSelector: async (data: {\n selector: string;\n action?: string;\n fastQuery?: boolean;\n }) => {\n data = structuredClone(data);\n data.action ||= undefined;\n return jsonRpc<{ message: string; action: string; result: boolean }>(\n `execSelector`,\n data,\n );\n },\n deleteSnapshot: async (data: Reqid) => {\n return jsonRpc<{ message: string }>(`deleteSnapshot`, data);\n },\n };\n return { origin, api, serverInfo, disconnect };\n};\n\nexport type DeviceApi = ReturnType<typeof useDeviceApi>['api'];\n","<script setup lang=\"ts\">\nimport { message } from '@/shared/services/feedback';\nimport { errorWrap } from '@/shared/services/error';\nimport { useTask } from '@/shared/lib/task';\nimport JSON5 from 'json5';\nimport type { DeviceApi } from './api';\nimport SelectorLibraryDialog from '@/features/selector-library/ui/SelectorLibraryDialog.vue';\n\nconst props = defineProps<{\n api: DeviceApi;\n selectorShow: boolean;\n subscriptionShow: boolean;\n}>();\n\nconst emit = defineEmits<{\n 'update:selectorShow': [show: boolean];\n 'update:subscriptionShow': [show: boolean];\n}>();\n\nconst subscriptionText = shallowRef(``);\nconst clickAction = shallowReactive({\n selector: ``,\n action: 'click',\n quickFind: false,\n});\nconst updateSubscriptionText = (value: string) => {\n subscriptionText.value = value;\n};\nconst updateSelector = (value: string) => {\n clickAction.selector = value;\n};\nconst updateQuickFind = (value: boolean) => {\n clickAction.quickFind = value;\n};\nconst updateAction = (value: string) => {\n clickAction.action = value;\n};\nconst selectorLibraryShow = shallowRef(false);\nconst openSelectorLibrary = () => {\n selectorLibraryShow.value = true;\n};\nconst setSelectorLibraryVisible = (show: boolean) => {\n selectorLibraryShow.value = show;\n};\nconst useLibrarySelector = (selector: string) => {\n updateSelector(selector);\n};\n\nconst actionOptions: { value?: string; label: string }[] = [\n { label: '仅查询', value: `` },\n { value: 'click', label: 'click' },\n { value: 'clickNode', label: 'clickNode' },\n { value: 'clickCenter', label: 'clickCenter' },\n { value: 'back', label: 'back' },\n { value: 'longClick', label: 'longClick' },\n { value: 'longClickNode', label: 'longClickNode' },\n { value: 'longClickCenter', label: 'longClickCenter' },\n];\n\nconst updateSubscription = useTask(async () => {\n const data = errorWrap(() => JSON5.parse(subscriptionText.value.trim()));\n if (!data) return;\n if (data.categories || data.globalGroups || data.apps) {\n await props.api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await props.api.updateSubscription({ apps: [data] });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await props.api.updateSubscription({ apps: data });\n } else if (typeof data.key == 'number') {\n await props.api.updateSubscription({ globalGroups: [data] });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await props.api.updateSubscription({ globalGroups: data });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n message.success(`修改成功`);\n});\n\nconst executeSelector = useTask(async () => {\n const result = await props.api.execSelector({\n ...clickAction,\n fastQuery: clickAction.quickFind,\n });\n if (result.message) {\n message.success(`操作成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `操作成功:` : `操作失败`) + result.action);\n } else if (result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst subscriptionPlaceholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\n</script>\n\n<template>\n <NModal\n :show=\"subscriptionShow\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n :maskClosable=\"false\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubscription.loading,\n onClick: updateSubscription.invoke,\n }\"\n @update:show=\"emit('update:subscriptionShow', $event)\"\n >\n <NInput\n :value=\"subscriptionText\"\n :disabled=\"updateSubscription.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{ minRows: 20, maxRows: 25 }\"\n :placeholder=\"subscriptionPlaceholder\"\n @update:value=\"updateSubscriptionText\"\n />\n </NModal>\n\n <NModal\n :show=\"selectorShow\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n :maskClosable=\"false\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: executeSelector.loading,\n onClick: executeSelector.invoke,\n }\"\n @update:show=\"emit('update:selectorShow', $event)\"\n >\n <NInput\n :value=\"clickAction.selector\"\n :disabled=\"executeSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{ minRows: 4, maxRows: 10 }\"\n placeholder=\"请输入合法的选择器\"\n @update:value=\"updateSelector\"\n />\n <div class=\"mt-8px flex justify-end\">\n <NButton secondary @click=\"openSelectorLibrary\">选择器库</NButton>\n </div>\n <div h-15px />\n <NSpace>\n <NCheckbox\n :checked=\"clickAction.quickFind\"\n @update:checked=\"updateQuickFind\"\n >\n 快速查找\n </NCheckbox>\n <a\n href=\"https://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px />\n <div flex gap-10px flex-items-center>\n <NSelect\n :value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n @update:value=\"updateAction\"\n />\n <a\n href=\"https://gkd.li/api/interfaces/RawRuleProps#action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <SelectorLibraryDialog\n :show=\"selectorLibraryShow\"\n @use=\"useLibrarySelector\"\n @update:show=\"setSelectorLibraryVisible\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { message } from '@/shared/services/feedback';\nimport { errorWrap } from '@/shared/services/error';\nimport { useTask } from '@/shared/lib/task';\nimport JSON5 from 'json5';\nimport type { DeviceApi } from './api';\nimport SelectorLibraryDialog from '@/features/selector-library/ui/SelectorLibraryDialog.vue';\n\nconst props = defineProps<{\n api: DeviceApi;\n selectorShow: boolean;\n subscriptionShow: boolean;\n}>();\n\nconst emit = defineEmits<{\n 'update:selectorShow': [show: boolean];\n 'update:subscriptionShow': [show: boolean];\n}>();\n\nconst subscriptionText = shallowRef(``);\nconst clickAction = shallowReactive({\n selector: ``,\n action: 'click',\n quickFind: false,\n});\nconst updateSubscriptionText = (value: string) => {\n subscriptionText.value = value;\n};\nconst updateSelector = (value: string) => {\n clickAction.selector = value;\n};\nconst updateQuickFind = (value: boolean) => {\n clickAction.quickFind = value;\n};\nconst updateAction = (value: string) => {\n clickAction.action = value;\n};\nconst selectorLibraryShow = shallowRef(false);\nconst openSelectorLibrary = () => {\n selectorLibraryShow.value = true;\n};\nconst setSelectorLibraryVisible = (show: boolean) => {\n selectorLibraryShow.value = show;\n};\nconst useLibrarySelector = (selector: string) => {\n updateSelector(selector);\n};\n\nconst actionOptions: { value?: string; label: string }[] = [\n { label: '仅查询', value: `` },\n { value: 'click', label: 'click' },\n { value: 'clickNode', label: 'clickNode' },\n { value: 'clickCenter', label: 'clickCenter' },\n { value: 'back', label: 'back' },\n { value: 'longClick', label: 'longClick' },\n { value: 'longClickNode', label: 'longClickNode' },\n { value: 'longClickCenter', label: 'longClickCenter' },\n];\n\nconst updateSubscription = useTask(async () => {\n const data = errorWrap(() => JSON5.parse(subscriptionText.value.trim()));\n if (!data) return;\n if (data.categories || data.globalGroups || data.apps) {\n await props.api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await props.api.updateSubscription({ apps: [data] });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await props.api.updateSubscription({ apps: data });\n } else if (typeof data.key == 'number') {\n await props.api.updateSubscription({ globalGroups: [data] });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await props.api.updateSubscription({ globalGroups: data });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n message.success(`修改成功`);\n});\n\nconst executeSelector = useTask(async () => {\n const result = await props.api.execSelector({\n ...clickAction,\n fastQuery: clickAction.quickFind,\n });\n if (result.message) {\n message.success(`操作成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `操作成功:` : `操作失败`) + result.action);\n } else if (result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst subscriptionPlaceholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\n</script>\n\n<template>\n <NModal\n :show=\"subscriptionShow\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n :maskClosable=\"false\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubscription.loading,\n onClick: updateSubscription.invoke,\n }\"\n @update:show=\"emit('update:subscriptionShow', $event)\"\n >\n <NInput\n :value=\"subscriptionText\"\n :disabled=\"updateSubscription.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{ minRows: 20, maxRows: 25 }\"\n :placeholder=\"subscriptionPlaceholder\"\n @update:value=\"updateSubscriptionText\"\n />\n </NModal>\n\n <NModal\n :show=\"selectorShow\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n :maskClosable=\"false\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: executeSelector.loading,\n onClick: executeSelector.invoke,\n }\"\n @update:show=\"emit('update:selectorShow', $event)\"\n >\n <NInput\n :value=\"clickAction.selector\"\n :disabled=\"executeSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{ minRows: 4, maxRows: 10 }\"\n placeholder=\"请输入合法的选择器\"\n @update:value=\"updateSelector\"\n />\n <div class=\"mt-8px flex justify-end\">\n <NButton secondary @click=\"openSelectorLibrary\">选择器库</NButton>\n </div>\n <div h-15px />\n <NSpace>\n <NCheckbox\n :checked=\"clickAction.quickFind\"\n @update:checked=\"updateQuickFind\"\n >\n 快速查找\n </NCheckbox>\n <a\n href=\"https://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px />\n <div flex gap-10px flex-items-center>\n <NSelect\n :value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n @update:value=\"updateAction\"\n />\n <a\n href=\"https://gkd.li/api/interfaces/RawRuleProps#action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <SelectorLibraryDialog\n :show=\"selectorLibraryShow\"\n @use=\"useLibrarySelector\"\n @update:show=\"setSelectorLibraryVisible\"\n />\n</template>\n","<script setup lang=\"tsx\">\nimport type { Snapshot } from '@/entities/snapshot/types';\n\nimport GkSvg from '@/shared/ui/GkSvg.vue';\nimport { useDeviceApi } from './api';\nimport { toValidURL } from '@/shared/lib/check';\nimport { message } from '@/shared/services/feedback';\nimport { errorWrap } from '@/shared/services/error';\nimport { delay } from '@/shared/lib/async';\nimport {\n screenshotStorage,\n snapshotStorage,\n} from '@/entities/snapshot/storage';\nimport { useSnapshotColumns } from '@/entities/snapshot/ui/useSnapshotColumns';\nimport { useBatchTask, useTask } from '@/shared/lib/task';\nimport type { DataTableColumns, PaginationProps } from 'naive-ui';\nimport type { RowKey, SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport SnapshotActionCard from '@/features/snapshot-management/ui/SnapshotActionCard.vue';\nimport SnapshotBatchActionsBar from '@/features/snapshot-management/ui/SnapshotBatchActionsBar.vue';\nimport { useBatchActions } from '@/features/snapshot-management/useBatchActions';\nimport DeviceActionDialogs from './DeviceActionDialogs.vue';\nimport PageBackButton from '@/features/navigation/PageBackButton.vue';\n\nconst router = useRouter();\nconst { api, origin, serverInfo, disconnect } = useDeviceApi();\nconst link = shallowRef(localStorage.getItem(`device_link`) || ``);\nconst snapshots = shallowRef<Snapshot[]>([]);\nlet connectionVersion = 0;\nconst updateLink = (value: string) => {\n link.value = value;\n};\nconst loadSnapshots = async (version = connectionVersion) => {\n const result = await api.getSnapshots();\n if (version != connectionVersion) return;\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n};\nconst connect = useTask(async () => {\n if (!link.value) return;\n const version = ++connectionVersion;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n localStorage.setItem(`device_link`, link.value);\n const result = await api.getServerInfo();\n if (version != connectionVersion) return;\n serverInfo.value = result;\n document.title = serverTitle.value;\n await loadSnapshots(version);\n});\n\nconst serverTitle = computed(() => {\n if (!serverInfo.value) return '未连接设备';\n const d = serverInfo.value.device;\n const g = serverInfo.value.gkdAppInfo;\n return `${d.manufacturer} Android${d.release} - GKD${g.versionName}`;\n});\n\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.getScreenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`捕获并保存快照成功`);\n await loadSnapshots();\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.getSnapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.getSnapshot({ id: snapshotId }),\n api.getScreenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n resetColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n const obj = await api.getSnapshot({ id: row.id });\n await snapshotStorage.setItem(row.id, obj);\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.getScreenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n {\n type: 'selection',\n },\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `160px`,\n render(row) {\n return (\n <SnapshotActionCard\n snapshot={row}\n showExport={false}\n showShare={false}\n deleteConfirmText={`是否确认删除? 此操作不可恢复!\\n快照ID:${row.id}`}\n onPreview={() => previewSnapshot.invoke(row)}\n previewLoading={previewSnapshot.loading[row.id]}\n onBeforeDelete={async () => await api.deleteSnapshot({ id: row.id })}\n onDelete={() => {\n snapshots.value = snapshots.value.filter((s) => s.id !== row.id);\n }}\n />\n );\n },\n },\n];\n\nconst checkedRowKeys = ref<number[]>([]);\nconst { batchDelete } = useBatchActions(checkedRowKeys, {\n beforeDeleteItem: async (id) => await api.deleteSnapshot({ id }),\n onAfterDelete: async () => {\n await loadSnapshots();\n },\n});\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n resetColWidth();\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n resetColWidth();\n },\n});\n\nconst showSubsModel = shallowRef(false);\nconst showSelectorModel = shallowRef(false);\nconst setSubscriptionDialogVisible = (show: boolean) => {\n showSubsModel.value = show;\n};\nconst setSelectorDialogVisible = (show: boolean) => {\n showSelectorModel.value = show;\n};\nconst updateCheckedRowKeys = (keys: RowKey[]) => {\n checkedRowKeys.value = keys.filter(\n (key): key is number => typeof key == 'number',\n );\n};\nconst stopConnection = () => {\n connectionVersion++;\n disconnect();\n snapshots.value = [];\n checkedRowKeys.value = [];\n setSubscriptionDialogVisible(false);\n setSelectorDialogVisible(false);\n document.title = '连接设备';\n};\n</script>\n<template>\n <DeviceActionDialogs\n :key=\"origin?.toString()\"\n :api=\"api\"\n :subscriptionShow=\"showSubsModel\"\n :selectorShow=\"showSelectorModel\"\n @update:subscriptionShow=\"setSubscriptionDialogVisible\"\n @update:selectorShow=\"setSelectorDialogVisible\"\n />\n <div page-size flex flex-col p-10px gap-10px>\n <div flex items-center gap-24px>\n <PageBackButton class=\"ml-12px\" />\n <NInputGroup>\n <NInput\n :value=\"link\"\n placeholder=\"请输入设备地址\"\n class=\"gkd_code\"\n :style=\"{ width: `240px` }\"\n @keyup.enter=\"connect.invoke\"\n @update:value=\"updateLink\"\n >\n <template #suffix>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 20px\"\n :loading=\"connect.loading\"\n @click=\"connect.invoke\"\n >\n <template #icon><GkSvg name=\"refresh\" /></template>\n </NButton>\n </template>\n 刷新连接\n </NTooltip>\n </template>\n </NInput>\n <NButton\n v-if=\"connect.loading\"\n secondary\n type=\"error\"\n @click=\"stopConnection\"\n >\n 停止\n </NButton>\n\n <div\n v-if=\"serverInfo\"\n gkd_code\n pl-16px\n whitespace-nowrap\n flex\n items-center\n >\n {{ serverTitle }}\n </div>\n </NInputGroup>\n <template v-if=\"serverInfo\">\n <SnapshotBatchActionsBar\n :checkedCount=\"checkedRowKeys.length\"\n :batchDelete=\"batchDelete\"\n />\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"captureSnapshot.loading\"\n @click=\"captureSnapshot.invoke\"\n >\n <template #icon><GkSvg name=\"Snapshot\" /></template>\n </NButton>\n </template>\n 捕获快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"downloadAllSnapshot.loading\"\n @click=\"downloadAllSnapshot.invoke\"\n >\n <template #icon><GkSvg name=\"Down-all\" /></template>\n </NButton>\n </template>\n 下载所有快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"setSubscriptionDialogVisible(true)\"\n >\n <template #icon><GkSvg name=\"CacheSub\" /></template>\n </NButton>\n </template>\n 修改内存订阅\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"setSelectorDialogVisible(true)\"\n >\n <template #icon><GkSvg name=\"Exe-Sel\" /></template>\n </NButton>\n </template>\n 执行选择器\n </NTooltip>\n </template>\n </div>\n <NDataTable\n :checkedRowKeys=\"checkedRowKeys\"\n striped\n flex-height\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n @update:checkedRowKeys=\"updateCheckedRowKeys\"\n @update:sorter=\"handleSorterChange\"\n />\n </div>\n</template>\n","<script setup lang=\"tsx\">\nimport type { Snapshot } from '@/entities/snapshot/types';\n\nimport GkSvg from '@/shared/ui/GkSvg.vue';\nimport { useDeviceApi } from './api';\nimport { toValidURL } from '@/shared/lib/check';\nimport { message } from '@/shared/services/feedback';\nimport { errorWrap } from '@/shared/services/error';\nimport { delay } from '@/shared/lib/async';\nimport {\n screenshotStorage,\n snapshotStorage,\n} from '@/entities/snapshot/storage';\nimport { useSnapshotColumns } from '@/entities/snapshot/ui/useSnapshotColumns';\nimport { useBatchTask, useTask } from '@/shared/lib/task';\nimport type { DataTableColumns, PaginationProps } from 'naive-ui';\nimport type { RowKey, SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport SnapshotActionCard from '@/features/snapshot-management/ui/SnapshotActionCard.vue';\nimport SnapshotBatchActionsBar from '@/features/snapshot-management/ui/SnapshotBatchActionsBar.vue';\nimport { useBatchActions } from '@/features/snapshot-management/useBatchActions';\nimport DeviceActionDialogs from './DeviceActionDialogs.vue';\nimport PageBackButton from '@/features/navigation/PageBackButton.vue';\n\nconst router = useRouter();\nconst { api, origin, serverInfo, disconnect } = useDeviceApi();\nconst link = shallowRef(localStorage.getItem(`device_link`) || ``);\nconst snapshots = shallowRef<Snapshot[]>([]);\nlet connectionVersion = 0;\nconst updateLink = (value: string) => {\n link.value = value;\n};\nconst loadSnapshots = async (version = connectionVersion) => {\n const result = await api.getSnapshots();\n if (version != connectionVersion) return;\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n};\nconst connect = useTask(async () => {\n if (!link.value) return;\n const version = ++connectionVersion;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n localStorage.setItem(`device_link`, link.value);\n const result = await api.getServerInfo();\n if (version != connectionVersion) return;\n serverInfo.value = result;\n document.title = serverTitle.value;\n await loadSnapshots(version);\n});\n\nconst serverTitle = computed(() => {\n if (!serverInfo.value) return '未连接设备';\n const d = serverInfo.value.device;\n const g = serverInfo.value.gkdAppInfo;\n return `${d.manufacturer} Android${d.release} - GKD${g.versionName}`;\n});\n\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.getScreenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`捕获并保存快照成功`);\n await loadSnapshots();\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.getSnapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.getSnapshot({ id: snapshotId }),\n api.getScreenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n resetColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n const obj = await api.getSnapshot({ id: row.id });\n await snapshotStorage.setItem(row.id, obj);\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.getScreenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n {\n type: 'selection',\n },\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `160px`,\n render(row) {\n return (\n <SnapshotActionCard\n snapshot={row}\n showExport={false}\n showShare={false}\n deleteConfirmText={`是否确认删除? 此操作不可恢复!\\n快照ID:${row.id}`}\n onPreview={() => previewSnapshot.invoke(row)}\n previewLoading={previewSnapshot.loading[row.id]}\n onBeforeDelete={async () => await api.deleteSnapshot({ id: row.id })}\n onDelete={() => {\n snapshots.value = snapshots.value.filter((s) => s.id !== row.id);\n }}\n />\n );\n },\n },\n];\n\nconst checkedRowKeys = ref<number[]>([]);\nconst { batchDelete } = useBatchActions(checkedRowKeys, {\n beforeDeleteItem: async (id) => await api.deleteSnapshot({ id }),\n onAfterDelete: async () => {\n await loadSnapshots();\n },\n});\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n resetColWidth();\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n resetColWidth();\n },\n});\n\nconst showSubsModel = shallowRef(false);\nconst showSelectorModel = shallowRef(false);\nconst setSubscriptionDialogVisible = (show: boolean) => {\n showSubsModel.value = show;\n};\nconst setSelectorDialogVisible = (show: boolean) => {\n showSelectorModel.value = show;\n};\nconst updateCheckedRowKeys = (keys: RowKey[]) => {\n checkedRowKeys.value = keys.filter(\n (key): key is number => typeof key == 'number',\n );\n};\nconst stopConnection = () => {\n connectionVersion++;\n disconnect();\n snapshots.value = [];\n checkedRowKeys.value = [];\n setSubscriptionDialogVisible(false);\n setSelectorDialogVisible(false);\n document.title = '连接设备';\n};\n</script>\n<template>\n <DeviceActionDialogs\n :key=\"origin?.toString()\"\n :api=\"api\"\n :subscriptionShow=\"showSubsModel\"\n :selectorShow=\"showSelectorModel\"\n @update:subscriptionShow=\"setSubscriptionDialogVisible\"\n @update:selectorShow=\"setSelectorDialogVisible\"\n />\n <div page-size flex flex-col p-10px gap-10px>\n <div flex items-center gap-24px>\n <PageBackButton class=\"ml-12px\" />\n <NInputGroup>\n <NInput\n :value=\"link\"\n placeholder=\"请输入设备地址\"\n class=\"gkd_code\"\n :style=\"{ width: `240px` }\"\n @keyup.enter=\"connect.invoke\"\n @update:value=\"updateLink\"\n >\n <template #suffix>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 20px\"\n :loading=\"connect.loading\"\n @click=\"connect.invoke\"\n >\n <template #icon><GkSvg name=\"refresh\" /></template>\n </NButton>\n </template>\n 刷新连接\n </NTooltip>\n </template>\n </NInput>\n <NButton\n v-if=\"connect.loading\"\n secondary\n type=\"error\"\n @click=\"stopConnection\"\n >\n 停止\n </NButton>\n\n <div\n v-if=\"serverInfo\"\n gkd_code\n pl-16px\n whitespace-nowrap\n flex\n items-center\n >\n {{ serverTitle }}\n </div>\n </NInputGroup>\n <template v-if=\"serverInfo\">\n <SnapshotBatchActionsBar\n :checkedCount=\"checkedRowKeys.length\"\n :batchDelete=\"batchDelete\"\n />\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"captureSnapshot.loading\"\n @click=\"captureSnapshot.invoke\"\n >\n <template #icon><GkSvg name=\"Snapshot\" /></template>\n </NButton>\n </template>\n 捕获快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"downloadAllSnapshot.loading\"\n @click=\"downloadAllSnapshot.invoke\"\n >\n <template #icon><GkSvg name=\"Down-all\" /></template>\n </NButton>\n </template>\n 下载所有快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"setSubscriptionDialogVisible(true)\"\n >\n <template #icon><GkSvg name=\"CacheSub\" /></template>\n </NButton>\n </template>\n 修改内存订阅\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"setSelectorDialogVisible(true)\"\n >\n <template #icon><GkSvg name=\"Exe-Sel\" /></template>\n </NButton>\n </template>\n 执行选择器\n </NTooltip>\n </template>\n </div>\n <NDataTable\n :checkedRowKeys=\"checkedRowKeys\"\n striped\n flex-height\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n @update:checkedRowKeys=\"updateCheckedRowKeys\"\n @update:sorter=\"handleSorterChange\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport DeviceControlView from '@/features/device-control/DeviceControlView.vue';\n</script>\n\n<template>\n <DeviceControlView />\n</template>\n","<script setup lang=\"ts\">\nimport DeviceControlView from '@/features/device-control/DeviceControlView.vue';\n</script>\n\n<template>\n <DeviceControlView />\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{t as e}from"./chunk-62oNxeRG.js";import{$ as t,$t as n,F as r,G as i,N as a,W as o,Xt as s,Z as c,Zt as l,at as u,h as d,tt as f,wt as p,x as m}from"./dist-DSKcjXAK.js";import{n as h,r as g}from"./Tooltip-BAJeKww5.js";import{C as _,I as v,it as y,l as b,lt as x,v as S,x as C}from"./runtime-core.esm-bundler-ChiMl8Ql.js";import{k as w,w as T}from"./light-C0aZgUPN.js";import{a as E}from"./GkSvg-Dkvlr88l.js";import{a as D,r as O}from"./feedback-BCD3yAcw.js";import{t as k}from"./light-4onLjMnA.js";import{n as A}from"./async-DuglrXBM.js";var j=p(`n-popconfirm`),M={positiveText:String,negativeText:String,showIcon:{type:Boolean,default:!0},onPositiveClick:{type:Function,required:!0},onNegativeClick:{type:Function,required:!0}},N=w(M),P=S({name:`NPopconfirmPanel`,props:M,setup(e){let{localeRef:t}=E(`Popconfirm`),{inlineThemeDisabled:n}=i(),{mergedClsPrefixRef:r,mergedThemeRef:a,props:s}=_(j),c=b(()=>{let{common:{cubicBezierEaseInOut:e},self:{fontSize:t,iconSize:n,iconColor:r}}=a.value;return{"--n-bezier":e,"--n-font-size":t,"--n-icon-size":n,"--n-icon-color":r}}),l=n?o(`popconfirm-panel`,void 0,c,s):void 0;return Object.assign(Object.assign({},E(`Popconfirm`)),{mergedClsPrefix:r,cssVars:n?void 0:c,localizedPositiveText:b(()=>e.positiveText||t.value.positiveText),localizedNegativeText:b(()=>e.negativeText||t.value.negativeText),positiveButtonProps:x(s,`positiveButtonProps`),negativeButtonProps:x(s,`negativeButtonProps`),handlePositiveClick(t){e.onPositiveClick(t)},handleNegativeClick(t){e.onNegativeClick(t)},themeClass:l?.themeClass,onRender:l?.onRender})},render(){var e;let{mergedClsPrefix:n,showIcon:r,$slots:i}=this,o=c(i.action,()=>this.negativeText===null&&this.positiveText===null?[]:[this.negativeText!==null&&C(d,Object.assign({size:`small`,onClick:this.handleNegativeClick},this.negativeButtonProps),{default:()=>this.localizedNegativeText}),this.positiveText!==null&&C(d,Object.assign({size:`small`,type:`primary`,onClick:this.handlePositiveClick},this.positiveButtonProps),{default:()=>this.localizedPositiveText})]);return(e=this.onRender)==null||e.call(this),C(`div`,{class:[`${n}-popconfirm__panel`,this.themeClass],style:this.cssVars},t(i.default,e=>r||e?C(`div`,{class:`${n}-popconfirm__body`},r?C(`div`,{class:`${n}-popconfirm__icon`},c(i.icon,()=>[C(a,{clsPrefix:n},{default:()=>C(T,null)})])):null,e):null),o?C(`div`,{class:[`${n}-popconfirm__action`]},o):null)}}),F=l(`popconfirm`,[n(`body`,`
|
|
2
|
+
font-size: var(--n-font-size);
|
|
3
|
+
display: flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
flex-wrap: nowrap;
|
|
6
|
+
position: relative;
|
|
7
|
+
`,[n(`icon`,`
|
|
8
|
+
display: flex;
|
|
9
|
+
font-size: var(--n-icon-size);
|
|
10
|
+
color: var(--n-icon-color);
|
|
11
|
+
transition: color .3s var(--n-bezier);
|
|
12
|
+
margin: 0 8px 0 0;
|
|
13
|
+
`)]),n(`action`,`
|
|
14
|
+
display: flex;
|
|
15
|
+
justify-content: flex-end;
|
|
16
|
+
`,[s(`&:not(:first-child)`,`margin-top: 8px`),l(`button`,[s(`&:not(:last-child)`,`margin-right: 8px;`)])])]),I=S({name:`Popconfirm`,props:Object.assign(Object.assign(Object.assign({},r.props),g),{positiveText:String,negativeText:String,showIcon:{type:Boolean,default:!0},trigger:{type:String,default:`click`},positiveButtonProps:Object,negativeButtonProps:Object,onPositiveClick:Function,onNegativeClick:Function}),slots:Object,__popover__:!0,setup(e){let{mergedClsPrefixRef:t}=i(),n=r(`Popconfirm`,`-popconfirm`,F,k,e,t),a=y(null);function o(t){if(!a.value?.getMergedShow())return;let{onPositiveClick:n,"onUpdate:show":r}=e;Promise.resolve(n?n(t):!0).then(e=>{var t;e!==!1&&((t=a.value)==null||t.setShow(!1),r&&u(r,!1))})}function s(t){if(!a.value?.getMergedShow())return;let{onNegativeClick:n,"onUpdate:show":r}=e;Promise.resolve(n?n(t):!0).then(e=>{var t;e!==!1&&((t=a.value)==null||t.setShow(!1),r&&u(r,!1))})}return v(j,{mergedThemeRef:n,mergedClsPrefixRef:t,props:e}),{setShow(e){var t;(t=a.value)==null||t.setShow(e)},syncPosition(){var e;(e=a.value)==null||e.syncPosition()},mergedTheme:n,popoverInstRef:a,handlePositiveClick:o,handleNegativeClick:s}},render(){let{$slots:e,$props:t,mergedTheme:n}=this;return C(h,Object.assign({},D(t,N),{theme:n.peers.Popover,themeOverrides:n.peerOverrides.Popover,internalExtraClass:[`popconfirm`],ref:`popoverInstRef`}),{trigger:e.trigger,default:()=>{let n=f(t,N);return C(P,Object.assign({},n,{onPositiveClick:this.handlePositiveClick,onNegativeClick:this.handleNegativeClick}),e)}})}}),L=S({name:`Scrollbar`,props:Object.assign(Object.assign({},r.props),{trigger:String,xScrollable:Boolean,onScroll:Function,contentClass:String,contentStyle:[Object,String],size:Number,yPlacement:{type:String,default:`right`},xPlacement:{type:String,default:`bottom`}}),setup(){let e=y(null);return Object.assign(Object.assign({},{scrollTo:(...t)=>{var n;(n=e.value)==null||n.scrollTo(t[0],t[1])},scrollBy:(...t)=>{var n;(n=e.value)==null||n.scrollBy(t[0],t[1])}}),{scrollbarInstRef:e})},render(){return C(m,Object.assign({ref:`scrollbarInstRef`},this.$props),this.$slots)}}),R=(()=>{let e;return async t=>{if(!(!t||e===t)){e=t,A(1e4).then(()=>{e=void 0});try{await navigator.clipboard.writeText(t),O.success(`复制成功`)}catch{O.error(`复制失败`)}}}})(),z=e(((e,t)=>{(function(t,n){typeof define==`function`&&define.amd?define([],n):e===void 0?(n(),t.FileSaver={exports:{}}.exports):n()})(e,function(){function e(e,t){return t===void 0?t={autoBom:!1}:typeof t!=`object`&&(console.warn(`Deprecated: Expected third argument to be a object`),t={autoBom:!t}),t.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([``,e],{type:e.type}):e}function n(e,t,n){var r=new XMLHttpRequest;r.open(`GET`,e),r.responseType=`blob`,r.onload=function(){s(r.response,t,n)},r.onerror=function(){console.error(`could not download file`)},r.send()}function r(e){var t=new XMLHttpRequest;t.open(`HEAD`,e,!1);try{t.send()}catch{}return 200<=t.status&&299>=t.status}function i(e){try{e.dispatchEvent(new MouseEvent(`click`))}catch{var t=document.createEvent(`MouseEvents`);t.initMouseEvent(`click`,!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(t)}}var a=typeof window==`object`&&window.window===window?window:typeof self==`object`&&self.self===self?self:typeof global==`object`&&global.global===global?global:void 0,o=a.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),s=a.saveAs||(typeof window!=`object`||window!==a?function(){}:`download`in HTMLAnchorElement.prototype&&!o?function(e,t,o){var s=a.URL||a.webkitURL,c=document.createElement(`a`);t=t||e.name||`download`,c.download=t,c.rel=`noopener`,typeof e==`string`?(c.href=e,c.origin===location.origin?i(c):r(c.href)?n(e,t,o):i(c,c.target=`_blank`)):(c.href=s.createObjectURL(e),setTimeout(function(){s.revokeObjectURL(c.href)},4e4),setTimeout(function(){i(c)},0))}:`msSaveOrOpenBlob`in navigator?function(t,a,o){if(a=a||t.name||`download`,typeof t!=`string`)navigator.msSaveOrOpenBlob(e(t,o),a);else if(r(t))n(t,a,o);else{var s=document.createElement(`a`);s.href=t,s.target=`_blank`,setTimeout(function(){i(s)})}}:function(e,t,r,i){if(i||=open(``,`_blank`),i&&(i.document.title=i.document.body.innerText=`downloading...`),typeof e==`string`)return n(e,t,r);var s=e.type===`application/octet-stream`,c=/constructor/i.test(a.HTMLElement)||a.safari,l=/CriOS\/[\d]+/.test(navigator.userAgent);if((l||s&&c||o)&&typeof FileReader<`u`){var u=new FileReader;u.onloadend=function(){var e=u.result;e=l?e:e.replace(/^data:[^;]*;/,`data:attachment/file;`),i?i.location.href=e:location=e,i=null},u.readAsDataURL(e)}else{var d=a.URL||a.webkitURL,f=d.createObjectURL(e);i?i.location=f:location.href=f,i=null,setTimeout(function(){d.revokeObjectURL(f)},4e4)}});a.saveAs=s.saveAs=s,t!==void 0&&(t.exports=s)})}));export{I as i,R as n,L as r,z as t};
|
|
17
|
+
//# sourceMappingURL=FileSaver.min-fk8nTGM3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSaver.min-fk8nTGM3.js","names":["NButton","NBaseIcon","WarningIcon","style","NPopover","PopconfirmPanel","NScrollbar"],"sources":["../../node_modules/.pnpm/naive-ui@2.44.1_vue@3.5.34_typescript@6.0.3_/node_modules/naive-ui/es/popconfirm/src/interface.mjs","../../node_modules/.pnpm/naive-ui@2.44.1_vue@3.5.34_typescript@6.0.3_/node_modules/naive-ui/es/popconfirm/src/PopconfirmPanel.mjs","../../node_modules/.pnpm/naive-ui@2.44.1_vue@3.5.34_typescript@6.0.3_/node_modules/naive-ui/es/popconfirm/src/styles/index.cssr.mjs","../../node_modules/.pnpm/naive-ui@2.44.1_vue@3.5.34_typescript@6.0.3_/node_modules/naive-ui/es/popconfirm/src/Popconfirm.mjs","../../node_modules/.pnpm/naive-ui@2.44.1_vue@3.5.34_typescript@6.0.3_/node_modules/naive-ui/es/scrollbar/src/Scrollbar.mjs","../../src/shared/lib/clipboard.ts","../../node_modules/.pnpm/file-saver@2.0.5/node_modules/file-saver/dist/FileSaver.min.js"],"sourcesContent":["import { createInjectionKey } from \"../../_utils/index.mjs\";\nexport const popconfirmInjectionKey = createInjectionKey('n-popconfirm');","import { computed, defineComponent, h, inject, toRef } from 'vue';\nimport { NBaseIcon } from \"../../_internal/index.mjs\";\nimport { WarningIcon } from \"../../_internal/icons/index.mjs\";\nimport { useConfig, useLocale, useThemeClass } from \"../../_mixins/index.mjs\";\nimport { keysOf, resolveSlot, resolveWrappedSlot } from \"../../_utils/index.mjs\";\nimport { NButton } from \"../../button/index.mjs\";\nimport { popconfirmInjectionKey } from \"./interface.mjs\";\nexport const panelProps = {\n positiveText: String,\n negativeText: String,\n showIcon: {\n type: Boolean,\n default: true\n },\n onPositiveClick: {\n type: Function,\n required: true\n },\n onNegativeClick: {\n type: Function,\n required: true\n }\n};\nexport const panelPropKeys = keysOf(panelProps);\nexport default defineComponent({\n name: 'NPopconfirmPanel',\n props: panelProps,\n setup(props) {\n const {\n localeRef\n } = useLocale('Popconfirm');\n const {\n inlineThemeDisabled\n } = useConfig();\n const {\n mergedClsPrefixRef,\n mergedThemeRef,\n props: popconfirmProps\n } = inject(popconfirmInjectionKey);\n const cssVarsRef = computed(() => {\n const {\n common: {\n cubicBezierEaseInOut\n },\n self: {\n fontSize,\n iconSize,\n iconColor\n }\n } = mergedThemeRef.value;\n return {\n '--n-bezier': cubicBezierEaseInOut,\n '--n-font-size': fontSize,\n '--n-icon-size': iconSize,\n '--n-icon-color': iconColor\n };\n });\n const themeClassHandle = inlineThemeDisabled ? useThemeClass('popconfirm-panel', undefined, cssVarsRef, popconfirmProps) : undefined;\n return Object.assign(Object.assign({}, useLocale('Popconfirm')), {\n mergedClsPrefix: mergedClsPrefixRef,\n cssVars: inlineThemeDisabled ? undefined : cssVarsRef,\n localizedPositiveText: computed(() => {\n return props.positiveText || localeRef.value.positiveText;\n }),\n localizedNegativeText: computed(() => {\n return props.negativeText || localeRef.value.negativeText;\n }),\n positiveButtonProps: toRef(popconfirmProps, 'positiveButtonProps'),\n negativeButtonProps: toRef(popconfirmProps, 'negativeButtonProps'),\n handlePositiveClick(e) {\n props.onPositiveClick(e);\n },\n handleNegativeClick(e) {\n props.onNegativeClick(e);\n },\n themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass,\n onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender\n });\n },\n render() {\n var _a;\n const {\n mergedClsPrefix,\n showIcon,\n $slots\n } = this;\n const actionContentNode = resolveSlot($slots.action, () => this.negativeText === null && this.positiveText === null ? [] : [this.negativeText !== null && h(NButton, Object.assign({\n size: \"small\",\n onClick: this.handleNegativeClick\n }, this.negativeButtonProps), {\n default: () => this.localizedNegativeText\n }), this.positiveText !== null && h(NButton, Object.assign({\n size: \"small\",\n type: \"primary\",\n onClick: this.handlePositiveClick\n }, this.positiveButtonProps), {\n default: () => this.localizedPositiveText\n })]);\n (_a = this.onRender) === null || _a === void 0 ? void 0 : _a.call(this);\n return h(\"div\", {\n class: [`${mergedClsPrefix}-popconfirm__panel`, this.themeClass],\n style: this.cssVars\n }, resolveWrappedSlot($slots.default, children => showIcon || children ? h(\"div\", {\n class: `${mergedClsPrefix}-popconfirm__body`\n }, showIcon ? h(\"div\", {\n class: `${mergedClsPrefix}-popconfirm__icon`\n }, resolveSlot($slots.icon, () => [h(NBaseIcon, {\n clsPrefix: mergedClsPrefix\n }, {\n default: () => h(WarningIcon, null)\n })])) : null, children) : null), actionContentNode ? h(\"div\", {\n class: [`${mergedClsPrefix}-popconfirm__action`]\n }, actionContentNode) : null);\n }\n});","import { c, cB, cE } from \"../../../_utils/cssr/index.mjs\";\n// vars:\n// --n-font-size\n// --n-icon-size\n// --n-bezier\n// --n-icon-color\nexport default cB('popconfirm', [cE('body', `\n font-size: var(--n-font-size);\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n position: relative;\n `, [cE('icon', `\n display: flex;\n font-size: var(--n-icon-size);\n color: var(--n-icon-color);\n transition: color .3s var(--n-bezier);\n margin: 0 8px 0 0;\n `)]), cE('action', `\n display: flex;\n justify-content: flex-end;\n `, [c('&:not(:first-child)', 'margin-top: 8px'), cB('button', [c('&:not(:last-child)', 'margin-right: 8px;')])])]);","import { defineComponent, h, provide, ref } from 'vue';\nimport { useConfig, useTheme } from \"../../_mixins/index.mjs\";\nimport { call, keep, omit } from \"../../_utils/index.mjs\";\nimport { NPopover } from \"../../popover/index.mjs\";\nimport { popoverBaseProps } from \"../../popover/src/Popover.mjs\";\nimport { popconfirmLight } from \"../styles/index.mjs\";\nimport { popconfirmInjectionKey } from \"./interface.mjs\";\nimport PopconfirmPanel, { panelPropKeys } from \"./PopconfirmPanel.mjs\";\nimport style from \"./styles/index.cssr.mjs\";\nexport const popconfirmProps = Object.assign(Object.assign(Object.assign({}, useTheme.props), popoverBaseProps), {\n positiveText: String,\n negativeText: String,\n showIcon: {\n type: Boolean,\n default: true\n },\n trigger: {\n type: String,\n default: 'click'\n },\n positiveButtonProps: Object,\n negativeButtonProps: Object,\n onPositiveClick: Function,\n onNegativeClick: Function\n});\nexport default defineComponent({\n name: 'Popconfirm',\n props: popconfirmProps,\n slots: Object,\n __popover__: true,\n setup(props) {\n const {\n mergedClsPrefixRef\n } = useConfig();\n const themeRef = useTheme('Popconfirm', '-popconfirm', style, popconfirmLight, props, mergedClsPrefixRef);\n const popoverInstRef = ref(null);\n function handlePositiveClick(e) {\n var _a;\n if (!((_a = popoverInstRef.value) === null || _a === void 0 ? void 0 : _a.getMergedShow())) return;\n const {\n onPositiveClick,\n 'onUpdate:show': onUpdateShow\n } = props;\n void Promise.resolve(onPositiveClick ? onPositiveClick(e) : true).then(value => {\n var _a;\n if (value === false) return;\n (_a = popoverInstRef.value) === null || _a === void 0 ? void 0 : _a.setShow(false);\n if (onUpdateShow) call(onUpdateShow, false);\n });\n }\n function handleNegativeClick(e) {\n var _a;\n if (!((_a = popoverInstRef.value) === null || _a === void 0 ? void 0 : _a.getMergedShow())) return;\n const {\n onNegativeClick,\n 'onUpdate:show': onUpdateShow\n } = props;\n void Promise.resolve(onNegativeClick ? onNegativeClick(e) : true).then(value => {\n var _a;\n if (value === false) return;\n (_a = popoverInstRef.value) === null || _a === void 0 ? void 0 : _a.setShow(false);\n if (onUpdateShow) call(onUpdateShow, false);\n });\n }\n provide(popconfirmInjectionKey, {\n mergedThemeRef: themeRef,\n mergedClsPrefixRef,\n props\n });\n const returned = {\n setShow(value) {\n var _a;\n (_a = popoverInstRef.value) === null || _a === void 0 ? void 0 : _a.setShow(value);\n },\n syncPosition() {\n var _a;\n (_a = popoverInstRef.value) === null || _a === void 0 ? void 0 : _a.syncPosition();\n },\n mergedTheme: themeRef,\n popoverInstRef,\n handlePositiveClick,\n handleNegativeClick\n };\n return returned;\n },\n render() {\n const {\n $slots: slots,\n $props: props,\n mergedTheme\n } = this;\n return h(NPopover, Object.assign({}, omit(props, panelPropKeys), {\n theme: mergedTheme.peers.Popover,\n themeOverrides: mergedTheme.peerOverrides.Popover,\n internalExtraClass: ['popconfirm'],\n ref: \"popoverInstRef\"\n }), {\n trigger: slots.trigger,\n default: () => {\n const panelProps = keep(props, panelPropKeys);\n return h(PopconfirmPanel, Object.assign({}, panelProps, {\n onPositiveClick: this.handlePositiveClick,\n onNegativeClick: this.handleNegativeClick\n }), slots);\n }\n });\n }\n});","import { defineComponent, h, ref } from 'vue';\nimport { NScrollbar } from \"../../_internal/index.mjs\";\nimport { useTheme } from \"../../_mixins/index.mjs\";\nexport const scrollbarProps = Object.assign(Object.assign({}, useTheme.props), {\n trigger: String,\n xScrollable: Boolean,\n onScroll: Function,\n contentClass: String,\n contentStyle: [Object, String],\n size: Number,\n yPlacement: {\n type: String,\n default: 'right'\n },\n xPlacement: {\n type: String,\n default: 'bottom'\n }\n});\nconst Scrollbar = defineComponent({\n name: 'Scrollbar',\n props: scrollbarProps,\n setup() {\n const scrollbarInstRef = ref(null);\n const exposedMethods = {\n scrollTo: (...args) => {\n var _a;\n (_a = scrollbarInstRef.value) === null || _a === void 0 ? void 0 : _a.scrollTo(args[0], args[1]);\n },\n scrollBy: (...args) => {\n var _a;\n (_a = scrollbarInstRef.value) === null || _a === void 0 ? void 0 : _a.scrollBy(args[0], args[1]);\n }\n };\n return Object.assign(Object.assign({}, exposedMethods), {\n scrollbarInstRef\n });\n },\n render() {\n return h(NScrollbar, Object.assign({\n ref: \"scrollbarInstRef\"\n }, this.$props), this.$slots);\n }\n});\nexport default Scrollbar;","import { message } from '@/shared/services/feedback';\nimport { delay } from './async';\n\nexport const copy = (() => {\n let lastText: string | undefined;\n return async (text?: string) => {\n if (!text || lastText === text) return;\n lastText = text;\n void delay(10_000).then(() => {\n lastText = undefined;\n });\n try {\n await navigator.clipboard.writeText(text);\n message.success('复制成功');\n } catch {\n message.error('复制失败');\n }\n };\n})();\n","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map"],"x_google_ignoreList":[0,1,2,3,4,6],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.GkSvg{height:var(--svg-h,1em);display:block;overflow:hidden}.GkSvg:not([fill]){fill:currentColor}
|