@inpageedit/core 0.11.1 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ActionButton-CRjo_l3y.js +24 -0
- package/dist/ActionButton-CRjo_l3y.js.map +1 -0
- package/dist/{IconQuickEdit-CAL1HXIb.js → IconQuickEdit-CMCQncyj.js} +2 -2
- package/dist/{IconQuickEdit-CAL1HXIb.js.map → IconQuickEdit-CMCQncyj.js.map} +1 -1
- package/dist/InPageEdit.d.ts +5 -1
- package/dist/InputBox-nQKtiWtZ.js +30 -0
- package/dist/InputBox-nQKtiWtZ.js.map +1 -0
- package/dist/PluginPrefSync-Ziogy_o-.js +339 -0
- package/dist/PluginPrefSync-Ziogy_o-.js.map +1 -0
- package/dist/PluginStoreApp-Bnvyl-Oc.js +452 -0
- package/dist/PluginStoreApp-Bnvyl-Oc.js.map +1 -0
- package/dist/{RadioBox-nJqWsxW2.js → RadioBox-0UuxlcWZ.js} +2 -2
- package/dist/{RadioBox-nJqWsxW2.js.map → RadioBox-0UuxlcWZ.js.map} +1 -1
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +10 -0
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js.map +1 -0
- package/dist/components/index.js +50 -69
- package/dist/components/index.js.map +1 -1
- package/dist/constants/endpoints.d.ts +2 -1
- package/dist/{index-CfgnJ51A.js → index-B3FUDhxl.js} +53 -43
- package/dist/index-B3FUDhxl.js.map +1 -0
- package/dist/index-B3YJdjxo.js +361 -0
- package/dist/index-B3YJdjxo.js.map +1 -0
- package/dist/{index-BNDyaWnI.js → index-BRjEc8b8.js} +10 -9
- package/dist/index-BRjEc8b8.js.map +1 -0
- package/dist/index-Bd70aDMT.js +172 -0
- package/dist/index-Bd70aDMT.js.map +1 -0
- package/dist/index-BvuaLEFc.js +179 -0
- package/dist/index-BvuaLEFc.js.map +1 -0
- package/dist/{index-lZkYoUca.js → index-CG38LlAh.js} +2 -2
- package/dist/{index-lZkYoUca.js.map → index-CG38LlAh.js.map} +1 -1
- package/dist/{index-CvhkVj_L.js → index-CM_6yF2v.js} +3 -3
- package/dist/{index-CvhkVj_L.js.map → index-CM_6yF2v.js.map} +1 -1
- package/dist/{index-etJXONAj.js → index-Ccr3YhkP.js} +6 -6
- package/dist/index-Ccr3YhkP.js.map +1 -0
- package/dist/{index-U2RPZk8N.js → index-D5zX93bn.js} +43 -44
- package/dist/index-D5zX93bn.js.map +1 -0
- package/dist/{index-Bh70Udzi.js → index-DD5CVCfD.js} +2 -2
- package/dist/{index-Bh70Udzi.js.map → index-DD5CVCfD.js.map} +1 -1
- package/dist/{index-BUI2IX49.js → index-DgQNTfPR.js} +2314 -2316
- package/dist/index-DgQNTfPR.js.map +1 -0
- package/dist/{index-BQzuJxBO.js → index-Dnmv-xDn.js} +4 -4
- package/dist/index-Dnmv-xDn.js.map +1 -0
- package/dist/index-eARjMi7f.js +1168 -0
- package/dist/index-eARjMi7f.js.map +1 -0
- package/dist/{index-D5J7RU5I.js → index-zHTGCjfF.js} +5 -7
- package/dist/index-zHTGCjfF.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/models/MemoryStorage.d.ts +10 -0
- package/dist/models/WikiPage/index.d.ts +19 -1
- package/dist/plugins/in-article-links/index.d.ts +5 -0
- package/dist/plugins/plugin-store/index.d.ts +56 -0
- package/dist/plugins/plugin-store/schema.d.ts +41 -0
- package/dist/plugins/preferences-ui/PluginPrefSync.d.ts +1 -0
- package/dist/plugins/preferences-ui/index.d.ts +34 -5
- package/dist/plugins/quick-diff/index.d.ts +3 -0
- package/dist/plugins/quick-edit/index.d.ts +8 -0
- package/dist/plugins/quick-move/index.d.ts +5 -3
- package/dist/plugins/quick-preview/index.d.ts +4 -0
- package/dist/plugins/quick-redirect/index.d.ts +11 -4
- package/dist/plugins/toolbox/index.d.ts +3 -0
- package/dist/services/PreferencesService.d.ts +53 -11
- package/dist/services/ResourceLoaderService.d.ts +3 -0
- package/dist/services/WikiMetadataService.d.ts +1 -1
- package/dist/services/storage/index.d.ts +18 -8
- package/dist/services/storage/{IPEStorageManager.d.ts → managers/IDBStorageManager.d.ts} +9 -6
- package/dist/services/storage/managers/LocalStorageManager.d.ts +27 -0
- package/dist/style.css +1 -1
- package/dist/vueHooks-l04s8cIl.js +4064 -0
- package/dist/vueHooks-l04s8cIl.js.map +1 -0
- package/lib/index.umd.js +12 -112
- package/lib/index.umd.js.map +1 -1
- package/lib/style.css +1 -1
- package/package.json +14 -14
- package/dist/CheckBox-D3rHnX7I.js +0 -13
- package/dist/CheckBox-D3rHnX7I.js.map +0 -1
- package/dist/InputBox-BV4m05Xs.js +0 -22
- package/dist/InputBox-BV4m05Xs.js.map +0 -1
- package/dist/PluginPrefSync-COidewzp.js +0 -258
- package/dist/PluginPrefSync-COidewzp.js.map +0 -1
- package/dist/index-BNDyaWnI.js.map +0 -1
- package/dist/index-BQzuJxBO.js.map +0 -1
- package/dist/index-BUI2IX49.js.map +0 -1
- package/dist/index-CBszdxJJ.js +0 -159
- package/dist/index-CBszdxJJ.js.map +0 -1
- package/dist/index-CfgnJ51A.js.map +0 -1
- package/dist/index-Cx4qgCJK.js +0 -4914
- package/dist/index-Cx4qgCJK.js.map +0 -1
- package/dist/index-D5J7RU5I.js.map +0 -1
- package/dist/index-MhNAv9Vf.js +0 -302
- package/dist/index-MhNAv9Vf.js.map +0 -1
- package/dist/index-U2RPZk8N.js.map +0 -1
- package/dist/index-VnRKIVau.js +0 -167
- package/dist/index-VnRKIVau.js.map +0 -1
- package/dist/index-etJXONAj.js.map +0 -1
- package/dist/plugins/quick-delete/index.d.ts +0 -52
package/dist/components/index.js
CHANGED
|
@@ -1,98 +1,79 @@
|
|
|
1
|
-
import { M as
|
|
2
|
-
import { j as
|
|
3
|
-
import { P as
|
|
4
|
-
import { T } from "../index-
|
|
5
|
-
import {
|
|
6
|
-
import { I as
|
|
7
|
-
import { R as
|
|
8
|
-
const
|
|
9
|
-
tabview:
|
|
10
|
-
labels_container:
|
|
11
|
-
label:
|
|
12
|
-
active:
|
|
13
|
-
contents_container:
|
|
1
|
+
import { M as y } from "../index-CG38LlAh.js";
|
|
2
|
+
import { j as n } from "../index-CM_6yF2v.js";
|
|
3
|
+
import { P as V } from "../index-CM_6yF2v.js";
|
|
4
|
+
import { T as A } from "../index-DD5CVCfD.js";
|
|
5
|
+
import { A as B } from "../ActionButton-CRjo_l3y.js";
|
|
6
|
+
import { C as T, I as z } from "../InputBox-nQKtiWtZ.js";
|
|
7
|
+
import { R as C } from "../RadioBox-0UuxlcWZ.js";
|
|
8
|
+
const r = "_tabview_zlbug_1", _ = "_labels_container_zlbug_4", b = "_label_zlbug_4", d = "_active_zlbug_32", m = "_contents_container_zlbug_35", i = {
|
|
9
|
+
tabview: r,
|
|
10
|
+
labels_container: _,
|
|
11
|
+
label: b,
|
|
12
|
+
active: d,
|
|
13
|
+
contents_container: m
|
|
14
14
|
};
|
|
15
|
-
function
|
|
16
|
-
tabs:
|
|
17
|
-
defaultActiveIndex:
|
|
15
|
+
function h({
|
|
16
|
+
tabs: t = [],
|
|
17
|
+
defaultActiveIndex: l = 0
|
|
18
18
|
}) {
|
|
19
|
-
const
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
/* @__PURE__ */
|
|
22
|
-
] }), s =
|
|
23
|
-
`.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${
|
|
19
|
+
const c = /* @__PURE__ */ n("div", { className: `ipe-tabView ${i.tabview}`, children: [
|
|
20
|
+
/* @__PURE__ */ n("ul", { className: `ipe-tabView__labels-container ${i.labels_container}`, children: t.map((a) => /* @__PURE__ */ n(f, { name: a.name, children: a.children }, a.name)) }),
|
|
21
|
+
/* @__PURE__ */ n("div", { className: `ipe-tabView__contents ${i.contents_container}`, children: t.map((a) => /* @__PURE__ */ n(p, { name: a.name, children: a.content }, a.name)) })
|
|
22
|
+
] }), s = c.querySelector(
|
|
23
|
+
`.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${l + 1})`
|
|
24
24
|
);
|
|
25
|
-
return s && s.click(),
|
|
25
|
+
return s && s.click(), c;
|
|
26
26
|
}
|
|
27
|
-
function f({ name:
|
|
28
|
-
return /* @__PURE__ */
|
|
27
|
+
function f({ name: t, children: l }) {
|
|
28
|
+
return /* @__PURE__ */ n(
|
|
29
29
|
"li",
|
|
30
30
|
{
|
|
31
|
-
"data-tab-name":
|
|
32
|
-
className: `ipe-tabView__label ${
|
|
33
|
-
onClick: function(
|
|
34
|
-
|
|
31
|
+
"data-tab-name": t,
|
|
32
|
+
className: `ipe-tabView__label ${i.label}`,
|
|
33
|
+
onClick: function(c) {
|
|
34
|
+
c.preventDefault();
|
|
35
35
|
const s = this.closest(".ipe-tabView");
|
|
36
36
|
if (!s) return;
|
|
37
37
|
const a = Array.from(s.children).find(
|
|
38
|
-
(
|
|
38
|
+
(e) => e.classList.contains("ipe-tabView__labels")
|
|
39
39
|
)?.children;
|
|
40
|
-
a && Array.from(a).forEach((
|
|
41
|
-
|
|
42
|
-
}), this.classList.add(
|
|
43
|
-
const
|
|
44
|
-
(
|
|
40
|
+
a && Array.from(a).forEach((e) => {
|
|
41
|
+
e.classList.remove(i.active);
|
|
42
|
+
}), this.classList.add(i.active);
|
|
43
|
+
const o = Array.from(s.children).find(
|
|
44
|
+
(e) => e.classList.contains("ipe-tabView__contents")
|
|
45
45
|
)?.children;
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
o && Array.from(o).forEach((e) => {
|
|
47
|
+
e instanceof HTMLElement && (e.dataset.tabName === t ? (e.style.display = "", e.classList.add(i.active)) : (e.style.display = "none", e.classList.remove(i.active)));
|
|
48
48
|
});
|
|
49
49
|
},
|
|
50
|
-
children: /* @__PURE__ */
|
|
50
|
+
children: /* @__PURE__ */ n("a", { children: l || t })
|
|
51
51
|
}
|
|
52
52
|
);
|
|
53
53
|
}
|
|
54
|
-
function
|
|
55
|
-
return /* @__PURE__ */
|
|
54
|
+
function p({ name: t, children: l }) {
|
|
55
|
+
return /* @__PURE__ */ n(
|
|
56
56
|
"div",
|
|
57
57
|
{
|
|
58
|
-
"data-tab-name":
|
|
58
|
+
"data-tab-name": t,
|
|
59
59
|
className: "ipe-tabView__content-body",
|
|
60
60
|
style: {
|
|
61
61
|
display: "none"
|
|
62
62
|
},
|
|
63
|
-
children:
|
|
63
|
+
children: l
|
|
64
64
|
}
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
|
-
const v = window?.location?.origin, y = ({
|
|
68
|
-
type: n,
|
|
69
|
-
tag: e,
|
|
70
|
-
href: i,
|
|
71
|
-
target: s,
|
|
72
|
-
children: a,
|
|
73
|
-
...c
|
|
74
|
-
}) => (e = e || (i ? "a" : "button"), typeof s > "u" && i && i.startsWith("http") && !i.startsWith(v) && (s = "_blank"), r(
|
|
75
|
-
e,
|
|
76
|
-
{
|
|
77
|
-
className: `theme-ipe ipe-action-button ipe-modal-btn is-${n || "default"}`,
|
|
78
|
-
// @ts-ignore
|
|
79
|
-
href: e === "a" ? i : void 0,
|
|
80
|
-
target: e === "a" ? s : void 0,
|
|
81
|
-
"data-href": e !== "a" ? i : void 0,
|
|
82
|
-
...c
|
|
83
|
-
},
|
|
84
|
-
a
|
|
85
|
-
));
|
|
86
67
|
export {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
68
|
+
B as ActionButton,
|
|
69
|
+
T as CheckBox,
|
|
70
|
+
z as InputBox,
|
|
71
|
+
y as MBox,
|
|
72
|
+
V as ProgressBar,
|
|
73
|
+
C as RadioBox,
|
|
74
|
+
p as TabContent,
|
|
94
75
|
f as TabLabel,
|
|
95
|
-
|
|
96
|
-
|
|
76
|
+
h as TabView,
|
|
77
|
+
A as TwinSwapInput
|
|
97
78
|
};
|
|
98
79
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/components/TabView/index.tsx"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/components/TabView/index.tsx"],"sourcesContent":["import { ReactNode } from 'jsx-dom'\nimport styles from './styles.module.sass'\n\nexport interface TabViewLabelOptions {\n name: string\n children: ReactNode\n}\n\nconsole.log(styles)\n\nexport function TabView({\n tabs = [],\n defaultActiveIndex = 0,\n}: {\n tabs: (TabViewLabelOptions & { content: ReactNode })[]\n defaultActiveIndex?: number\n}) {\n const el = (\n <div className={`ipe-tabView ${styles.tabview}`}>\n <ul className={`ipe-tabView__labels-container ${styles.labels_container}`}>\n {tabs.map((tab) => (\n <TabLabel key={tab.name} name={tab.name}>\n {tab.children}\n </TabLabel>\n ))}\n </ul>\n <div className={`ipe-tabView__contents ${styles.contents_container}`}>\n {tabs.map((tab) => (\n <TabContent key={tab.name} name={tab.name}>\n {tab.content}\n </TabContent>\n ))}\n </div>\n </div>\n )\n\n const defaultActiveLabel = el.querySelector<HTMLAnchorElement>(\n `.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${defaultActiveIndex + 1})`\n )\n if (defaultActiveLabel) {\n defaultActiveLabel.click()\n }\n\n return el\n}\n\nexport function TabLabel({ name, children }: { name: string; children: ReactNode }) {\n return (\n <li\n data-tab-name={name}\n className={`ipe-tabView__label ${styles.label}`}\n onClick={function (e) {\n e.preventDefault()\n const container = this.closest('.ipe-tabView')\n if (!container) return\n const labels = Array.from(container.children).find((el) =>\n el.classList.contains('ipe-tabView__labels')\n )?.children\n if (labels) {\n Array.from(labels).forEach((label) => {\n label.classList.remove(styles.active)\n })\n }\n this.classList.add(styles.active)\n const contents = Array.from(container.children).find((el) =>\n el.classList.contains('ipe-tabView__contents')\n )?.children\n if (contents) {\n Array.from(contents).forEach((content) => {\n if (content instanceof HTMLElement) {\n if (content.dataset.tabName === name) {\n content.style.display = ''\n content.classList.add(styles.active)\n } else {\n content.style.display = 'none'\n content.classList.remove(styles.active)\n }\n }\n })\n }\n }}\n >\n <a>{children || name}</a>\n </li>\n )\n}\n\nexport function TabContent({ name, children }: { name: string; children: ReactNode }) {\n return (\n <div\n data-tab-name={name}\n className=\"ipe-tabView__content-body\"\n style={{\n display: 'none',\n }}\n >\n {children}\n </div>\n )\n}\n"],"names":["TabView","tabs","defaultActiveIndex","el","jsxs","styles","jsx","tab","TabLabel","TabContent","defaultActiveLabel","name","children","e","container","labels","label","contents","content"],"mappings":";;;;;;;;;;;;;;AAUO,SAASA,EAAQ;AAAA,EACtB,MAAAC,IAAO,CAAA;AAAA,EACP,oBAAAC,IAAqB;AACvB,GAGG;AACD,QAAMC,IACJC,gBAAAA,EAAC,OAAA,EAAI,WAAW,eAAeC,EAAO,OAAO,IAC3C,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAW,iCAAiCD,EAAO,gBAAgB,IACpE,UAAAJ,EAAK,IAAI,CAACM,wBACRC,GAAA,EAAwB,MAAMD,EAAI,MAChC,UAAAA,EAAI,YADQA,EAAI,IAEnB,CACD,EAAA,CACH;AAAA,IACA,gBAAAD,EAAC,SAAI,WAAW,yBAAyBD,EAAO,kBAAkB,IAC/D,YAAK,IAAI,CAACE,MACT,gBAAAD,EAACG,GAAA,EAA0B,MAAMF,EAAI,MAClC,YAAI,QAAA,GADUA,EAAI,IAErB,CACD,EAAA,CACH;AAAA,EAAA,GACF,GAGIG,IAAqBP,EAAG;AAAA,IAC5B,kEAAkED,IAAqB,CAAC;AAAA,EAAA;AAE1F,SAAIQ,KACFA,EAAmB,MAAA,GAGdP;AACT;AAEO,SAASK,EAAS,EAAE,MAAAG,GAAM,UAAAC,KAAmD;AAClF,SACE,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,iBAAeK;AAAA,MACf,WAAW,sBAAsBN,EAAO,KAAK;AAAA,MAC7C,SAAS,SAAUQ,GAAG;AACpB,QAAAA,EAAE,eAAA;AACF,cAAMC,IAAY,KAAK,QAAQ,cAAc;AAC7C,YAAI,CAACA,EAAW;AAChB,cAAMC,IAAS,MAAM,KAAKD,EAAU,QAAQ,EAAE;AAAA,UAAK,CAACX,MAClDA,EAAG,UAAU,SAAS,qBAAqB;AAAA,QAAA,GAC1C;AACH,QAAIY,KACF,MAAM,KAAKA,CAAM,EAAE,QAAQ,CAACC,MAAU;AACpC,UAAAA,EAAM,UAAU,OAAOX,EAAO,MAAM;AAAA,QACtC,CAAC,GAEH,KAAK,UAAU,IAAIA,EAAO,MAAM;AAChC,cAAMY,IAAW,MAAM,KAAKH,EAAU,QAAQ,EAAE;AAAA,UAAK,CAACX,MACpDA,EAAG,UAAU,SAAS,uBAAuB;AAAA,QAAA,GAC5C;AACH,QAAIc,KACF,MAAM,KAAKA,CAAQ,EAAE,QAAQ,CAACC,MAAY;AACxC,UAAIA,aAAmB,gBACjBA,EAAQ,QAAQ,YAAYP,KAC9BO,EAAQ,MAAM,UAAU,IACxBA,EAAQ,UAAU,IAAIb,EAAO,MAAM,MAEnCa,EAAQ,MAAM,UAAU,QACxBA,EAAQ,UAAU,OAAOb,EAAO,MAAM;AAAA,QAG5C,CAAC;AAAA,MAEL;AAAA,MAEA,UAAA,gBAAAC,EAAC,KAAA,EAAG,UAAAM,KAAYD,EAAA,CAAK;AAAA,IAAA;AAAA,EAAA;AAG3B;AAEO,SAASF,EAAW,EAAE,MAAAE,GAAM,UAAAC,KAAmD;AACpF,SACE,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,iBAAeK;AAAA,MACf,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,MAAA;AAAA,MAGV,UAAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -3,5 +3,6 @@ export declare enum Endpoints {
|
|
|
3
3
|
ANALYTICS_DASH_URL = "https://analytics.ipe.wiki",
|
|
4
4
|
GITHUB_URL = "https://github.com/inpageedit/inpageedit-next",
|
|
5
5
|
HOME_URL = "https://www.ipe.wiki/",
|
|
6
|
-
UPDATE_LOGS_URL = "https://www.ipe.wiki/changelogs/"
|
|
6
|
+
UPDATE_LOGS_URL = "https://www.ipe.wiki/changelogs/",
|
|
7
|
+
PLUGIN_REGISTRY_URL = "https://registry.ipe.wiki/registry.v1.json"
|
|
7
8
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { j as n } from "./index-
|
|
2
|
-
import { B as
|
|
3
|
-
var q = Object.create,
|
|
1
|
+
import { j as n } from "./index-CM_6yF2v.js";
|
|
2
|
+
import { B as I, S as p, E as b, p as x, a as P, I as U } from "./index-DgQNTfPR.js";
|
|
3
|
+
var q = Object.create, _ = Object.defineProperty, B = Object.getOwnPropertyDescriptor, v = (i, e) => (e = Symbol[i]) ? e : Symbol.for("Symbol." + i), w = (i) => {
|
|
4
4
|
throw TypeError(i);
|
|
5
|
-
}, L = (i, e, t) => e in i ?
|
|
6
|
-
for (var s = 0,
|
|
5
|
+
}, L = (i, e, t) => e in i ? _(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, N = (i, e) => _(i, "name", { value: e, configurable: !0 }), T = (i) => [, , , q(i?.[v("metadata")] ?? null)], D = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], k = (i) => i !== void 0 && typeof i != "function" ? w("Function expected") : i, O = (i, e, t, a, s) => ({ kind: D[i], name: e, metadata: a, addInitializer: (r) => t._ ? w("Already initialized") : s.push(k(r || null)) }), j = (i, e) => L(e, v("metadata"), i[3]), C = (i, e, t, a) => {
|
|
6
|
+
for (var s = 0, r = i[e >> 1], c = r && r.length; s < c; s++) r[s].call(t);
|
|
7
7
|
return a;
|
|
8
|
-
}, M = (i, e, t, a, s,
|
|
9
|
-
var c, d, h, o = e & 7,
|
|
8
|
+
}, M = (i, e, t, a, s, r) => {
|
|
9
|
+
var c, d, h, o = e & 7, l = !1, y = 0, A = i[y] || (i[y] = []), u = o && (s = s.prototype, o < 5 && (o > 3 || !l) && B(s, t));
|
|
10
10
|
N(s, t);
|
|
11
11
|
for (var g = a.length - 1; g >= 0; g--)
|
|
12
|
-
h = O(o, t, d = {}, i[3],
|
|
13
|
-
return j(i, s), u &&
|
|
14
|
-
}, E,
|
|
12
|
+
h = O(o, t, d = {}, i[3], A), c = (0, a[g])(s, h), d._ = 1, k(c) && (s = c);
|
|
13
|
+
return j(i, s), u && _(s, t, u), l ? o ^ 4 ? r : u : s;
|
|
14
|
+
}, E, f, S;
|
|
15
15
|
E = [U(["wiki", "preferences"])];
|
|
16
|
-
class m extends (S =
|
|
16
|
+
class m extends (S = I) {
|
|
17
17
|
// 1分钟
|
|
18
18
|
constructor(e) {
|
|
19
19
|
super(e, {}, "analytics"), this.ctx = e, this._usages = [], this._timer = null, this.MAX_QUEUE_SIZE = 50, this.INTERVAL_MS = 60 * 1e3, this._setupTimer(), this._registerUnloadHandler(), this._showConfirmNotify(), this._initPluginListeners(), e.set("analytics", this);
|
|
@@ -27,15 +27,24 @@ class m extends (S = A) {
|
|
|
27
27
|
/* @__PURE__ */ n("h3", { children: "InPageEdit Analytics" }),
|
|
28
28
|
/* @__PURE__ */ n("p", { children: "InPageEdit Analytics is the companion analytics platform for the InPageEdit NEXT project. By collecting and displaying usage data from around the world, it helps developers and the community better understand how the tool is used, optimize feature design, and enhance user experience." }),
|
|
29
29
|
/* @__PURE__ */ n("h4", { children: "What data will be collected?" }),
|
|
30
|
-
/* @__PURE__ */ n("
|
|
31
|
-
/* @__PURE__ */ n("li", { children:
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
/* @__PURE__ */ n("ol", { style: { listStyle: "number", paddingLeft: "1em" }, children: [
|
|
31
|
+
/* @__PURE__ */ n("li", { children: [
|
|
32
|
+
/* @__PURE__ */ n("strong", { children: "Usage data" }),
|
|
33
|
+
": When and which features you use, what pages you edit, etc."
|
|
34
|
+
] }),
|
|
35
|
+
/* @__PURE__ */ n("li", { children: [
|
|
36
|
+
/* @__PURE__ */ n("strong", { children: "User information" }),
|
|
37
|
+
": Your user name and user ID."
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ n("li", { children: [
|
|
40
|
+
/* @__PURE__ */ n("strong", { children: "Site information" }),
|
|
41
|
+
": This wiki's url and site name."
|
|
42
|
+
] })
|
|
34
43
|
] }),
|
|
35
44
|
/* @__PURE__ */ n("p", { children: /* @__PURE__ */ n("strong", { children: "NO sensitive data will be collected." }) }),
|
|
36
|
-
/* @__PURE__ */ n("
|
|
37
|
-
/* @__PURE__ */ n("
|
|
38
|
-
/* @__PURE__ */ n(
|
|
45
|
+
/* @__PURE__ */ n("div", { style: { display: "grid", gap: "0.5rem" }, children: [
|
|
46
|
+
/* @__PURE__ */ n("a", { href: this.analyticsDashUrl, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ n("button", { className: "btn", style: { width: "100%" }, children: "Analytics Platform" }) }),
|
|
47
|
+
/* @__PURE__ */ n(
|
|
39
48
|
"a",
|
|
40
49
|
{
|
|
41
50
|
href: `${this.analyticsDashUrl}/_redirect/user?${new URLSearchParams({
|
|
@@ -44,9 +53,9 @@ class m extends (S = A) {
|
|
|
44
53
|
}).toString()}`,
|
|
45
54
|
target: "_blank",
|
|
46
55
|
rel: "noopener noreferrer",
|
|
47
|
-
children: "My Data
|
|
56
|
+
children: /* @__PURE__ */ n("button", { className: "btn", style: { width: "100%" }, children: "View My Data" })
|
|
48
57
|
}
|
|
49
|
-
)
|
|
58
|
+
)
|
|
50
59
|
] })
|
|
51
60
|
] })
|
|
52
61
|
).role("raw-html"),
|
|
@@ -56,10 +65,10 @@ class m extends (S = A) {
|
|
|
56
65
|
);
|
|
57
66
|
}
|
|
58
67
|
get analyticsDashUrl() {
|
|
59
|
-
return
|
|
68
|
+
return b.ANALYTICS_DASH_URL;
|
|
60
69
|
}
|
|
61
70
|
get analyticsApiBase() {
|
|
62
|
-
return
|
|
71
|
+
return b.ANALYTICS_API_BASE;
|
|
63
72
|
}
|
|
64
73
|
_setupTimer() {
|
|
65
74
|
this._timer = setInterval(() => {
|
|
@@ -74,9 +83,10 @@ class m extends (S = A) {
|
|
|
74
83
|
document.visibilityState === "hidden" && e();
|
|
75
84
|
}), window.addEventListener("pagehide", e), window.addEventListener("beforeunload", e);
|
|
76
85
|
}
|
|
77
|
-
_showConfirmNotify() {
|
|
78
|
-
|
|
79
|
-
t.
|
|
86
|
+
async _showConfirmNotify() {
|
|
87
|
+
this.ctx.inject(["modal", "storage"], async (e) => {
|
|
88
|
+
const t = "analytics/confirm-shown", a = await e.storage.simpleKV.get(t), s = await e.preferences.get("analytics.enabled");
|
|
89
|
+
a || s || e.modal.notify(
|
|
80
90
|
"confirm",
|
|
81
91
|
{
|
|
82
92
|
title: "Enable Analytics",
|
|
@@ -97,12 +107,12 @@ class m extends (S = A) {
|
|
|
97
107
|
label: "Disable"
|
|
98
108
|
},
|
|
99
109
|
closeAfter: 0,
|
|
100
|
-
onClose() {
|
|
101
|
-
|
|
110
|
+
onClose: () => {
|
|
111
|
+
this.ctx.storage.simpleKV.set(t, 1);
|
|
102
112
|
}
|
|
103
113
|
},
|
|
104
|
-
(
|
|
105
|
-
|
|
114
|
+
(r) => {
|
|
115
|
+
e.preferences.set("analytics.enabled", r), r && this.addEvent("analytics", "enabled");
|
|
106
116
|
}
|
|
107
117
|
);
|
|
108
118
|
});
|
|
@@ -110,7 +120,7 @@ class m extends (S = A) {
|
|
|
110
120
|
_initPluginListeners() {
|
|
111
121
|
const e = this.ctx;
|
|
112
122
|
e.on("in-article-links/anchor-clicked", (t) => {
|
|
113
|
-
this.addEvent("in-article-links",
|
|
123
|
+
this.addEvent("in-article-links", x(t.action));
|
|
114
124
|
}), e.on("quick-delete/submit", (t) => {
|
|
115
125
|
this.addEvent("quick-delete", "submit", t.wikiPage.title);
|
|
116
126
|
}), e.on("quick-diff/loaded", (t) => {
|
|
@@ -150,21 +160,21 @@ class m extends (S = A) {
|
|
|
150
160
|
userName: this.ctx.wiki.userInfo.name,
|
|
151
161
|
version: this.ctx.version.split("-")[0],
|
|
152
162
|
usages: t
|
|
153
|
-
}, s = JSON.stringify(a),
|
|
154
|
-
if (navigator?.sendBeacon?.(
|
|
163
|
+
}, s = JSON.stringify(a), r = `${this.analyticsApiBase}/submit`;
|
|
164
|
+
if (navigator?.sendBeacon?.(r, s))
|
|
155
165
|
return this.logger.debug("Beacon sent successfully", a), !0;
|
|
156
166
|
{
|
|
157
167
|
this.logger.debug("Beacon failed, sending via XMLHttpRequest");
|
|
158
|
-
const { promise: d, resolve: h, reject: o } =
|
|
168
|
+
const { promise: d, resolve: h, reject: o } = P();
|
|
159
169
|
try {
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
this.logger.debug("Beacon sent successfully via XMLHttpRequest", a), h(
|
|
163
|
-
},
|
|
170
|
+
const l = new XMLHttpRequest();
|
|
171
|
+
l.open("POST", r, !0), l.setRequestHeader("Content-Type", "application/json"), l.send(s), l.onload = () => {
|
|
172
|
+
this.logger.debug("Beacon sent successfully via XMLHttpRequest", a), h(l.status >= 200 && l.status < 300);
|
|
173
|
+
}, l.onerror = () => {
|
|
164
174
|
o(new Error("Failed to send beacon"));
|
|
165
175
|
};
|
|
166
|
-
} catch (
|
|
167
|
-
o(
|
|
176
|
+
} catch (l) {
|
|
177
|
+
o(l);
|
|
168
178
|
}
|
|
169
179
|
return d;
|
|
170
180
|
}
|
|
@@ -176,10 +186,10 @@ class m extends (S = A) {
|
|
|
176
186
|
this._timer !== null && (clearInterval(this._timer), this._timer = null), this._usages.length > 0 && this.sendBeacon();
|
|
177
187
|
}
|
|
178
188
|
}
|
|
179
|
-
|
|
180
|
-
m = M(
|
|
181
|
-
C(
|
|
189
|
+
f = T(S);
|
|
190
|
+
m = M(f, 0, "PluginAnalytics", E, m);
|
|
191
|
+
C(f, 1, m);
|
|
182
192
|
export {
|
|
183
193
|
m as PluginAnalytics
|
|
184
194
|
};
|
|
185
|
-
//# sourceMappingURL=index-
|
|
195
|
+
//# sourceMappingURL=index-B3FUDhxl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B3FUDhxl.js","sources":["../src/plugins/analytics/index.tsx"],"sourcesContent":["import { Endpoints } from '@/constants/endpoints.js'\nimport { Inject, InPageEdit, Schema } from '@/InPageEdit'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n analytics: PluginAnalytics\n }\n}\n\nexport interface IPEBeaconPayload {\n siteApi: string\n siteName?: string\n userId: number\n userName: string\n version?: string\n usages: IPEBeaconUsage[]\n}\n\nexport interface IPEBeaconUsage {\n ts: number\n feature: string\n subtype?: string\n page?: string\n}\n\n@Inject(['wiki', 'preferences'])\nexport class PluginAnalytics extends BasePlugin {\n private _usages: IPEBeaconUsage[] = []\n private _timer: ReturnType<typeof setInterval> | null = null\n private readonly MAX_QUEUE_SIZE = 50\n private readonly INTERVAL_MS = 60 * 1000 // 1分钟\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'analytics')\n this._setupTimer()\n this._registerUnloadHandler()\n this._showConfirmNotify()\n this._initPluginListeners()\n ctx.set('analytics', this)\n }\n\n protected start(): Promise<void> | void {\n const ctx = this.ctx\n ctx.preferences.registerCustomConfig(\n 'analytics',\n Schema.object({\n 'analytics._intro': Schema.const(\n <section>\n <h3>InPageEdit Analytics</h3>\n <p>\n InPageEdit Analytics is the companion analytics platform for the InPageEdit NEXT\n project. By collecting and displaying usage data from around the world, it helps\n developers and the community better understand how the tool is used, optimize feature\n design, and enhance user experience.\n </p>\n <h4>What data will be collected?</h4>\n <ol style={{ listStyle: 'number', paddingLeft: '1em' }}>\n <li>\n <strong>Usage data</strong>: When and which features you use, what pages you edit,\n etc.\n </li>\n <li>\n <strong>User information</strong>: Your user name and user ID.\n </li>\n <li>\n <strong>Site information</strong>: This wiki's url and site name.\n </li>\n </ol>\n <p>\n <strong>NO sensitive data will be collected.</strong>\n </p>\n <div style={{ display: 'grid', gap: '0.5rem' }}>\n <a href={this.analyticsDashUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <button className=\"btn\" style={{ width: '100%' }}>\n Analytics Platform\n </button>\n </a>\n <a\n href={`${this.analyticsDashUrl}/_redirect/user?${new URLSearchParams({\n siteApi: this.ctx.wiki.getSciprtUrl('api'),\n mwUserId: this.ctx.wiki.userInfo.id.toString(),\n }).toString()}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <button className=\"btn\" style={{ width: '100%' }}>\n View My Data\n </button>\n </a>\n </div>\n </section>\n ).role('raw-html'),\n 'analytics.enabled': Schema.boolean()\n .description('Share my usage data with the community.')\n .default(false),\n }).description('Analytics settings'),\n 'general'\n )\n }\n\n private get analyticsDashUrl() {\n return import.meta.env.PROD ? Endpoints.ANALYTICS_DASH_URL : 'http://localhost:20105'\n }\n private get analyticsApiBase() {\n return import.meta.env.PROD ? Endpoints.ANALYTICS_API_BASE : 'http://localhost:20105/api/v6'\n }\n\n private _setupTimer() {\n this._timer = setInterval(() => {\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }, this.INTERVAL_MS)\n }\n\n private _registerUnloadHandler() {\n const handleUnload = () => {\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n handleUnload()\n }\n })\n\n window.addEventListener('pagehide', handleUnload)\n window.addEventListener('beforeunload', handleUnload)\n }\n\n private async _showConfirmNotify() {\n this.ctx.inject(['modal', 'storage'], async (ctx) => {\n const key = 'analytics/confirm-shown'\n const shown = await ctx.storage.simpleKV.get(key)\n const enabled = await ctx.preferences.get('analytics.enabled')\n if (shown || enabled) {\n return\n }\n ctx.modal.notify(\n 'confirm',\n {\n title: 'Enable Analytics',\n content: (\n <div>\n <p>Help us improve InPageEdit by sharing your usage data with us.</p>\n <p>What data will be collected?</p>\n <ul style={{ listStyle: 'auto', paddingLeft: '1.5em' }}>\n <li>Usage data: What features you use, what pages you edit, etc.</li>\n <li>User information: Your username, user ID.</li>\n <li>Site information: The wiki you are editing.</li>\n </ul>\n <p>\n <strong>NO sensitive data will be collected.</strong>\n </p>\n </div>\n ),\n okBtn: {\n label: 'Enable',\n },\n cancelBtn: {\n label: 'Disable',\n },\n closeAfter: 0,\n onClose: () => {\n this.ctx.storage.simpleKV.set(key, 1)\n },\n },\n (result) => {\n ctx.preferences.set('analytics.enabled', result)\n if (result) {\n this.addEvent('analytics', 'enabled')\n }\n }\n )\n })\n }\n\n private _initPluginListeners() {\n const ctx = this.ctx\n ctx.on('in-article-links/anchor-clicked', (payload) => {\n this.addEvent('in-article-links', paramCase(payload.action))\n })\n ctx.on('quick-delete/submit', (payload) => {\n this.addEvent('quick-delete', 'submit', payload.wikiPage.title)\n })\n ctx.on('quick-diff/loaded', (payload) => {\n this.addEvent('quick-diff', 'loaded', payload.compare.fromtitle)\n })\n ctx.on('quick-redirect/submit', (payload) => {\n this.addEvent('quick-redirect', 'submit', payload.payload.to || undefined)\n })\n ctx.on('quick-preview/loaded', (payload) => {\n this.addEvent('quick-preview', 'loaded', payload.wikiPage.title)\n })\n ctx.on('quick-edit/wiki-page', (payload) => {\n this.addEvent('quick-edit', undefined, payload.wikiPage.title)\n })\n ctx.on('quick-edit/submit', (payload) => {\n this.addEvent('quick-edit', 'submit', payload.wikiPage.title)\n })\n ctx.on('quick-move/submit', (payload) => {\n this.addEvent('quick-move', 'submit')\n })\n ctx.on('toolbox/button-clicked', (payload) => {\n this.addEvent('toolbox', `button-clicked#${payload.id || 'unknown'}`)\n })\n }\n\n public addEvent(feature: string, subtype?: string, page?: string) {\n const usage: IPEBeaconUsage = {\n ts: Date.now(),\n feature,\n subtype,\n page,\n }\n this._usages.push(usage)\n\n // 如果usages数组超过50个,立即发送\n if (this._usages.length >= this.MAX_QUEUE_SIZE) {\n this.sendBeacon()\n }\n\n return this\n }\n\n private async sendBeacon() {\n if (this._usages.length === 0) {\n return true\n }\n\n const enabled = await this.ctx.preferences.get<boolean>('analytics.enabled', false)\n if (!enabled) {\n this.logger.debug('Analytics disabled, skipping')\n return true\n }\n\n const usages = this._usages.splice(0, this._usages.length)\n const payload: IPEBeaconPayload = {\n siteApi: this.ctx.wiki.getSciprtUrl('api'),\n siteName: this.ctx.wiki.siteInfo.general.sitename,\n userId: this.ctx.wiki.userInfo.id,\n userName: this.ctx.wiki.userInfo.name,\n version: this.ctx.version.split('-')[0],\n usages,\n }\n const body = JSON.stringify(payload)\n\n const endpoint = `${this.analyticsApiBase}/submit`\n\n const beaconOK = navigator?.sendBeacon?.(endpoint, body)\n if (beaconOK) {\n this.logger.debug('Beacon sent successfully', payload)\n return true\n } else {\n this.logger.debug('Beacon failed, sending via XMLHttpRequest')\n const { promise, resolve, reject } = promiseWithResolvers<boolean>()\n try {\n const xhr = new XMLHttpRequest()\n xhr.open('POST', endpoint, true)\n xhr.setRequestHeader('Content-Type', 'application/json')\n xhr.send(body)\n xhr.onload = () => {\n this.logger.debug('Beacon sent successfully via XMLHttpRequest', payload)\n resolve(xhr.status >= 200 && xhr.status < 300)\n }\n xhr.onerror = () => {\n reject(new Error('Failed to send beacon'))\n }\n } catch (error) {\n reject(error)\n }\n return promise\n }\n }\n\n /**\n * 清理资源\n */\n protected stop() {\n if (this._timer !== null) {\n clearInterval(this._timer)\n this._timer = null\n }\n // 在销毁前发送剩余的数据\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }\n}\n"],"names":["_PluginAnalytics_decorators","_init","_a","Inject","PluginAnalytics","BasePlugin","ctx","Schema","jsx","jsxs","Endpoints","handleUnload","key","shown","enabled","result","payload","paramCase","feature","subtype","page","usage","usages","body","endpoint","promise","resolve","reject","promiseWithResolvers","xhr","error","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|