@inpageedit/core 0.10.0 → 0.11.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.
Files changed (63) hide show
  1. package/README.md +9 -2
  2. package/dist/PluginPrefSync-COidewzp.js +258 -0
  3. package/dist/PluginPrefSync-COidewzp.js.map +1 -0
  4. package/dist/__test__/utils/constants.d.ts +3 -2
  5. package/dist/components/index.js +69 -51
  6. package/dist/components/index.js.map +1 -1
  7. package/dist/constants/endpoints.d.ts +1 -1
  8. package/dist/{index-BR6gK_ki.js → index-BNDyaWnI.js} +44 -38
  9. package/dist/index-BNDyaWnI.js.map +1 -0
  10. package/dist/{index-BnAhw94L.js → index-BQzuJxBO.js} +2 -2
  11. package/dist/{index-BnAhw94L.js.map → index-BQzuJxBO.js.map} +1 -1
  12. package/dist/{index-Z-_kjibx.js → index-BUI2IX49.js} +763 -699
  13. package/dist/index-BUI2IX49.js.map +1 -0
  14. package/dist/{index-Cx-YiN1j.js → index-CBszdxJJ.js} +22 -21
  15. package/dist/index-CBszdxJJ.js.map +1 -0
  16. package/dist/index-CfgnJ51A.js +185 -0
  17. package/dist/index-CfgnJ51A.js.map +1 -0
  18. package/dist/index-Cx4qgCJK.js +4914 -0
  19. package/dist/{index-DqJUIV2e.js.map → index-Cx4qgCJK.js.map} +1 -1
  20. package/dist/index-D5J7RU5I.js +211 -0
  21. package/dist/index-D5J7RU5I.js.map +1 -0
  22. package/dist/{index-ByzgI28q.js → index-MhNAv9Vf.js} +6 -2
  23. package/dist/index-MhNAv9Vf.js.map +1 -0
  24. package/dist/{index-ByJfEsN8.js → index-U2RPZk8N.js} +148 -110
  25. package/dist/index-U2RPZk8N.js.map +1 -0
  26. package/dist/{index-CAiGct8U.js → index-VnRKIVau.js} +42 -42
  27. package/dist/index-VnRKIVau.js.map +1 -0
  28. package/dist/{index-eOIVMf9E.js → index-etJXONAj.js} +46 -35
  29. package/dist/index-etJXONAj.js.map +1 -0
  30. package/dist/index.js +1 -1
  31. package/dist/models/WikiTitle/index.d.ts +2 -2
  32. package/dist/plugins/analytics/index.d.ts +41 -0
  33. package/dist/plugins/in-article-links/index.d.ts +14 -0
  34. package/dist/plugins/preferences-ui/PluginPrefSync.d.ts +2 -0
  35. package/dist/plugins/preferences-ui/index.d.ts +3 -1
  36. package/dist/plugins/quick-delete/index.d.ts +3 -0
  37. package/dist/plugins/quick-diff/index.d.ts +17 -0
  38. package/dist/plugins/quick-edit/index.d.ts +8 -0
  39. package/dist/plugins/quick-move/index.d.ts +16 -0
  40. package/dist/plugins/quick-redirect/index.d.ts +15 -0
  41. package/dist/plugins/toolbox/index.d.ts +9 -0
  42. package/dist/services/PreferencesService.d.ts +9 -2
  43. package/dist/services/WikiMetadataService.d.ts +23 -23
  44. package/dist/style.css +1 -1
  45. package/dist/types/WikiMetadata.d.ts +6 -8
  46. package/lib/index.umd.js +24 -24
  47. package/lib/index.umd.js.map +1 -1
  48. package/lib/style.css +1 -1
  49. package/package.json +3 -3
  50. package/dist/ActionButton-BgbTKTg7.js +0 -24
  51. package/dist/ActionButton-BgbTKTg7.js.map +0 -1
  52. package/dist/PluginPrefSync-CNCU2DJU.js +0 -171
  53. package/dist/PluginPrefSync-CNCU2DJU.js.map +0 -1
  54. package/dist/index-2mNdeL-V.js +0 -193
  55. package/dist/index-2mNdeL-V.js.map +0 -1
  56. package/dist/index-BR6gK_ki.js.map +0 -1
  57. package/dist/index-ByJfEsN8.js.map +0 -1
  58. package/dist/index-ByzgI28q.js.map +0 -1
  59. package/dist/index-CAiGct8U.js.map +0 -1
  60. package/dist/index-Cx-YiN1j.js.map +0 -1
  61. package/dist/index-DqJUIV2e.js +0 -4861
  62. package/dist/index-Z-_kjibx.js.map +0 -1
  63. package/dist/index-eOIVMf9E.js.map +0 -1
@@ -1,22 +1,22 @@
1
- import { j as i, P as y } from "./index-CvhkVj_L.js";
2
- import { B as S, I as q } from "./index-Z-_kjibx.js";
1
+ import { j as a, P as y } from "./index-CvhkVj_L.js";
2
+ import { B as S, I as q } from "./index-BUI2IX49.js";
3
3
  import { T as F } from "./index-Bh70Udzi.js";
4
4
  import { C as u } from "./CheckBox-D3rHnX7I.js";
5
5
  import { I as j } from "./InputBox-BV4m05Xs.js";
6
- var E = Object.create, h = Object.defineProperty, I = Object.getOwnPropertyDescriptor, k = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), b = (t) => {
6
+ var E = Object.create, h = Object.defineProperty, I = Object.getOwnPropertyDescriptor, w = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), b = (t) => {
7
7
  throw TypeError(t);
8
- }, B = (t, e, o) => e in t ? h(t, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : t[e] = o, T = (t, e) => h(t, "name", { value: e, configurable: !0 }), C = (t) => [, , , E(t?.[k("metadata")] ?? null)], z = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], _ = (t) => t !== void 0 && typeof t != "function" ? b("Function expected") : t, D = (t, e, o, a, r) => ({ kind: z[t], name: e, metadata: a, addInitializer: (n) => o._ ? b("Already initialized") : r.push(_(n || null)) }), O = (t, e) => B(e, k("metadata"), t[3]), N = (t, e, o, a) => {
8
+ }, B = (t, e, o) => e in t ? h(t, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : t[e] = o, T = (t, e) => h(t, "name", { value: e, configurable: !0 }), C = (t) => [, , , E(t?.[w("metadata")] ?? null)], z = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], _ = (t) => t !== void 0 && typeof t != "function" ? b("Function expected") : t, D = (t, e, o, i, r) => ({ kind: z[t], name: e, metadata: i, addInitializer: (n) => o._ ? b("Already initialized") : r.push(_(n || null)) }), O = (t, e) => B(e, w("metadata"), t[3]), N = (t, e, o, i) => {
9
9
  for (var r = 0, n = t[e >> 1], s = n && n.length; r < s; r++) n[r].call(o);
10
- return a;
11
- }, Q = (t, e, o, a, r, n) => {
12
- var s, c, g, l = e & 7, f = !1, w = 0, P = t[w] || (t[w] = []), d = l && (r = r.prototype, l < 5 && (l > 3 || !f) && I(r, o));
10
+ return i;
11
+ }, Q = (t, e, o, i, r, n) => {
12
+ var s, c, g, l = e & 7, f = !1, k = 0, P = t[k] || (t[k] = []), d = l && (r = r.prototype, l < 5 && (l > 3 || !f) && I(r, o));
13
13
  T(r, o);
14
- for (var m = a.length - 1; m >= 0; m--)
15
- g = D(l, o, c = {}, t[3], P), s = (0, a[m])(r, g), c._ = 1, _(s) && (r = s);
14
+ for (var m = i.length - 1; m >= 0; m--)
15
+ g = D(l, o, c = {}, t[3], P), s = (0, i[m])(r, g), c._ = 1, _(s) && (r = s);
16
16
  return O(t, r), d && h(r, o, d), f ? l ^ 4 ? n : d : r;
17
- }, M, p, x;
18
- M = [q(["modal", "wiki"])];
19
- class v extends (x = S) {
17
+ }, x, p, M;
18
+ x = [q(["modal", "wiki"])];
19
+ class v extends (M = S) {
20
20
  constructor(e) {
21
21
  super(e, {}, "quick-move"), this.ctx = e, e.set("quickMove", this.quickMove.bind(this)), e.set("movePage", this.movePage.bind(this));
22
22
  }
@@ -26,10 +26,10 @@ class v extends (x = S) {
26
26
  });
27
27
  }
28
28
  injectToolbox(e) {
29
- const o = window.mw?.config.get("wgPageName") || "", a = window.mw?.config.get("wgIsProbablyEditable");
29
+ const o = window.mw?.config.get("wgPageName") || "", i = window.mw?.config.get("wgIsProbablyEditable");
30
30
  e.toolbox.addButton({
31
31
  id: "quick-move",
32
- icon: /* @__PURE__ */ i(
32
+ icon: /* @__PURE__ */ a(
33
33
  "svg",
34
34
  {
35
35
  xmlns: "http://www.w3.org/2000/svg",
@@ -43,13 +43,13 @@ class v extends (x = S) {
43
43
  "stroke-linejoin": "round",
44
44
  class: "icon icon-tabler icons-tabler-outline icon-tabler-forms",
45
45
  children: [
46
- /* @__PURE__ */ i("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
47
- /* @__PURE__ */ i("path", { d: "M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3" }),
48
- /* @__PURE__ */ i("path", { d: "M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3" }),
49
- /* @__PURE__ */ i("path", { d: "M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7" }),
50
- /* @__PURE__ */ i("path", { d: "M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1" }),
51
- /* @__PURE__ */ i("path", { d: "M17 12h.01" }),
52
- /* @__PURE__ */ i("path", { d: "M13 12h.01" })
46
+ /* @__PURE__ */ a("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
47
+ /* @__PURE__ */ a("path", { d: "M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3" }),
48
+ /* @__PURE__ */ a("path", { d: "M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3" }),
49
+ /* @__PURE__ */ a("path", { d: "M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7" }),
50
+ /* @__PURE__ */ a("path", { d: "M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1" }),
51
+ /* @__PURE__ */ a("path", { d: "M17 12h.01" }),
52
+ /* @__PURE__ */ a("path", { d: "M13 12h.01" })
53
53
  ]
54
54
  }
55
55
  ),
@@ -58,7 +58,7 @@ class v extends (x = S) {
58
58
  index: 1,
59
59
  onClick: () => {
60
60
  this.quickMove(
61
- a ? {
61
+ i ? {
62
62
  lockFromField: !0,
63
63
  from: o
64
64
  } : {}
@@ -69,26 +69,26 @@ class v extends (x = S) {
69
69
  quickMove(e) {
70
70
  const o = this.ctx.modal.createObject({
71
71
  title: "Quick Move",
72
- content: /* @__PURE__ */ i(y, {}),
72
+ content: /* @__PURE__ */ a(y, {}),
73
73
  className: "quick-move compact-buttons",
74
74
  sizeClass: "smallToMedium",
75
75
  center: !0
76
76
  }).init();
77
- let a = null;
77
+ let i = null;
78
78
  return o.setContent(
79
- /* @__PURE__ */ i(
79
+ /* @__PURE__ */ a(
80
80
  "form",
81
81
  {
82
- ref: (r) => a = r,
82
+ ref: (r) => i = r,
83
83
  style: {
84
84
  display: "flex",
85
85
  flexDirection: "column",
86
86
  gap: "1rem"
87
87
  },
88
88
  onSubmit: (r) => {
89
- if (r.preventDefault(), a?.checkValidity(), !a?.reportValidity())
89
+ if (r.preventDefault(), i?.checkValidity(), !i?.reportValidity())
90
90
  return;
91
- const n = new FormData(a), s = {
91
+ const n = new FormData(i), s = {
92
92
  from: n.get("from")?.toString().trim(),
93
93
  to: n.get("to")?.toString().trim(),
94
94
  reason: n.get("reason") || "",
@@ -103,7 +103,7 @@ class v extends (x = S) {
103
103
  });
104
104
  return;
105
105
  }
106
- o.setLoadingState(!0), this.movePage(s).then(() => {
106
+ this.ctx.emit("quick-move/submit", { ctx: this.ctx, modal: o, payload: s }), o.setLoadingState(!0), this.movePage(s).then(() => {
107
107
  location.reload();
108
108
  }).catch((c) => {
109
109
  o.setLoadingState(!1), this.ctx.modal.notify("error", {
@@ -113,7 +113,7 @@ class v extends (x = S) {
113
113
  });
114
114
  },
115
115
  children: [
116
- /* @__PURE__ */ i(
116
+ /* @__PURE__ */ a(
117
117
  F,
118
118
  {
119
119
  inputs: [
@@ -132,10 +132,10 @@ class v extends (x = S) {
132
132
  ]
133
133
  }
134
134
  ),
135
- /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(u, { name: "movetalk", id: "movetalk", checked: e?.movetalk, children: "Move talk page" }) }),
136
- /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(u, { name: "movesubpages", id: "movesubpages", checked: e?.movesubpages, children: "Move subpage(s) (up to 100)" }) }),
137
- this.ctx.wiki.hasRight("suppressredirect") && /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(u, { name: "noredirect", id: "noredirect", checked: e?.noredirect, children: "Move without leaving a redirect" }) }),
138
- /* @__PURE__ */ i(j, { label: "Reason", id: "reason", name: "reason", value: e?.reason })
135
+ /* @__PURE__ */ a("div", { children: /* @__PURE__ */ a(u, { name: "movetalk", id: "movetalk", checked: e?.movetalk, children: "Move talk page" }) }),
136
+ /* @__PURE__ */ a("div", { children: /* @__PURE__ */ a(u, { name: "movesubpages", id: "movesubpages", checked: e?.movesubpages, children: "Move subpage(s) (up to 100)" }) }),
137
+ this.ctx.wiki.hasRight("suppressredirect") && /* @__PURE__ */ a("div", { children: /* @__PURE__ */ a(u, { name: "noredirect", id: "noredirect", checked: e?.noredirect, children: "Move without leaving a redirect" }) }),
138
+ /* @__PURE__ */ a(j, { label: "Reason", id: "reason", name: "reason", value: e?.reason })
139
139
  ]
140
140
  }
141
141
  )
@@ -144,24 +144,24 @@ class v extends (x = S) {
144
144
  label: "Move",
145
145
  className: "is-primary is-ghost",
146
146
  method: () => {
147
- a?.dispatchEvent(new Event("submit"));
147
+ i?.dispatchEvent(new Event("submit"));
148
148
  }
149
149
  }
150
150
  ]), o.show();
151
151
  }
152
152
  async movePage(e) {
153
- const { from: o, to: a, reason: r = "", ...n } = e;
154
- if (!o || !a)
153
+ const { from: o, to: i, reason: r = "", ...n } = e;
154
+ if (!o || !i)
155
155
  throw new Error("From and to titles are required.");
156
- if (o === a)
156
+ if (o === i)
157
157
  throw new Error("From and to titles cannot be the same.");
158
- return (await this.ctx.wikiPage.newFromTitle(o)).moveTo(a, r, n);
158
+ return (await this.ctx.wikiPage.newFromTitle(o)).moveTo(i, r, n);
159
159
  }
160
160
  }
161
- p = C(x);
162
- v = Q(p, 0, "PluginQuickMove", M, v);
161
+ p = C(M);
162
+ v = Q(p, 0, "PluginQuickMove", x, v);
163
163
  N(p, 1, v);
164
164
  export {
165
165
  v as PluginQuickMove
166
166
  };
167
- //# sourceMappingURL=index-CAiGct8U.js.map
167
+ //# sourceMappingURL=index-VnRKIVau.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-VnRKIVau.js","sources":["../src/plugins/quick-move/index.tsx"],"sourcesContent":["import { Inject, InPageEdit } from '@/InPageEdit'\nimport { IPEModal } from '@inpageedit/modal'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickMove: PluginQuickMove['quickMove']\n movePage: PluginQuickMove['movePage']\n }\n interface Events {\n 'quick-move/init-options'(payload: {\n ctx: InPageEdit\n options: Partial<QuickMoveOptions>\n }): void\n 'quick-move/show-modal'(payload: { ctx: InPageEdit; modal: IPEModal }): void\n 'quick-move/submit'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n payload: MovePageOptions\n }): void\n }\n}\n\nexport interface MovePageOptions {\n from: string\n to: string\n reason?: string\n movetalk?: boolean\n movesubpages?: boolean\n noredirect?: boolean\n}\nexport interface QuickMoveOptions extends Partial<MovePageOptions> {\n lockFromField?: boolean\n lockToField?: boolean\n}\n\n@Inject(['modal', 'wiki'])\nexport class PluginQuickMove extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-move')\n ctx.set('quickMove', this.quickMove.bind(this))\n ctx.set('movePage', this.movePage.bind(this))\n }\n\n protected start(): Promise<void> | void {\n this.ctx.inject(['toolbox'], (ctx) => {\n this.injectToolbox(ctx)\n })\n }\n\n private injectToolbox(ctx: InPageEdit) {\n const curPageName = window.mw?.config.get('wgPageName') || ''\n const canEdit = window.mw?.config.get('wgIsProbablyEditable')\n ctx.toolbox.addButton({\n id: 'quick-move',\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-forms\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3\" />\n <path d=\"M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3\" />\n <path d=\"M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7\" />\n <path d=\"M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1\" />\n <path d=\"M17 12h.01\" />\n <path d=\"M13 12h.01\" />\n </svg>\n ),\n tooltip: 'Quick Move',\n group: 'group1',\n index: 1,\n onClick: () => {\n this.quickMove(\n canEdit\n ? {\n lockFromField: true,\n from: curPageName,\n }\n : {}\n )\n },\n })\n }\n\n quickMove(options?: Partial<QuickMoveOptions>) {\n const modal = this.ctx.modal\n .createObject({\n title: 'Quick Move',\n content: (<ProgressBar />) as HTMLElement,\n className: 'quick-move compact-buttons',\n sizeClass: 'smallToMedium',\n center: true,\n })\n .init()\n\n let formRef: HTMLFormElement | null = null\n modal.setContent(\n (\n <form\n ref={(el) => (formRef = el)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n }}\n onSubmit={(e) => {\n e.preventDefault()\n formRef?.checkValidity()\n if (!formRef?.reportValidity()) {\n return\n }\n const formData = new FormData(formRef!)\n const options = {\n from: formData.get('from')?.toString().trim()!,\n to: formData.get('to')?.toString().trim()!,\n reason: (formData.get('reason') as string) || '',\n movetalk: formData.get('movetalk') === 'on',\n movesubpages: formData.get('movesubpages') === 'on',\n noredirect: formData.get('noredirect') === 'on',\n }\n if (!options.from || !options.to) {\n this.ctx.modal.notify('error', {\n title: 'Failed to move',\n content: 'From and to are required.',\n })\n return\n }\n this.ctx.emit('quick-move/submit', { ctx: this.ctx, modal, payload: options })\n modal.setLoadingState(true)\n this.movePage(options)\n .then(() => {\n location.reload()\n })\n .catch((error) => {\n modal.setLoadingState(false)\n this.ctx.modal.notify('error', {\n title: 'Failed to move',\n content: error instanceof Error ? error.message : String(error),\n })\n })\n }}\n >\n <TwinSwapInput\n inputs={[\n {\n label: 'Move from',\n name: 'from',\n value: options?.from,\n required: true,\n },\n {\n label: 'Move to',\n name: 'to',\n value: options?.to,\n required: true,\n },\n ]}\n />\n <div>\n <CheckBox name=\"movetalk\" id=\"movetalk\" checked={options?.movetalk}>\n Move talk page\n </CheckBox>\n </div>\n <div>\n <CheckBox name=\"movesubpages\" id=\"movesubpages\" checked={options?.movesubpages}>\n Move subpage(s) (up to 100)\n </CheckBox>\n </div>\n {this.ctx.wiki.hasRight('suppressredirect') && (\n <div>\n <CheckBox name=\"noredirect\" id=\"noredirect\" checked={options?.noredirect}>\n Move without leaving a redirect\n </CheckBox>\n </div>\n )}\n <InputBox label=\"Reason\" id=\"reason\" name=\"reason\" value={options?.reason} />\n </form>\n ) as HTMLElement\n )\n\n modal.setButtons([\n {\n label: 'Move',\n className: 'is-primary is-ghost',\n method: () => {\n formRef?.dispatchEvent(new Event('submit'))\n },\n },\n ])\n\n return modal.show()\n }\n\n async movePage(options: MovePageOptions) {\n const { from, to, reason = '', ...rest } = options\n\n if (!from || !to) {\n throw new Error('From and to titles are required.')\n }\n if (from === to) {\n throw new Error('From and to titles cannot be the same.')\n }\n\n const wikiPage = await this.ctx.wikiPage.newFromTitle(from)\n return wikiPage.moveTo(to, reason, rest)\n }\n}\n"],"names":["_PluginQuickMove_decorators","_init","_a","Inject","PluginQuickMove","BasePlugin","ctx","curPageName","canEdit","jsxs","jsx","options","modal","ProgressBar","formRef","el","e","formData","error","TwinSwapInput","CheckBox","InputBox","from","to","reason","rest","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { j as i, F as S, P as E } from "./index-CvhkVj_L.js";
2
- import { B as C, I as z, S as y } from "./index-Z-_kjibx.js";
3
- import { I as j } from "./IconQuickEdit-CAL1HXIb.js";
4
- import { R as q } from "./Preferences-DS4-CFWe.js";
1
+ import { j as i, F as P, P as E } from "./index-CvhkVj_L.js";
2
+ import { B as C, I as q, S as x } from "./index-BUI2IX49.js";
3
+ import { I as z } from "./IconQuickEdit-CAL1HXIb.js";
4
+ import { R as j } from "./Preferences-DS4-CFWe.js";
5
5
  import { M as I } from "./index-lZkYoUca.js";
6
6
  const T = (t) => {
7
7
  let { user: e, target: r, ctx: o } = t;
@@ -63,14 +63,14 @@ const O = new Intl.DateTimeFormat(void 0, {
63
63
  href: t.ctx.getUrl("", { action: "edit", oldid: t.revid }),
64
64
  onClick: r,
65
65
  children: [
66
- /* @__PURE__ */ i(j, { style: "width: 1em; height: 1em" }),
66
+ /* @__PURE__ */ i(z, { style: "width: 1em; height: 1em" }),
67
67
  "Quick edit"
68
68
  ]
69
69
  }
70
70
  ) }),
71
71
  /* @__PURE__ */ i("div", { className: "mw-diff-title--user", children: t.username && /* @__PURE__ */ i(T, { ctx: t.ctx, user: t.username, target: "_blank" }) }),
72
72
  /* @__PURE__ */ i("div", { className: "mw-diff-title--timestamp", children: t.timestamp && O(new Date(t.timestamp)) }),
73
- /* @__PURE__ */ i("div", { className: "mw-diff-title--comment", children: t.parsedcomment && /* @__PURE__ */ i(S, { children: [
73
+ /* @__PURE__ */ i("div", { className: "mw-diff-title--comment", children: t.parsedcomment && /* @__PURE__ */ i(P, { children: [
74
74
  "(",
75
75
  /* @__PURE__ */ i("i", { innerHTML: t.parsedcomment }),
76
76
  ")"
@@ -170,21 +170,21 @@ const O = new Intl.DateTimeFormat(void 0, {
170
170
  }
171
171
  ) }) })).outerHTML, o;
172
172
  }, Q = (t, e = document) => e.querySelector(t), U = (t, e = document) => e.querySelectorAll(t);
173
- var F = Object.create, v = Object.defineProperty, M = Object.getOwnPropertyDescriptor, w = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), x = (t) => {
173
+ var F = Object.create, v = Object.defineProperty, M = Object.getOwnPropertyDescriptor, y = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), w = (t) => {
174
174
  throw TypeError(t);
175
- }, B = (t, e, r) => e in t ? v(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, A = (t, e) => v(t, "name", { value: e, configurable: !0 }), H = (t) => [, , , F(t?.[w("metadata")] ?? null)], R = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], _ = (t) => t !== void 0 && typeof t != "function" ? x("Function expected") : t, K = (t, e, r, o, n) => ({ kind: R[t], name: e, metadata: o, addInitializer: (a) => r._ ? x("Already initialized") : n.push(_(a || null)) }), Y = (t, e) => B(e, w("metadata"), t[3]), G = (t, e, r, o) => {
176
- for (var n = 0, a = t[e >> 1], s = a && a.length; n < s; n++) a[n].call(r);
175
+ }, B = (t, e, r) => e in t ? v(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, A = (t, e) => v(t, "name", { value: e, configurable: !0 }), H = (t) => [, , , F(t?.[y("metadata")] ?? null)], R = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], _ = (t) => t !== void 0 && typeof t != "function" ? w("Function expected") : t, K = (t, e, r, o, n) => ({ kind: R[t], name: e, metadata: o, addInitializer: (a) => r._ ? w("Already initialized") : n.push(_(a || null)) }), Y = (t, e) => B(e, y("metadata"), t[3]), G = (t, e, r, o) => {
176
+ for (var n = 0, a = t[e >> 1], c = a && a.length; n < c; n++) a[n].call(r);
177
177
  return o;
178
178
  }, J = (t, e, r, o, n, a) => {
179
- var s, c, l, d = e & 7, g = !1, b = 0, P = t[b] || (t[b] = []), m = d && (n = n.prototype, d < 5 && (d > 3 || !g) && M(n, r));
179
+ var c, s, l, d = e & 7, g = !1, b = 0, S = t[b] || (t[b] = []), m = d && (n = n.prototype, d < 5 && (d > 3 || !g) && M(n, r));
180
180
  A(n, r);
181
181
  for (var u = o.length - 1; u >= 0; u--)
182
- l = K(d, r, c = {}, t[3], P), s = (0, o[u])(n, l), c._ = 1, _(s) && (n = s);
182
+ l = K(d, r, s = {}, t[3], S), c = (0, o[u])(n, l), s._ = 1, _(c) && (n = c);
183
183
  return Y(t, n), m && v(n, r, m), g ? d ^ 4 ? a : m : n;
184
184
  }, N, p, D;
185
- N = [z(["wiki", "getUrl", "preferences"]), q(
186
- y.object({
187
- "quickDiff.keyshortcut": y.string().default("ctrl-d").description("Key shortcut to open quick diff in quick edit modal")
185
+ N = [q(["wiki", "getUrl", "preferences"]), j(
186
+ x.object({
187
+ "quickDiff.keyshortcut": x.string().default("ctrl-d").description("Key shortcut to open quick diff in quick edit modal")
188
188
  }).description("Quick diff options").extra("category", "edit")
189
189
  )];
190
190
  class h extends (D = C) {
@@ -222,12 +222,12 @@ class h extends (D = C) {
222
222
  className: "cdx-button",
223
223
  onClick: (n) => {
224
224
  n.preventDefault();
225
- const a = new FormData(e), s = Number(a.get("oldid")) || 0, c = Number(a.get("diff")) || 0;
226
- if (!a.get("title") || !s || !c)
225
+ const a = new FormData(e), c = Number(a.get("oldid")) || 0, s = Number(a.get("diff")) || 0;
226
+ if (!a.get("title") || !c || !s)
227
227
  return this.logger.warn("Missing title or revision IDs");
228
228
  this.comparePages({
229
- fromrev: s,
230
- torev: c
229
+ fromrev: c,
230
+ torev: s
231
231
  });
232
232
  },
233
233
  children: "Quick Diff"
@@ -247,13 +247,17 @@ class h extends (D = C) {
247
247
  keyPress: await this.ctx.preferences.get("quickDiff.keyshortcut") || void 0,
248
248
  className: "btn btn-secondary",
249
249
  method: () => {
250
- const a = r.title, s = r.revisions?.[0]?.content || "", c = e.get$content().querySelector('textarea[name="text"]')?.value || "";
251
- return s === c ? this.ctx.modal.notify("info", { title: "Quick Diff", content: "No changes" }) : (n = this.comparePages(
250
+ const a = r.title, c = r.revisions?.[0]?.content || "", s = e.get$content().querySelector('textarea[name="text"]')?.value || "";
251
+ return c === s ? this.ctx.modal.notify("info", { title: "Quick Diff", content: "No changes" }) : (this.ctx.emit("quick-diff/quick-edit-modal", {
252
+ ctx: this.ctx,
253
+ modal: e,
254
+ wikiPage: r
255
+ }), n = this.comparePages(
252
256
  {
253
257
  fromtitle: a,
254
- fromtext: s,
258
+ fromtext: c,
255
259
  totitle: a,
256
- totext: c,
260
+ totext: s,
257
261
  topst: !0
258
262
  },
259
263
  n,
@@ -276,7 +280,10 @@ class h extends (D = C) {
276
280
  className: "quick-diff",
277
281
  center: !1,
278
282
  ...o
279
- }).init() : r.removeButton("*"), r.setContent(
283
+ }).init() : r.removeButton("*"), this.ctx.emit("quick-diff/init-options", {
284
+ ctx: this.ctx,
285
+ options: e
286
+ }), r.setContent(
280
287
  /* @__PURE__ */ i(
281
288
  "section",
282
289
  {
@@ -299,7 +306,7 @@ class h extends (D = C) {
299
306
  r.setTitle(
300
307
  a.fromtitle && a.totitle ? `${a.fromtitle}${a.fromrevid ? ` (${a.fromrevid})` : ""} ⇔ ${a.totitle}${a.torevid ? ` (${a.torevid})` : ""}` : "Differences"
301
308
  );
302
- let s;
309
+ let c;
303
310
  r.setContent(
304
311
  /* @__PURE__ */ i(
305
312
  "section",
@@ -307,28 +314,28 @@ class h extends (D = C) {
307
314
  style: {
308
315
  minHeight: "70vh"
309
316
  },
310
- children: /* @__PURE__ */ i(L, { ref: (c) => s = c, data: a, ctx: this.ctx })
317
+ children: /* @__PURE__ */ i(L, { ref: (s) => c = s, data: a, ctx: this.ctx })
311
318
  }
312
319
  )
313
- ), s.addEventListener(
320
+ ), c.addEventListener(
314
321
  f.update,
315
- (c) => {
316
- c.stopPropagation(), this.comparePages(
322
+ (s) => {
323
+ s.stopPropagation(), this.comparePages(
317
324
  {
318
- fromrev: c.detail.fromrev,
319
- torev: c.detail.torev
325
+ fromrev: s.detail.fromrev,
326
+ torev: s.detail.torev
320
327
  },
321
328
  r,
322
329
  o
323
330
  );
324
331
  },
325
332
  { once: !0 }
326
- ), this.ctx.inject(["quickEdit"], (c) => {
333
+ ), this.ctx.inject(["quickEdit"], (s) => {
327
334
  const l = (d) => {
328
- d.stopPropagation(), c.quickEdit({ revision: d.detail.revid });
335
+ d.stopPropagation(), s.quickEdit({ revision: d.detail.revid });
329
336
  };
330
- s.addEventListener(f.edit, l), r.on(r.Event.Close, () => {
331
- s.removeEventListener(f.edit, l);
337
+ c.addEventListener(f.edit, l), r.on(r.Event.Close, () => {
338
+ c.removeEventListener(f.edit, l);
332
339
  });
333
340
  }), a.fromrevid && a.torevid && r.addButton({
334
341
  label: "Original Compare Page",
@@ -340,6 +347,10 @@ class h extends (D = C) {
340
347
  diff: a.torevid
341
348
  });
342
349
  }
350
+ }), this.ctx.emit("quick-diff/loaded", {
351
+ ctx: this.ctx,
352
+ modal: r,
353
+ compare: a
343
354
  });
344
355
  }).catch((n) => {
345
356
  r.setContent(
@@ -354,4 +365,4 @@ G(p, 1, h);
354
365
  export {
355
366
  h as PluginQuickDiff
356
367
  };
357
- //# sourceMappingURL=index-eOIVMf9E.js.map
368
+ //# sourceMappingURL=index-etJXONAj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-etJXONAj.js","sources":["../src/components/MwUserLinks.tsx","../src/plugins/quick-diff/components/DiffTable.tsx","../src/components/utils.tsx","../src/plugins/quick-diff/index.tsx"],"sourcesContent":["import { InPageEdit } from '@/InPageEdit'\n\nexport const MwUserLinks = (props: { user: string; target?: string; ctx: InPageEdit }) => {\n let { user, target, ctx } = props\n const getUrl = ctx.getUrl.bind(ctx)\n return (\n <span className=\"mw-userlinks\">\n <a href={getUrl(`User:${user}`)} className=\"mw-userlink\" target={target}>\n {user}\n </a>{' '}\n <span className=\"mw-usertoollinks\">\n (\n <a href={getUrl(`User_talk:${user}`)} className=\"mw-usertoollinks-talk\" target={target}>\n talk\n </a>\n {' | '}\n <a\n href={getUrl(`Special:Contributions/${user}`)}\n className=\"mw-usertoollinks-contribs\"\n target={target}\n >\n contribs\n </a>\n {' | '}\n <a\n href={getUrl(`Special:Block/${user}`)}\n className=\"mw-usertoollinks-block\"\n target={target}\n >\n block\n </a>\n )\n </span>\n </span>\n )\n}\n","import './style.scss'\nimport { JSX } from 'jsx-dom/jsx-runtime'\nimport { CompareApiResponse } from '../index.js'\nimport { InPageEdit } from '@/InPageEdit.js'\n\nexport type DiffTableProps = {\n data: Partial<CompareApiResponse['compare']>\n ctx: InPageEdit\n} & JSX.IntrinsicElements['table']\n\nexport enum DiffTableEvent {\n update = 'ipe:diff-table/update',\n edit = 'ipe:diff-table/edit',\n}\n\n// DOM 事件类型定义\ndeclare global {\n interface HTMLElementEventMap {\n [DiffTableEvent.update]: CustomEvent<{\n fromrev: number\n torev: number\n }>\n [DiffTableEvent.edit]: CustomEvent<{\n revid: number\n }>\n }\n}\n\nconst formatDate = new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'medium',\n}).format\n\nconst DiffTableHeader = (props: {\n ctx: InPageEdit\n type?: 'from' | 'to'\n pageid?: number\n pagetitle?: string\n revid?: number\n size?: number\n timestamp?: string\n username?: string\n userid?: number\n comment?: string\n parsedcomment?: string\n}) => {\n let classList = ['diff-title']\n if (props.type === 'from') {\n classList.push('diff-otitle')\n } else if (props.type === 'to') {\n classList.push('diff-ntitle')\n }\n if (!props.pageid || !props.userid) {\n return (\n <td colSpan={2} className={classList}>\n <div className=\"mw-diff-title--title\">\n {props.type === 'from' ? 'Original content' : props.type === 'to' ? 'Your content' : ''}\n </div>\n </td>\n )\n }\n const handleEditClick = (e: Event) => {\n e.preventDefault()\n e.target!.dispatchEvent(\n new CustomEvent(DiffTableEvent.edit, {\n detail: { revid: props.revid! },\n bubbles: true,\n })\n )\n }\n return (\n <td colSpan={2} className={classList}>\n <div className=\"mw-diff-title--title\">\n {props.pagetitle || props.timestamp}\n {props.revid ? ` (rev#${props.revid})` : ''}\n </div>\n <div className=\"mw-diff-title--actions\">\n <a\n href={props.ctx.getUrl('', { action: 'edit', oldid: props.revid! })}\n onClick={handleEditClick}\n >\n <IconQuickEdit style=\"width: 1em; height: 1em\" />\n Quick edit\n </a>\n </div>\n <div className=\"mw-diff-title--user\">\n {props.username && <MwUserLinks ctx={props.ctx} user={props.username} target=\"_blank\" />}\n </div>\n <div className=\"mw-diff-title--timestamp\">\n {props.timestamp && formatDate(new Date(props.timestamp))}\n </div>\n <div className=\"mw-diff-title--comment\">\n {props.parsedcomment && (\n <>\n (<i innerHTML={props.parsedcomment}></i>)\n </>\n )}\n </div>\n </td>\n )\n}\n\nconst DiffTableNavigation = (props: { data: DiffTableProps['data']; ctx: InPageEdit }) => {\n const data = props.data\n if (!data.prev && !data.next) {\n return null\n }\n\n // 统一的事件处理器\n const handleNavigationClick = (e: Event, fromrev: number, torev: number) => {\n e.preventDefault()\n e.target!.dispatchEvent(\n new CustomEvent(DiffTableEvent.update, {\n detail: { fromrev, torev },\n bubbles: true,\n })\n )\n }\n\n return (\n <tr className=\"mw-diff-title--navigation\">\n <td colSpan={2}>\n {data.prev ? (\n <a\n href={props.ctx.getUrl('', { diff: data.prev!, oldid: data.fromrevid! })}\n onClick={(e) => handleNavigationClick(e, data.prev!, data.fromrevid!)}\n >\n ← Previous\n </a>\n ) : (\n <i>Oldest version</i>\n )}\n </td>\n <td colSpan={2}>\n {data.next ? (\n <a\n href={props.ctx.getUrl('', { diff: data.next!, oldid: data.torevid! })}\n onClick={(e) => handleNavigationClick(e, data.torevid!, data.next!)}\n >\n Next →\n </a>\n ) : (\n <i>Newest version</i>\n )}\n </td>\n </tr>\n )\n}\n\nexport const DiffTable = (props: DiffTableProps) => {\n const { data, ...rest } = props\n const table = (\n <table className={`theme-ipe diff diff-type-table`} data-mw=\"interface\" {...rest}>\n <colgroup>\n <col className=\"diff-marker\" />\n <col className=\"diff-content\" />\n <col className=\"diff-marker\" />\n <col className=\"diff-content\" />\n </colgroup>\n <tbody>\n <tr>\n <DiffTableHeader\n ctx={props.ctx}\n type=\"from\"\n pageid={data.fromid}\n pagetitle={data.fromtitle}\n revid={data.fromrevid}\n size={data.fromsize}\n timestamp={data.fromtimestamp}\n username={data.fromuser}\n userid={data.fromuserid}\n comment={data.fromcomment}\n parsedcomment={data.fromparsedcomment}\n />\n <DiffTableHeader\n ctx={props.ctx}\n type=\"to\"\n pageid={data.toid}\n pagetitle={data.totitle}\n revid={data.torevid}\n size={data.tosize}\n timestamp={data.totimestamp}\n username={data.touser}\n userid={data.touserid}\n comment={data.tocomment}\n parsedcomment={data.toparsedcomment}\n />\n </tr>\n <DiffTableNavigation data={data} ctx={props.ctx} />\n <div id=\"diffbody\"></div>\n <tr className=\"diff-size\" style={{ textAlign: 'center' }}>\n <td colSpan={2} className=\"diff-size-old\">\n {data.fromsize !== undefined && `${data.fromsize} bytes`}\n </td>\n <td colSpan={2} className=\"diff-size-new\">\n {data.tosize !== undefined && `${data.tosize} bytes`}\n </td>\n </tr>\n </tbody>\n </table>\n )\n table.querySelector('#diffbody')!.outerHTML =\n data.body ||\n (\n <tr>\n <td colSpan={4}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '5rem',\n }}\n >\n <i>No changes</i>\n </div>\n </td>\n </tr>\n ).outerHTML\n return table\n}\n","import { CSSProperties, ReactElement } from 'jsx-dom'\n\nexport const qs = <T extends Element>(\n selector: string,\n parent: HTMLElement | Document = document\n) => {\n return parent.querySelector(selector) as T | null\n}\nexport const qsa = <T extends Element>(\n selector: string,\n parent: HTMLElement | Document = document\n) => {\n return parent.querySelectorAll(selector) as NodeListOf<T>\n}\n\nexport const setStyles = (el: HTMLElement | ReactElement, style: CSSProperties) => {\n Object.entries(style).forEach(([key, value]) => {\n if (typeof value === 'undefined' || value === null) {\n el.style.removeProperty(key)\n } else {\n const isImportant = typeof value === 'string' && value.endsWith('!important')\n // @ts-ignore\n el.style.setProperty(\n key,\n value.replace('!important', '').trim(),\n isImportant ? 'important' : undefined\n )\n }\n })\n return el\n}\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\nimport { DiffTable, DiffTableEvent } from './components/DiffTable'\nimport { MwApiResponse } from 'wiki-saikou'\nimport { IWikiPage } from '@/models/WikiPage/index.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickDiff: PluginQuickDiff\n }\n interface Events {\n 'quick-diff/init-options'(payload: {\n ctx: InPageEdit\n options: Partial<CompareApiRequestOptions>\n }): void\n 'quick-diff/loaded'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n compare: CompareApiResponse['compare']\n }): void\n 'quick-diff/quick-edit-modal'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n wikiPage: IWikiPage\n }): void\n }\n}\n\nexport interface CompareApiRequestOptions {\n fromtitle: string\n fromid: number\n fromrev: number\n frompst: boolean\n totitle: string\n toid: number\n torev: number\n torelative?: 'cur' | 'prev' | 'next'\n topst: boolean\n prop: string\n difftype: 'table' | 'unified'\n // deprecated, but still works\n fromtext: string\n fromsection: string | number\n fromcontentmodel: string\n totext: string\n tosection: string | number\n tocontentmodel: string\n}\n\nexport interface CompareApiResponse {\n compare: Partial<{\n fromid: number\n fromrevid: number\n fromns: number\n fromtitle: string\n fromsize: number\n fromtimestamp: string\n fromuser: string\n fromuserid: number\n fromcomment: string\n fromparsedcomment?: string\n toid: number\n torevid: number\n tons: number\n totitle: string\n tosize: number\n totimestamp: string\n touser: string\n touserid: number\n tocomment: string\n toparsedcomment: string\n diffsize: number\n prev: number\n next: number\n }> & {\n body: string\n }\n}\n\n@Inject(['wiki', 'getUrl', 'preferences'])\n@RegisterPreferences(\n Schema.object({\n 'quickDiff.keyshortcut': Schema.string()\n .default('ctrl-d')\n .description('Key shortcut to open quick diff in quick edit modal'),\n })\n .description('Quick diff options')\n .extra('category', 'edit')\n)\nexport class PluginQuickDiff extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-diff')\n }\n\n protected start(): Promise<void> | void {\n this.ctx.set('quickDiff', this)\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\n window.RLQ.push(this.injectHistoryPage.bind(this))\n }\n\n protected stop(): Promise<void> | void {}\n\n private injectHistoryPage() {\n const mwCompareForm = qs<HTMLFormElement>('#mw-history-compare')\n if (!mwCompareForm) {\n return\n }\n const compareButtons = qsa('.mw-history-compareselectedversions-button', mwCompareForm)\n compareButtons.forEach((el) => {\n el.after(\n <button\n className=\"cdx-button\"\n onClick={(e) => {\n e.preventDefault()\n const formData = new FormData(mwCompareForm)\n const fromrev = Number(formData.get('oldid')) || 0\n const torev = Number(formData.get('diff')) || 0\n const title = formData.get('title') as string\n if (!title || !fromrev || !torev) {\n return this.logger.warn('Missing title or revision IDs')\n }\n this.comparePages({\n fromrev,\n torev,\n })\n }}\n >\n Quick Diff\n </button>\n )\n })\n }\n\n private async injectQuickEdit({ modal, wikiPage, options }: QuickEditEventPayload) {\n if (wikiPage.pageid === 0 || options.section === 'new') {\n // User is creating a new page, no need to show diff button\n return\n }\n let latestDiffModal: IPEModal | undefined = undefined\n modal.addButton(\n {\n label: 'Diff',\n side: 'left',\n keyPress: (await this.ctx.preferences.get<string>('quickDiff.keyshortcut')) || undefined,\n className: 'btn btn-secondary',\n method: () => {\n const pageTitle = wikiPage.title\n const fromtext = wikiPage.revisions?.[0]?.content || ''\n const totext =\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\n ?.value as string) || ''\n\n if (fromtext === totext) {\n return this.ctx.modal.notify('info', { title: 'Quick Diff', content: 'No changes' })\n }\n\n this.ctx.emit('quick-diff/quick-edit-modal', {\n ctx: this.ctx,\n modal,\n wikiPage,\n })\n\n latestDiffModal = this.comparePages(\n {\n fromtitle: pageTitle,\n fromtext,\n totitle: pageTitle,\n totext,\n topst: true,\n },\n latestDiffModal,\n {\n backdrop: false,\n draggable: true,\n }\n )\n return latestDiffModal\n },\n },\n 2\n )\n modal.on(modal.Event.Close, () => {\n latestDiffModal?.destroy()\n latestDiffModal = undefined\n })\n }\n\n readonly COMPARE_API_DEFAULT_OPTIONS: Partial<CompareApiRequestOptions> = {\n prop: [\n 'comment',\n 'diff',\n 'diffsize',\n 'ids',\n 'parsedcomment',\n 'size',\n 'timestamp',\n 'title',\n 'user',\n 'rel',\n ].join('|'),\n difftype: 'table',\n }\n\n comparePages(\n options: Partial<CompareApiRequestOptions>,\n modal?: IPEModal,\n modalOptions?: Partial<IPEModalOptions>\n ) {\n if (!modal || modal.isDestroyed) {\n modal = this.ctx.modal\n .createObject({\n title: 'Loading diff...',\n content: '',\n className: 'quick-diff',\n center: false,\n ...modalOptions,\n })\n .init()\n } else {\n modal.removeButton('*')\n }\n\n this.ctx.emit('quick-diff/init-options', {\n ctx: this.ctx,\n options,\n })\n\n modal.setContent(\n <section\n style={{ height: '70vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }}\n >\n <ProgressBar />\n </section>\n )\n modal.bringToFront()\n\n if (window.mw && mw.loader.getState('mediawiki.diff.styles') !== 'ready') {\n mw.loader.load(['mediawiki.diff.styles'])\n }\n\n this.ctx.api\n .post<MwApiResponse<CompareApiResponse>>({\n ...this.COMPARE_API_DEFAULT_OPTIONS,\n ...options,\n action: 'compare',\n format: 'json',\n formatversion: 2,\n })\n .then((res) => {\n if (!res.data.compare) {\n throw new Error('No compare data received', { cause: res })\n }\n const {\n data: { compare },\n } = res\n modal.setTitle(\n compare.fromtitle && compare.totitle\n ? `${compare.fromtitle}${compare.fromrevid ? ` (${compare.fromrevid})` : ''} ⇔ ${compare.totitle}${compare.torevid ? ` (${compare.torevid})` : ''}`\n : 'Differences'\n )\n let diffTable!: HTMLElement\n modal.setContent(\n (\n <section\n style={{\n minHeight: '70vh',\n }}\n >\n <DiffTable ref={(ref) => (diffTable = ref)} data={compare} ctx={this.ctx} />\n </section>\n ) as HTMLElement\n )\n diffTable.addEventListener(\n DiffTableEvent.update,\n (e) => {\n e.stopPropagation()\n this.comparePages(\n {\n fromrev: e.detail.fromrev,\n torev: e.detail.torev,\n },\n modal,\n modalOptions\n )\n },\n { once: true }\n )\n\n // TODO: 不应该硬编码,移动到 in-article-links 插件中\n this.ctx.inject(['quickEdit'], (ctx) => {\n const handleQuickEdit = (e: CustomEvent<{ revid: number }>) => {\n e.stopPropagation()\n ctx.quickEdit({ revision: e.detail.revid })\n }\n diffTable.addEventListener(DiffTableEvent.edit, handleQuickEdit)\n modal.on(modal.Event.Close, () => {\n diffTable.removeEventListener(DiffTableEvent.edit, handleQuickEdit)\n })\n })\n\n if (compare.fromrevid && compare.torevid) {\n modal.addButton({\n label: 'Original Compare Page',\n side: 'right',\n className: 'btn btn-secondary',\n method: () => {\n window.location.href = this.ctx.getUrl('', {\n oldid: compare.fromrevid,\n diff: compare.torevid,\n })\n },\n })\n }\n\n this.ctx.emit('quick-diff/loaded', {\n ctx: this.ctx,\n modal,\n compare,\n })\n })\n .catch((err) => {\n modal.setContent(\n (\n <MBox title=\"Failed to load diff\" type=\"error\">\n <pre>{err instanceof Error ? err.message : String(err)}</pre>\n </MBox>\n ) as HTMLElement\n )\n })\n\n return modal.show()\n }\n}\n"],"names":["MwUserLinks","props","user","target","ctx","getUrl","jsxs","jsx","DiffTableEvent","formatDate","DiffTableHeader","classList","handleEditClick","e","IconQuickEdit","Fragment","DiffTableNavigation","data","handleNavigationClick","fromrev","torev","DiffTable","rest","table","qs","selector","parent","qsa","_PluginQuickDiff_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickDiff","BasePlugin","mwCompareForm","el","formData","modal","wikiPage","options","latestDiffModal","pageTitle","fromtext","totext","modalOptions","ProgressBar","res","compare","diffTable","ref","handleQuickEdit","err","MBox","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { B as s, b as g, I as r, m as c, $ as o, S as t, a as L, c as i } from "./index-Z-_kjibx.js";
1
+ import { B as s, c as g, I as r, m as c, $ as o, S as t, b as L, d as i } from "./index-BUI2IX49.js";
2
2
  export {
3
3
  s as BasePlugin,
4
4
  g as InPageEdit,
@@ -1,4 +1,4 @@
1
- import { WikiMetadata } from '../../types/WikiMetadata';
1
+ import { WikiSiteInfo } from '../../types/WikiMetadata';
2
2
  export interface IWikiTitle {
3
3
  /**
4
4
  * Get db key without namespace prefix
@@ -86,4 +86,4 @@ export interface WikiTitleConstructor {
86
86
  new (title: string, namespace?: number): IWikiTitle;
87
87
  create(title: string, namespace?: number): IWikiTitle;
88
88
  }
89
- export declare function createWikiTitleModel(metadata: WikiMetadata): WikiTitleConstructor;
89
+ export declare function createWikiTitleModel(metadata: WikiSiteInfo): WikiTitleConstructor;
@@ -0,0 +1,41 @@
1
+ import { InPageEdit } from '../../InPageEdit';
2
+ declare module '../../InPageEdit' {
3
+ interface InPageEdit {
4
+ analytics: PluginAnalytics;
5
+ }
6
+ }
7
+ export interface IPEBeaconPayload {
8
+ siteApi: string;
9
+ siteName?: string;
10
+ userId: number;
11
+ userName: string;
12
+ version?: string;
13
+ usages: IPEBeaconUsage[];
14
+ }
15
+ export interface IPEBeaconUsage {
16
+ ts: number;
17
+ feature: string;
18
+ subtype?: string;
19
+ page?: string;
20
+ }
21
+ export declare class PluginAnalytics extends BasePlugin {
22
+ ctx: InPageEdit;
23
+ private _usages;
24
+ private _timer;
25
+ private readonly MAX_QUEUE_SIZE;
26
+ private readonly INTERVAL_MS;
27
+ constructor(ctx: InPageEdit);
28
+ protected start(): Promise<void> | void;
29
+ private get analyticsDashUrl();
30
+ private get analyticsApiBase();
31
+ private _setupTimer;
32
+ private _registerUnloadHandler;
33
+ private _showConfirmNotify;
34
+ private _initPluginListeners;
35
+ addEvent(feature: string, subtype?: string, page?: string): this;
36
+ private sendBeacon;
37
+ /**
38
+ * 清理资源
39
+ */
40
+ protected stop(): void;
41
+ }
@@ -4,6 +4,20 @@ declare module '../../InPageEdit' {
4
4
  interface InPageEdit {
5
5
  inArticleLinks: PluginInArticleLinks;
6
6
  }
7
+ interface Events {
8
+ 'in-article-links/anchor-parsed'(payload: {
9
+ ctx: InPageEdit;
10
+ anchor: HTMLAnchorElement;
11
+ info: InArticleWikiAnchorMetadata;
12
+ }): void;
13
+ 'in-article-links/anchor-clicked'(payload: {
14
+ ctx: InPageEdit;
15
+ anchor: HTMLAnchorElement;
16
+ info: InArticleWikiAnchorMetadata;
17
+ event: MouseEvent;
18
+ action: 'quickEdit' | 'quickDiff';
19
+ }): void;
20
+ }
7
21
  }
8
22
  export interface InArticleWikiAnchorMetadata extends WikiLinkMetadata {
9
23
  $el: HTMLAnchorElement;
@@ -22,4 +22,6 @@ export declare class PluginPrefSync extends BasePlugin {
22
22
  * 导出配置到用户页
23
23
  */
24
24
  exportToUserPage(): Promise<IWikiTitle>;
25
+ importFromFile(input: Blob): Promise<Record<string, unknown>>;
26
+ private notifyImportSuccess;
25
27
  }
@@ -3,6 +3,7 @@ import { CustomIPEModal } from '../../services/ModalService.js';
3
3
  declare module '../../InPageEdit' {
4
4
  interface InPageEdit {
5
5
  preferencesUI: PluginPreferencesUI;
6
+ prefsModal: PluginPreferencesUI;
6
7
  }
7
8
  }
8
9
  export declare class PluginPreferencesUI extends BasePlugin {
@@ -11,7 +12,8 @@ export declare class PluginPreferencesUI extends BasePlugin {
11
12
  protected start(): Promise<void>;
12
13
  protected stop(): Promise<void> | void;
13
14
  _latestModal: CustomIPEModal | null;
15
+ showModal(): CustomIPEModal;
16
+ closeModal(): void;
14
17
  getExistingModal(): CustomIPEModal | null;
15
- showModal(): void;
16
18
  createForm(): import('vue').App<Element>;
17
19
  }
@@ -15,6 +15,9 @@ declare module '../../InPageEdit' {
15
15
  'quick-delete/delete-notice'(payload: QuickDeleteInitPayload & {
16
16
  deleteNotices: ReactNode[];
17
17
  }): void;
18
+ 'quick-delete/submit'(payload: QuickDeleteSubmitPayload & {
19
+ ctx: InPageEdit;
20
+ }): void;
18
21
  }
19
22
  }
20
23
  export interface QuickDeleteOptions {
@@ -1,9 +1,26 @@
1
1
  import { InPageEdit } from '../../InPageEdit';
2
2
  import { IPEModal, IPEModalOptions } from '@inpageedit/modal';
3
+ import { IWikiPage } from '../../models/WikiPage/index.js';
3
4
  declare module '../../InPageEdit' {
4
5
  interface InPageEdit {
5
6
  quickDiff: PluginQuickDiff;
6
7
  }
8
+ interface Events {
9
+ 'quick-diff/init-options'(payload: {
10
+ ctx: InPageEdit;
11
+ options: Partial<CompareApiRequestOptions>;
12
+ }): void;
13
+ 'quick-diff/loaded'(payload: {
14
+ ctx: InPageEdit;
15
+ modal: IPEModal;
16
+ compare: CompareApiResponse['compare'];
17
+ }): void;
18
+ 'quick-diff/quick-edit-modal'(payload: {
19
+ ctx: InPageEdit;
20
+ modal: IPEModal;
21
+ wikiPage: IWikiPage;
22
+ }): void;
23
+ }
7
24
  }
8
25
  export interface CompareApiRequestOptions {
9
26
  fromtitle: string;
@@ -16,6 +16,9 @@ declare module '../../InPageEdit' {
16
16
  'quick-edit/edit-notice'(payload: QuickEditEventPayload & {
17
17
  editNotices: ReactNode[];
18
18
  }): void;
19
+ 'quick-edit/submit'(payload: QuickEditSubmitPayload & {
20
+ ctx: InPageEdit;
21
+ }): void;
19
22
  }
20
23
  }
21
24
  export interface QuickEditOptions {
@@ -57,6 +60,11 @@ export declare class PluginQuickEdit extends BasePlugin {
57
60
  handleSubmit(payload: QuickEditSubmitPayload): Promise<Required<import('wiki-saikou').FexiosContext<import('wiki-saikou').MwApiResponse<{
58
61
  success: boolean;
59
62
  }>>>>;
63
+ static readonly BUILT_IN_FONT_OPTIONS: string[];
64
+ getEditFontOptions(): Promise<{
65
+ className: string;
66
+ fontFamily: string;
67
+ }>;
60
68
  getWikiPageFromPayload(payload: Partial<QuickEditOptions>): Promise<IWikiPage>;
61
69
  private injectToolbox;
62
70
  protected removeToolbox(ctx: InPageEdit): void;