@inpageedit/core 0.4.0 → 0.5.0

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 (67) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +55 -55
  3. package/dist/ActionButton-BgbTKTg7.js +24 -0
  4. package/dist/ActionButton-BgbTKTg7.js.map +1 -0
  5. package/dist/InPageEdit.d.ts +8 -7
  6. package/dist/InputBox-FIzJ-rPN.js.map +1 -1
  7. package/dist/Preferences-Bg3J5Ur9.js.map +1 -1
  8. package/dist/{RadioBox-BZFhTEo5.js → RadioBox-CaA8VgLu.js} +16 -16
  9. package/dist/RadioBox-CaA8VgLu.js.map +1 -0
  10. package/dist/components/TwinSwapInput/index.d.ts +1 -0
  11. package/dist/components/index.js +21 -22
  12. package/dist/components/index.js.map +1 -1
  13. package/dist/{index-BPsDFq9U.js → index-Bh70Udzi.js} +14 -13
  14. package/dist/index-Bh70Udzi.js.map +1 -0
  15. package/dist/index-Bo1hNwWJ.js +96 -0
  16. package/dist/index-Bo1hNwWJ.js.map +1 -0
  17. package/dist/{index-Ch5DJDZZ.js → index-BxR7MsNM.js} +105 -102
  18. package/dist/index-BxR7MsNM.js.map +1 -0
  19. package/dist/{index-BsYzf3Yw.js → index-CUXLgVhg.js} +11 -11
  20. package/dist/index-CUXLgVhg.js.map +1 -0
  21. package/dist/index-CvhkVj_L.js.map +1 -1
  22. package/dist/{index-BByzm2Fz.js → index-D3yG7jFv.js} +119 -111
  23. package/dist/{index-BByzm2Fz.js.map → index-D3yG7jFv.js.map} +1 -1
  24. package/dist/{index-D-zQLFuZ.js → index-K73DMVec.js} +13 -20
  25. package/dist/index-K73DMVec.js.map +1 -0
  26. package/dist/index-jKU6cYcH.js +165 -0
  27. package/dist/index-jKU6cYcH.js.map +1 -0
  28. package/dist/{index-X1X416tZ.js → index-mMAGhnbR.js} +40 -24
  29. package/dist/index-mMAGhnbR.js.map +1 -0
  30. package/dist/index-z5MR2HJ2.js +4820 -0
  31. package/dist/index-z5MR2HJ2.js.map +1 -0
  32. package/dist/index.js +3008 -2546
  33. package/dist/index.js.map +1 -1
  34. package/dist/plugins/BasePlugin.d.ts +1 -1
  35. package/dist/plugins/_debug/index.d.ts +1 -1
  36. package/dist/plugins/quick-diff/PluginQuickDiffCore.d.ts +2 -1
  37. package/dist/plugins/quick-edit/index.d.ts +2 -1
  38. package/dist/plugins/quick-move/index.d.ts +1 -1
  39. package/dist/plugins/quick-preview/index.d.ts +4 -3
  40. package/dist/plugins/quick-redirect/index.d.ts +1 -1
  41. package/dist/plugins/toolbox/index.d.ts +2 -2
  42. package/dist/services/ModalService/IPEModal.d.ts +235 -0
  43. package/dist/services/ModalService/index.d.ts +35 -0
  44. package/dist/sleep-DpyIipK-.js.map +1 -1
  45. package/dist/style.css +1 -1
  46. package/dist/utils/interpolate.d.ts +20 -0
  47. package/dist/utils/interpolate.spec.d.ts +1 -0
  48. package/lib/index.umd.js +53 -26
  49. package/lib/index.umd.js.map +1 -1
  50. package/lib/style.css +1 -1
  51. package/package.json +8 -9
  52. package/dist/ActionButton-ByMKIthQ.js +0 -24
  53. package/dist/ActionButton-ByMKIthQ.js.map +0 -1
  54. package/dist/RadioBox-BZFhTEo5.js.map +0 -1
  55. package/dist/index-BPsDFq9U.js.map +0 -1
  56. package/dist/index-BTngTj1f.js +0 -4682
  57. package/dist/index-BTngTj1f.js.map +0 -1
  58. package/dist/index-BsYzf3Yw.js.map +0 -1
  59. package/dist/index-Ch5DJDZZ.js.map +0 -1
  60. package/dist/index-Cq9xxVsu.js +0 -149
  61. package/dist/index-Cq9xxVsu.js.map +0 -1
  62. package/dist/index-D-zQLFuZ.js.map +0 -1
  63. package/dist/index-HyxA2rYz.js +0 -87
  64. package/dist/index-HyxA2rYz.js.map +0 -1
  65. package/dist/index-X1X416tZ.js.map +0 -1
  66. package/dist/services/SsiModalService.d.ts +0 -36
  67. package/dist/utils/Logger.d.ts +0 -106
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Bo1hNwWJ.js","sources":["../src/plugins/quick-preview/index.tsx"],"sourcesContent":["import { Inject, InPageEdit } from '@/InPageEdit'\nimport { type QuickEditInitPayload } from '@/plugins/quick-edit'\nimport { WikiPage } from '@/models/WikiPage'\nimport { MwApiParams } from 'wiki-saikou'\nimport { PageParseData } from '@/models/WikiPage/types/PageParseData'\nimport { IPEModal } from '@/services/ModalService/IPEModal.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickPreview: PluginQuickPreview['quickPreview']\n }\n interface Events {\n 'quickPreview/showModal'(payload: {\n ctx: InPageEdit\n text: string\n modal: IPEModal\n wikiPage: WikiPage\n }): void\n 'quickPreview/loaded'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n wikiPage: WikiPage\n text: string\n parseData: PageParseData\n }): void\n }\n}\n\n@Inject(['api', 'wikiPage', 'modal'])\nexport class PluginQuickPreview extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quickPreview')\n }\n\n protected start(): Promise<void> | void {\n this.ctx.set('quickPreview', this.quickPreview.bind(this))\n this.ctx.on('quickEdit/wikiPage', this.injectQuickEdit.bind(this))\n }\n\n protected stop(): Promise<void> | void {\n this.ctx.off('quickEdit/wikiPage', this.injectQuickEdit.bind(this))\n }\n\n private injectQuickEdit({ ctx, modal, wikiPage }: QuickEditInitPayload) {\n let latestPreviewModal: IPEModal | undefined = undefined\n modal.addButton(\n {\n label: 'Preview',\n side: 'left',\n className: 'btn btn-secondary',\n method: () => {\n latestPreviewModal = this.quickPreview(\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\n ?.value as string) || '',\n undefined,\n wikiPage,\n latestPreviewModal\n )\n },\n },\n 2\n )\n }\n\n quickPreview(text: string, params?: MwApiParams, wikiPage?: WikiPage, modal?: IPEModal) {\n wikiPage ||= this.ctx.wikiPage.newBlankPage({\n title: 'API',\n })\n\n if (!modal || modal.isDestroyed) {\n modal = this.ctx.modal\n .createObject({\n className: 'in-page-edit ipe-quickPreview',\n sizeClass: 'large',\n backdrop: false,\n draggable: true,\n })\n .init()\n }\n\n modal.show()\n modal.setTitle('Preview loading...')\n modal.setContent(<ProgressBar />)\n modal.bringToFront()\n this.ctx.emit('quickPreview/showModal', {\n ctx: this.ctx,\n text,\n modal,\n wikiPage,\n })\n\n wikiPage\n .preview(text, params)\n .then((ret) => {\n const {\n data: { parse },\n } = ret\n modal.setTitle(`Preview - ${parse.title}`)\n let outputRef: HTMLElement | null = null\n modal.setContent(\n (\n <section>\n <div\n ref={(el) => (outputRef = el)}\n className=\"mw-parser-output\"\n innerHTML={parse.text}\n ></div>\n </section>\n ) as HTMLElement\n )\n window.mw?.hook('wikipage.content').fire($(outputRef!))\n this.ctx.emit('quickPreview/loaded', {\n ctx: this.ctx,\n modal,\n wikiPage,\n text,\n parseData: parse,\n })\n })\n .catch((error) => {\n modal.setTitle('Preview failed')\n modal.setContent(\n <>\n <p>Failed to preview</p>\n <p>{error instanceof Error ? error.message : String(error)}</p>\n </>\n )\n })\n\n return modal\n }\n}\n"],"names":["_PluginQuickPreview_decorators","_init","_a","Inject","PluginQuickPreview","BasePlugin","ctx","modal","wikiPage","latestPreviewModal","text","params","jsx","ProgressBar","ret","parse","outputRef","el","error","jsxs","Fragment","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1,20 +1,20 @@
1
- import { j as s, F as E, P as Q } from "./index-CvhkVj_L.js";
1
+ import { j as s, F as E, P as U } from "./index-CvhkVj_L.js";
2
2
  import { BasePlugin as I, Inject as A, Schema as m } from "./index.js";
3
3
  import { R as C } from "./Preferences-Bg3J5Ur9.js";
4
- import { M as U, R as z } from "./RadioBox-BZFhTEo5.js";
5
- import { I as D, C as y } from "./InputBox-FIzJ-rPN.js";
4
+ import { M as D, R as Q } from "./RadioBox-CaA8VgLu.js";
5
+ import { I as z, C as y } from "./InputBox-FIzJ-rPN.js";
6
6
  import { s as R } from "./sleep-DpyIipK-.js";
7
- var h = /* @__PURE__ */ ((t) => (t.preferences = "preferences", t.watch = "watch", t.unwatch = "unwatch", t.nochange = "nochange", t))(h || {}), W = Object.create, x = Object.defineProperty, H = Object.getOwnPropertyDescriptor, $ = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), q = (t) => {
7
+ var h = /* @__PURE__ */ ((t) => (t.preferences = "preferences", t.watch = "watch", t.unwatch = "unwatch", t.nochange = "nochange", t))(h || {}), W = Object.create, x = Object.defineProperty, H = Object.getOwnPropertyDescriptor, q = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), $ = (t) => {
8
8
  throw TypeError(t);
9
- }, X = (t, e, r) => e in t ? x(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, G = (t, e) => x(t, "name", { value: e, configurable: !0 }), K = (t) => [, , , W(t?.[$("metadata")] ?? null)], Y = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], L = (t) => t !== void 0 && typeof t != "function" ? q("Function expected") : t, J = (t, e, r, c, i) => ({ kind: Y[t], name: e, metadata: c, addInitializer: (l) => r._ ? q("Already initialized") : i.push(L(l || null)) }), V = (t, e) => X(e, $("metadata"), t[3]), Z = (t, e, r, c) => {
10
- for (var i = 0, l = t[e >> 1], o = l && l.length; i < o; i++) l[i].call(r);
11
- return c;
12
- }, ee = (t, e, r, c, i, l) => {
13
- var o, n, u, d = e & 7, g = !1, a = 0, p = t[a] || (t[a] = []), f = d && (i = i.prototype, d < 5 && (d > 3 || !g) && H(i, r));
14
- G(i, r);
15
- for (var v = c.length - 1; v >= 0; v--)
16
- u = J(d, r, n = {}, t[3], p), o = (0, c[v])(i, u), n._ = 1, L(o) && (i = o);
17
- return V(t, i), f && x(i, r, f), g ? d ^ 4 ? l : f : i;
9
+ }, X = (t, e, r) => e in t ? x(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, Y = (t, e) => x(t, "name", { value: e, configurable: !0 }), G = (t) => [, , , W(t?.[q("metadata")] ?? null)], K = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], L = (t) => t !== void 0 && typeof t != "function" ? $("Function expected") : t, J = (t, e, r, a, i) => ({ kind: K[t], name: e, metadata: a, addInitializer: (c) => r._ ? $("Already initialized") : i.push(L(c || null)) }), V = (t, e) => X(e, q("metadata"), t[3]), Z = (t, e, r, a) => {
10
+ for (var i = 0, c = t[e >> 1], o = c && c.length; i < o; i++) c[i].call(r);
11
+ return a;
12
+ }, ee = (t, e, r, a, i, c) => {
13
+ var o, n, u, d = e & 7, p = !1, l = 0, g = t[l] || (t[l] = []), f = d && (i = i.prototype, d < 5 && (d > 3 || !p) && H(i, r));
14
+ Y(i, r);
15
+ for (var v = a.length - 1; v >= 0; v--)
16
+ u = J(d, r, n = {}, t[3], g), o = (0, a[v])(i, u), n._ = 1, L(o) && (i = o);
17
+ return V(t, i), f && x(i, r, f), p ? d ^ 4 ? c : f : i;
18
18
  }, M, _, N;
19
19
  M = [A(["sitemeta", "quickEdit"]), C(
20
20
  m.object({
@@ -26,13 +26,13 @@ M = [A(["sitemeta", "quickEdit"]), C(
26
26
  )];
27
27
  class w extends (N = I) {
28
28
  constructor(e) {
29
- const r = e.sitemeta.mwConfig, c = r.wgArticlePath.replace("$1", ""), i = `${location.protocol}//${r.wgServer.split("//")[1]}`;
29
+ const r = e.sitemeta.mwConfig, a = r.wgArticlePath.replace("$1", ""), i = `${location.protocol}//${r.wgServer.split("//")[1]}`;
30
30
  super(
31
31
  e,
32
32
  {
33
33
  wikiBaseUrl: i,
34
- wikiArticlePath: c,
35
- wikiArticleBaseUrl: `${i}${c}`,
34
+ wikiArticlePath: a,
35
+ wikiArticleBaseUrl: `${i}${a}`,
36
36
  wikiScriptBaseUrl: `${i}${r.wgScriptPath}`,
37
37
  linkClassName: "ipe-quickEdit__in-article-link"
38
38
  },
@@ -42,21 +42,21 @@ class w extends (N = I) {
42
42
  async start() {
43
43
  mw.hook("wikipage.content").add(() => {
44
44
  document.querySelectorAll("#mw-content-text a[href]").forEach((r) => {
45
- const c = this.checkEditAnchor(r);
46
- if (!c || r.dataset.ipeQuickEditLink)
45
+ const a = this.checkEditAnchor(r);
46
+ if (!a || r.dataset.ipeQuickEditLink)
47
47
  return;
48
48
  const i = /* @__PURE__ */ s(
49
49
  "a",
50
50
  {
51
- href: `#/IPE/quickEdit/${c.title}`,
51
+ href: `#/IPE/quickEdit/${a.title}`,
52
52
  className: this.config.linkClassName,
53
53
  style: {
54
54
  userSelect: "none",
55
55
  marginLeft: "0.2em",
56
56
  verticalAlign: "middle"
57
57
  },
58
- onClick: (l) => {
59
- l.preventDefault(), this.ctx.quickEdit(c);
58
+ onClick: (c) => {
59
+ c.preventDefault(), this.ctx.quickEdit(a);
60
60
  },
61
61
  children: /* @__PURE__ */ s(
62
62
  "svg",
@@ -95,11 +95,11 @@ class w extends (N = I) {
95
95
  const r = e.href || "";
96
96
  if (!r.startsWith(this.config.wikiArticleBaseUrl) && !r.startsWith(this.config.wikiScriptBaseUrl))
97
97
  return null;
98
- const c = new URL(r), i = c.searchParams, l = i.get("action") || "view", o = i.get("title") || decodeURI(c.pathname.substring(this.config.wikiArticlePath.length)) || "", n = i.get("section")?.replace(/^T-/, "") || void 0, u = i.get("oldid");
98
+ const a = new URL(r), i = a.searchParams, c = i.get("action") || "view", o = i.get("title") || decodeURI(a.pathname.substring(this.config.wikiArticlePath.length)) || "", n = i.get("section")?.replace(/^T-/, "") || void 0, u = i.get("oldid");
99
99
  if (
100
100
  // 不合法的 title
101
101
  !o || o.endsWith(".php") || // 不是 edit 相关操作
102
- !["edit", "editsource", "editredlink", "submit"].includes(l) || // 暂时未兼容 undo
102
+ !["edit", "editsource", "editredlink", "submit"].includes(c) || // 暂时未兼容 undo
103
103
  i.get("undo") || // 暂时未兼容 preload
104
104
  i.get("preload")
105
105
  )
@@ -113,22 +113,22 @@ class w extends (N = I) {
113
113
  };
114
114
  }
115
115
  }
116
- _ = K(N);
116
+ _ = G(N);
117
117
  w = ee(_, 0, "PluginQuickEditInArticleLinks", M, w);
118
118
  Z(_, 1, w);
119
119
  const P = () => {
120
120
  };
121
- var te = Object.create, b = Object.defineProperty, ie = Object.getOwnPropertyDescriptor, B = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), O = (t) => {
121
+ var te = Object.create, b = Object.defineProperty, ie = Object.getOwnPropertyDescriptor, O = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), T = (t) => {
122
122
  throw TypeError(t);
123
- }, re = (t, e, r) => e in t ? b(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, ne = (t, e) => b(t, "name", { value: e, configurable: !0 }), oe = (t) => [, , , te(t?.[B("metadata")] ?? null)], se = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], T = (t) => t !== void 0 && typeof t != "function" ? O("Function expected") : t, ce = (t, e, r, c, i) => ({ kind: se[t], name: e, metadata: c, addInitializer: (l) => r._ ? O("Already initialized") : i.push(T(l || null)) }), ae = (t, e) => re(e, B("metadata"), t[3]), le = (t, e, r, c) => {
124
- for (var i = 0, l = t[e >> 1], o = l && l.length; i < o; i++) l[i].call(r);
125
- return c;
126
- }, de = (t, e, r, c, i, l) => {
127
- var o, n, u, d = e & 7, g = !1, a = 0, p = t[a] || (t[a] = []), f = d && (i = i.prototype, d < 5 && (d > 3 || !g) && ie(i, r));
123
+ }, re = (t, e, r) => e in t ? b(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, ne = (t, e) => b(t, "name", { value: e, configurable: !0 }), oe = (t) => [, , , te(t?.[O("metadata")] ?? null)], se = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], B = (t) => t !== void 0 && typeof t != "function" ? T("Function expected") : t, ae = (t, e, r, a, i) => ({ kind: se[t], name: e, metadata: a, addInitializer: (c) => r._ ? T("Already initialized") : i.push(B(c || null)) }), ce = (t, e) => re(e, O("metadata"), t[3]), le = (t, e, r, a) => {
124
+ for (var i = 0, c = t[e >> 1], o = c && c.length; i < o; i++) c[i].call(r);
125
+ return a;
126
+ }, de = (t, e, r, a, i, c) => {
127
+ var o, n, u, d = e & 7, p = !1, l = 0, g = t[l] || (t[l] = []), f = d && (i = i.prototype, d < 5 && (d > 3 || !p) && ie(i, r));
128
128
  ne(i, r);
129
- for (var v = c.length - 1; v >= 0; v--)
130
- u = ce(d, r, n = {}, t[3], p), o = (0, c[v])(i, u), n._ = 1, T(o) && (i = o);
131
- return ae(t, i), f && b(i, r, f), g ? d ^ 4 ? l : f : i;
129
+ for (var v = a.length - 1; v >= 0; v--)
130
+ u = ae(d, r, n = {}, t[3], g), o = (0, a[v])(i, u), n._ = 1, B(o) && (i = o);
131
+ return ce(t, i), f && b(i, r, f), p ? d ^ 4 ? c : f : i;
132
132
  }, j, S, F;
133
133
  j = [A(["api", "wikiPage", "modal", "preferences"]), C(
134
134
  m.object({
@@ -178,16 +178,19 @@ class k extends (F = I) {
178
178
  pageId: mw.config.get("wgArticleId"),
179
179
  revision: mw.config.get("wgRevisionId")
180
180
  });
181
- const r = await this.ctx.preferences.get("outSideClose"), c = await this.ctx.preferences.get("watchList"), i = typeof e.editSummary == "string" ? e.editSummary : await this.ctx.preferences.get("editSummary"), l = typeof e.editMinor == "boolean" ? e.editMinor : await this.ctx.preferences.get("editMinor"), o = {
181
+ const r = await this.ctx.preferences.get("outSideClose"), a = await this.ctx.preferences.get("watchList"), i = typeof e.editSummary == "string" ? e.editSummary : await this.ctx.preferences.get("editSummary"), c = typeof e.editMinor == "boolean" ? e.editMinor : await this.ctx.preferences.get("editMinor"), o = {
182
182
  ...this.DEFAULT_OPTIONS,
183
183
  editSummary: i,
184
- editMinor: l,
184
+ editMinor: c,
185
185
  ...e
186
186
  };
187
187
  o.editSummary || (o.editSummary = await this.ctx.preferences.get("editSummary") || ""), o || this.ctx.emit("quickEdit/initOptions", { ctx: this.ctx, options: o });
188
188
  const n = this.ctx.modal.createObject({
189
- className: "in-page-edit ipe-quickEdit ipe-editor",
189
+ className: "ipe-quickEdit",
190
190
  sizeClass: "large",
191
+ // backdrop: false,
192
+ // draggable: true,
193
+ center: !1,
191
194
  outSideClose: r
192
195
  }).init();
193
196
  n.setTitle(
@@ -207,27 +210,25 @@ class k extends (F = I) {
207
210
  justifyContent: "center",
208
211
  alignItems: "center"
209
212
  },
210
- children: /* @__PURE__ */ s(Q, {})
213
+ children: /* @__PURE__ */ s(U, {})
211
214
  }
212
215
  )
213
- ), n.setButtons([
214
- {
215
- side: "right",
216
- type: "button",
217
- className: "btn btn-danger btn-secondary",
218
- label: "Cancel",
219
- method() {
220
- n.close();
221
- }
216
+ ), n.addButton({
217
+ side: "right",
218
+ type: "button",
219
+ className: "is-danger is-ghost",
220
+ label: "Cancel",
221
+ method() {
222
+ n.close();
222
223
  }
223
- ]), n.show(), this.ctx.emit("quickEdit/showModal", { ctx: this.ctx, modal: n, options: o });
224
+ }), n.show(), this.ctx.emit("quickEdit/showModal", { ctx: this.ctx, modal: n, options: o });
224
225
  let u;
225
226
  try {
226
227
  u = await this.getWikiPageFromPayload(o);
227
- } catch (a) {
228
+ } catch (l) {
228
229
  n.close(), this.ctx.modal.notify("error", {
229
230
  title: "Error",
230
- content: a instanceof Error ? a.message : String(a)
231
+ content: l instanceof Error ? l.message : String(l)
231
232
  });
232
233
  return;
233
234
  }
@@ -241,7 +242,7 @@ class k extends (F = I) {
241
242
  ] })
242
243
  );
243
244
  const d = /* @__PURE__ */ s("form", { className: "ipe-quickEdit-form", children: [
244
- u.pageInfo.pageid === 0 && /* @__PURE__ */ s(U, { title: "Attention", type: "important", children: /* @__PURE__ */ s("p", { children: "This page does not exist." }) }),
245
+ u.pageInfo.pageid === 0 && /* @__PURE__ */ s(D, { title: "Attention", type: "important", children: /* @__PURE__ */ s("p", { children: "This page does not exist." }) }),
245
246
  /* @__PURE__ */ s("textarea", { className: "editArea", name: "text", id: "wpTextbox1", children: u.revisions[0]?.content || "" }),
246
247
  /* @__PURE__ */ s(
247
248
  "div",
@@ -250,26 +251,27 @@ class k extends (F = I) {
250
251
  style: {
251
252
  display: "flex",
252
253
  flexDirection: "column",
253
- gap: "1rem"
254
+ gap: "1rem",
255
+ marginTop: "1rem"
254
256
  },
255
257
  children: [
256
- /* @__PURE__ */ s(D, { label: "Summary", id: "summary", name: "summary", value: o.editSummary }),
257
- /* @__PURE__ */ s("div", { children: [
258
+ /* @__PURE__ */ s(z, { label: "Summary", id: "summary", name: "summary", value: o.editSummary }),
259
+ /* @__PURE__ */ s("div", { className: "ipe-input-box", children: [
258
260
  /* @__PURE__ */ s("label", { htmlFor: "watchlist", style: { display: "block" }, children: "Watchlist" }),
259
261
  /* @__PURE__ */ s("div", { style: { display: "flex", gap: "1rem" }, children: [
260
262
  h.preferences,
261
263
  h.nochange,
262
264
  h.watch,
263
265
  h.unwatch
264
- ].map((a) => /* @__PURE__ */ s(
265
- z,
266
+ ].map((l) => /* @__PURE__ */ s(
267
+ Q,
266
268
  {
267
269
  name: "watchlist",
268
- value: a,
269
- inputProps: { checked: c === a },
270
- children: a
270
+ value: l,
271
+ inputProps: { checked: a === l },
272
+ children: l
271
273
  },
272
- a
274
+ l
273
275
  )) })
274
276
  ] }),
275
277
  /* @__PURE__ */ s("div", { style: { display: "flex", gap: "1rem" }, children: [
@@ -281,55 +283,52 @@ class k extends (F = I) {
281
283
  ),
282
284
  !1
283
285
  ] });
284
- n.setContent(d);
285
- const g = n.generateButton({
286
- side: "left",
287
- className: "btn btn-primary submit-btn",
288
- label: "Submit",
289
- method: () => {
290
- const a = new FormData(d);
291
- console.info(u, d, {
292
- text: a.get("text"),
293
- summary: a.get("summary"),
294
- minor: a.get("minor") === "on"
295
- }), n.setLoadingState(!0), this.handleSubmit(
296
- { ctx: this.ctx, modal: n, wikiPage: u, options: o },
297
- {
298
- text: a.get("text"),
299
- summary: a.get("summary"),
300
- minor: a.get("minor") === "on"
301
- }
302
- ).then(async () => {
303
- n.setOptions({
304
- beforeClose: P
305
- }), n.close(), this.ctx.modal.notify("success", {
306
- title: "Submission Successful",
307
- content: "Your changes have been saved."
308
- }), a.get("reloadAfterSave") && (await R(500), location.reload());
309
- }).catch((p) => {
310
- this.ctx.modal.notify("error", {
311
- title: "Submission Error",
312
- content: p instanceof Error ? p.message : String(p)
313
- }), n.setLoadingState(!1);
314
- });
315
- }
316
- });
317
- n.get$buttons("leftButtons").prepend(g), n.setOptions({
286
+ n.setContent(d), n.addButton(
287
+ {
288
+ side: "left",
289
+ className: "is-primary submit-btn",
290
+ label: "Submit",
291
+ method: () => {
292
+ const l = new FormData(d);
293
+ n.setLoadingState(!0), this.handleSubmit(
294
+ { ctx: this.ctx, modal: n, wikiPage: u, options: o },
295
+ {
296
+ text: l.get("text"),
297
+ summary: l.get("summary"),
298
+ minor: l.get("minor") === "on"
299
+ }
300
+ ).then(async () => {
301
+ n.setOptions({
302
+ beforeClose: P
303
+ }), n.close(), this.ctx.modal.notify("success", {
304
+ title: "Submission Successful",
305
+ content: "Your changes have been saved."
306
+ }), l.get("reloadAfterSave") && (await R(500), location.reload());
307
+ }).catch((g) => {
308
+ this.ctx.modal.notify("error", {
309
+ title: "Submission Error",
310
+ content: g instanceof Error ? g.message : String(g)
311
+ }), n.setLoadingState(!1);
312
+ });
313
+ }
314
+ },
315
+ 0
316
+ ), n.setOptions({
318
317
  beforeClose: () => {
319
- const a = u.revisions[0]?.content || "";
320
- return (d.querySelector("textarea")?.value || "") === a ? !0 : (this.ctx.modal.confirm(
318
+ const l = u.revisions[0]?.content || "";
319
+ return (d.querySelector("textarea")?.value || "") === l ? !0 : (this.ctx.modal.confirm(
321
320
  {
322
- className: "in-page-edit",
321
+ className: "is-primary",
323
322
  title: "Unsaved Changes",
324
323
  content: "All edit contents will be lost after closing the modal. Are you sure you want to close?",
325
324
  center: !0,
326
325
  okBtn: {
327
326
  label: "Give Up",
328
- className: "btn btn-danger"
327
+ className: "is-danger is-ghost"
329
328
  },
330
329
  cancelBtn: {
331
330
  label: "Continue",
332
- className: "btn"
331
+ className: "is-primary is-ghost"
333
332
  }
334
333
  },
335
334
  (f) => (f && (n.setOptions({
@@ -343,17 +342,21 @@ class k extends (F = I) {
343
342
  modal: n,
344
343
  wikiPage: u
345
344
  });
345
+ const p = (l) => d.querySelector("textarea")?.value === u.revisions[0]?.content ? !0 : (l.preventDefault(), "You have unsaved changes. Are you sure you want to leave?");
346
+ window.addEventListener("beforeunload", p), n.on(n.Event.Close, () => {
347
+ window.removeEventListener("beforeunload", p);
348
+ });
346
349
  }
347
350
  handleSubmit(e, r) {
348
- const c = r.summary || "", i = r.text || "", l = r.minor || !1, o = r.createonly || !1, n = r.watchlist || h.nochange;
351
+ const a = r.summary || "", i = r.text || "", c = r.minor || !1, o = r.createonly || !1, n = r.watchlist || h.nochange;
349
352
  return e.wikiPage.edit(
350
353
  {
351
- summary: c,
354
+ summary: a,
352
355
  text: i,
353
356
  watchlist: n
354
357
  },
355
358
  {
356
- minor: l,
359
+ minor: c,
357
360
  createonly: o
358
361
  }
359
362
  );
@@ -407,4 +410,4 @@ le(S, 1, k);
407
410
  export {
408
411
  k as PluginQuickEdit
409
412
  };
410
- //# sourceMappingURL=index-Ch5DJDZZ.js.map
413
+ //# sourceMappingURL=index-BxR7MsNM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BxR7MsNM.js","sources":["../src/models/WikiPage/types/WatchlistAction.ts","../src/plugins/quick-edit/PluginQuickEditInArticleLinks.tsx","../src/utils/noop.ts","../src/plugins/quick-edit/index.tsx"],"sourcesContent":["export enum WatchlistAction {\n preferences = 'preferences',\n watch = 'watch',\n unwatch = 'unwatch',\n nochange = 'nochange',\n}\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { QuickEditOptions } from '.'\n\n@Inject(['sitemeta', 'quickEdit'])\n@RegisterPreferences(\n Schema.object({\n redLinkEdit: Schema.boolean()\n .description('Show quick edit entry after red links')\n .default(true),\n }).description('In-article quick edit links'),\n {\n redLinkEdit: true,\n }\n)\nexport class PluginQuickEditInArticleLinks extends BasePlugin<{\n wikiBaseUrl: string\n wikiArticlePath: string\n wikiArticleBaseUrl: string\n wikiScriptBaseUrl: string\n linkClassName: string\n}> {\n constructor(ctx: InPageEdit) {\n const mwConfig = ctx.sitemeta.mwConfig\n const wikiArticlePath = mwConfig.wgArticlePath.replace('$1', '')\n const wikiBaseUrl = `${location.protocol}//${mwConfig.wgServer.split('//')[1]}`\n super(\n ctx,\n {\n wikiBaseUrl,\n wikiArticlePath,\n wikiArticleBaseUrl: `${wikiBaseUrl}${wikiArticlePath}`,\n wikiScriptBaseUrl: `${wikiBaseUrl}${mwConfig.wgScriptPath}`,\n linkClassName: 'ipe-quickEdit__in-article-link',\n },\n 'QuickEditInArticleLinks'\n )\n }\n\n protected async start() {\n mw.hook('wikipage.content').add(() => {\n const anchorList = document.querySelectorAll<HTMLAnchorElement>('#mw-content-text a[href]')\n anchorList.forEach((anchor) => {\n const info = this.checkEditAnchor(anchor)\n if (!info || anchor.dataset.ipeQuickEditLink) {\n return\n }\n\n const link = (\n <a\n href={`#/IPE/quickEdit/${info.title}`}\n className={this.config.linkClassName}\n style={{\n userSelect: 'none',\n marginLeft: '0.2em',\n verticalAlign: 'middle',\n }}\n onClick={(e) => {\n e.preventDefault()\n this.ctx.quickEdit(info)\n }}\n >\n <svg\n style=\"width: 1em; height: 1em\"\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-pencil-bolt\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4\" />\n <path d=\"M13.5 6.5l4 4\" />\n <path d=\"M19 16l-2 3h4l-2 3\" />\n </svg>\n </a>\n )\n\n anchor.insertAdjacentElement('afterend', link)\n anchor.dataset.ipeQuickEditLink = 'true'\n })\n })\n }\n\n stop() {\n document.querySelectorAll(`.${this.config.linkClassName}`).forEach((el) => el.remove())\n }\n\n checkEditAnchor(\n anchor: HTMLAnchorElement\n ): Pick<QuickEditOptions, 'title' | 'section' | 'revision' | 'createOnly'> | null {\n if (!(anchor instanceof HTMLAnchorElement)) {\n return null\n }\n\n const href = anchor.href || ''\n if (\n !href.startsWith(this.config.wikiArticleBaseUrl) &&\n !href.startsWith(this.config.wikiScriptBaseUrl)\n ) {\n return null\n }\n const hrefURL = new URL(href)\n const params = hrefURL.searchParams\n const action = params.get('action') || 'view'\n const title =\n params.get('title') ||\n decodeURI(hrefURL.pathname.substring(this.config.wikiArticlePath.length)) ||\n ''\n const section = params.get('section')?.replace(/^T-/, '') || undefined\n const revision = params.get('oldid')\n\n if (\n // 不合法的 title\n !title ||\n title.endsWith('.php') ||\n // 不是 edit 相关操作\n !['edit', 'editsource', 'editredlink', 'submit'].includes(action) ||\n // 暂时未兼容 undo\n params.get('undo') ||\n // 暂时未兼容 preload\n params.get('preload')\n ) {\n return null\n }\n\n let sectionNum: 'new' | number | undefined = undefined\n if (section === 'new') {\n sectionNum = 'new'\n } else if (section && /^\\d+$/.test(section)) {\n sectionNum = parseInt(section, 10)\n }\n\n return {\n title,\n section: sectionNum,\n revision: parseInt('' + revision, 10) || 0,\n createOnly: !!params.get('redlink'),\n }\n }\n}\n","export const noop = () => {}\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { WikiPage } from '@/models/WikiPage'\nimport { WatchlistAction } from '@/models/WikiPage/types/WatchlistAction'\nimport { PluginQuickEditInArticleLinks } from './PluginQuickEditInArticleLinks'\nimport { IPEModal } from '@/services/ModalService/IPEModal'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickEdit: PluginQuickEdit['quickEdit']\n }\n interface Events {\n 'quickEdit/initOptions'(payload: Omit<QuickEditInitPayload, 'modal' | 'wikiPage'>): void\n 'quickEdit/showModal'(payload: Omit<QuickEditInitPayload, 'wikiPage'>): void\n 'quickEdit/wikiPage'(payload: QuickEditInitPayload): void\n }\n}\n\nexport interface QuickEditOptions {\n title: string\n pageId: number\n revision: number\n /**\n * - `undefined` for full article edit\n * - `0` for the first section\n * - `\"new\"` for a new section\n */\n section: number | 'new' | undefined\n editMinor: boolean\n editSummary: string\n createOnly: boolean\n reloadAfterSave: boolean\n}\n\nexport interface QuickEditInitPayload {\n ctx: InPageEdit\n options: QuickEditOptions\n modal: IPEModal\n wikiPage: WikiPage\n}\n\nexport interface QuickEditSubmitPayload {\n text?: string\n summary?: string\n minor?: boolean\n createonly?: boolean\n watchlist?: WatchlistAction\n}\n\n@Inject(['api', 'wikiPage', 'modal', 'preferences'])\n@RegisterPreferences(\n Schema.object({\n editSummary: Schema.string()\n .description('Default edit summary for quick edits')\n .default('[IPE-NEXT] Quick edit'),\n editMinor: Schema.boolean().description('Whether to mark the edit as minor').default(false),\n outSideClose: Schema.boolean().description('Whether to close the modal outside').default(true),\n watchList: Schema.union([\n Schema.const(WatchlistAction.preferences).description('Follow my preferences'),\n Schema.const(WatchlistAction.nochange).description('Keep the current watchlist status'),\n Schema.const(WatchlistAction.watch).description('Add the page to watchlist'),\n Schema.const(WatchlistAction.unwatch).description('Remove the page from watchlist'),\n ])\n .description('Watchlist options')\n .default(WatchlistAction.preferences),\n })\n .description('Quick edit options')\n .extra('category', 'edit'),\n {\n editSummary: '[IPE-NEXT] Quick edit',\n editMinor: false,\n outSideClose: true,\n watchList: WatchlistAction.preferences,\n }\n)\nexport class PluginQuickEdit extends BasePlugin {\n private readonly DEFAULT_OPTIONS: QuickEditOptions = {\n title: '',\n pageId: 0,\n revision: 0,\n section: undefined,\n editMinor: false,\n editSummary: '',\n createOnly: false,\n reloadAfterSave: true,\n }\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-edit')\n }\n\n protected start(): Promise<void> | void {\n this.ctx.root.set('quickEdit', this.quickEdit.bind(this))\n this.ctx.inject(['toolbox'], (ctx) => {\n this.injectToolbox(ctx)\n ctx.on('dispose', () => {\n this.removeToolbox(ctx)\n })\n })\n\n this.ctx.plugin(PluginQuickEditInArticleLinks)\n }\n\n async quickEdit(payload?: string | Partial<QuickEditOptions>) {\n if (typeof payload === 'undefined') {\n payload = {}\n } else if (typeof payload === 'string') {\n payload = {\n title: payload,\n } as Partial<QuickEditOptions>\n }\n\n // @ts-expect-error legacy `page` option\n if (payload?.page) {\n // @ts-expect-error\n payload.title = payload.page\n // @ts-expect-error\n delete payload.page\n }\n\n if (!payload.title && !payload.pageId && !payload.revision) {\n this.logger.warn('None of the title, pageId or revision provided. Using defaults.')\n payload = {\n ...payload,\n title: mw.config.get('wgPageName'),\n pageId: mw.config.get('wgArticleId'),\n revision: mw.config.get('wgRevisionId'),\n }\n }\n\n const outSideClose = (await this.ctx.preferences.get<boolean>('outSideClose'))!\n const watchList = (await this.ctx.preferences.get<WatchlistAction>('watchList'))!\n const editSummary =\n typeof payload.editSummary === 'string'\n ? payload.editSummary\n : (await this.ctx.preferences.get<string>('editSummary'))!\n const editMinor =\n typeof payload.editMinor === 'boolean'\n ? payload.editMinor\n : (await this.ctx.preferences.get<boolean>('editMinor'))!\n\n const options: QuickEditOptions = {\n ...this.DEFAULT_OPTIONS,\n editSummary,\n editMinor,\n ...payload,\n }\n if (!options.editSummary) {\n options.editSummary = (await this.ctx.preferences.get<string>('editSummary')) || ''\n }\n if (!options) this.ctx.emit('quickEdit/initOptions', { ctx: this.ctx, options })\n\n const modal = this.ctx.modal\n .createObject({\n className: 'ipe-quickEdit',\n sizeClass: 'large',\n // backdrop: false,\n // draggable: true,\n center: false,\n outSideClose,\n })\n .init()\n modal.setTitle(\n (\n <>\n Loading: <u>{options.title}</u>\n </>\n ) as HTMLElement\n )\n modal.setContent(\n (\n <section\n className=\"ipe-quickEdit-loading\"\n style={{\n height: '70vh',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <ProgressBar />\n </section>\n ) as HTMLElement\n )\n modal.addButton({\n side: 'right',\n type: 'button',\n className: 'is-danger is-ghost',\n label: 'Cancel',\n method() {\n modal.close()\n },\n })\n modal.show()\n this.ctx.emit('quickEdit/showModal', { ctx: this.ctx, modal, options })\n\n let wikiPage: WikiPage\n try {\n wikiPage = await this.getWikiPageFromPayload(options)\n } catch (e) {\n modal.close()\n this.ctx.modal.notify('error', {\n title: 'Error',\n content: e instanceof Error ? e.message : String(e),\n })\n return\n }\n modal.setTitle(\n (\n <>\n Quick {wikiPage.pageInfo.pageid === 0 ? 'Create' : 'Edit'}:{' '}\n <u>{wikiPage.pageInfo.title}</u>\n </>\n ) as HTMLElement\n )\n const editForm = (\n <form className=\"ipe-quickEdit-form\">\n {/* 页面不存在 */}\n {wikiPage.pageInfo.pageid === 0 && (\n <MBox title=\"Attention\" type=\"important\">\n <p>This page does not exist.</p>\n </MBox>\n )}\n <textarea className=\"editArea\" name=\"text\" id=\"wpTextbox1\">\n {wikiPage.revisions[0]?.content || ''}\n </textarea>\n <div\n class=\"ipe-quickEdit-options\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n marginTop: '1rem',\n }}\n >\n <InputBox label=\"Summary\" id=\"summary\" name=\"summary\" value={options.editSummary} />\n <div className=\"ipe-input-box\">\n <label htmlFor=\"watchlist\" style={{ display: 'block' }}>\n Watchlist\n </label>\n <div style={{ display: 'flex', gap: '1rem' }}>\n {[\n WatchlistAction.preferences,\n WatchlistAction.nochange,\n WatchlistAction.watch,\n WatchlistAction.unwatch,\n ].map((action) => (\n <RadioBox\n key={action}\n name=\"watchlist\"\n value={action}\n inputProps={{ checked: watchList === action }}\n >\n {action}\n </RadioBox>\n ))}\n </div>\n </div>\n <div style={{ display: 'flex', gap: '1rem' }}>\n <CheckBox name=\"minor\" id=\"minor\" checked={options.editMinor}>\n Minor edit\n </CheckBox>\n <CheckBox name=\"reloadAfterSave\" id=\"reloadAfterSave\" checked={options.reloadAfterSave}>\n Reload after save\n </CheckBox>\n </div>\n </div>\n {/* Debug Info */}\n {import.meta.env.DEV && (\n <div className=\"debug\" style={{ marginTop: '1rem' }}>\n <details>\n <pre>{JSON.stringify(wikiPage.pageInfo, null, 2)}</pre>\n </details>\n </div>\n )}\n </form>\n ) as HTMLFormElement\n modal.setContent(editForm)\n // shamefully fix: make sure the submit button is always the first\n modal.addButton(\n {\n side: 'left',\n className: 'is-primary submit-btn',\n label: 'Submit',\n method: () => {\n const formData = new FormData(editForm)\n console.info(wikiPage, editForm, {\n text: formData.get('text') as string,\n summary: formData.get('summary') as string,\n minor: formData.get('minor') === 'on',\n })\n modal.setLoadingState(true)\n this.handleSubmit(\n { ctx: this.ctx, modal, wikiPage, options },\n {\n text: formData.get('text') as string,\n summary: formData.get('summary') as string,\n minor: formData.get('minor') === 'on',\n }\n )\n .then(async () => {\n modal.setOptions({\n beforeClose: noop,\n })\n modal.close()\n this.ctx.modal.notify('success', {\n title: 'Submission Successful',\n content: 'Your changes have been saved.',\n })\n if (formData.get('reloadAfterSave')) {\n await sleep(500)\n location.reload()\n }\n })\n .catch((error) => {\n this.ctx.modal.notify('error', {\n title: 'Submission Error',\n content: error instanceof Error ? error.message : String(error),\n })\n modal.setLoadingState(false)\n })\n },\n },\n 0\n )\n modal.setOptions({\n beforeClose: () => {\n const oldStr = wikiPage.revisions[0]?.content || ''\n const newStr = editForm.querySelector('textarea')?.value || ''\n if (newStr === oldStr) {\n return true\n } else {\n this.ctx.modal.confirm(\n {\n className: 'is-primary',\n title: 'Unsaved Changes',\n content:\n 'All edit contents will be lost after closing the modal. Are you sure you want to close?',\n center: true,\n okBtn: {\n label: 'Give Up',\n className: 'is-danger is-ghost',\n },\n cancelBtn: {\n label: 'Continue',\n className: 'is-primary is-ghost',\n },\n },\n (result) => {\n if (result) {\n modal.setOptions({\n beforeClose: noop,\n })\n modal.close()\n }\n return true\n }\n )\n return false\n }\n },\n })\n this.ctx.emit('quickEdit/wikiPage', {\n ctx: this.ctx,\n options,\n modal,\n wikiPage,\n })\n\n const beforeUnload = (e: BeforeUnloadEvent) => {\n if (editForm.querySelector('textarea')?.value === wikiPage.revisions[0]?.content) {\n return true\n }\n e.preventDefault()\n return 'You have unsaved changes. Are you sure you want to leave?'\n }\n window.addEventListener('beforeunload', beforeUnload)\n modal.on(modal.Event.Close, () => {\n window.removeEventListener('beforeunload', beforeUnload)\n })\n }\n\n private handleSubmit(init: QuickEditInitPayload, payload: QuickEditSubmitPayload) {\n const summary = payload.summary || ''\n const text = payload.text || ''\n const minor = payload.minor || false\n const createonly = payload.createonly || false\n const watchlist = payload.watchlist || WatchlistAction.nochange\n\n return init.wikiPage.edit(\n {\n summary,\n text,\n watchlist,\n },\n {\n minor,\n createonly,\n }\n )\n }\n\n private injectToolbox(ctx: InPageEdit) {\n ctx.toolbox.addButton({\n id: 'quick-edit',\n group: 'group1',\n index: 0,\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-edit\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\" />\n <path d=\"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z\" />\n <path d=\"M16 5l3 3\" />\n </svg>\n ) as HTMLElement,\n tooltip: 'Edit this page quickly',\n onClick: () => this.quickEdit(),\n })\n }\n\n private async getWikiPageFromPayload(payload: Partial<QuickEditOptions>) {\n if (payload.revision) {\n return this.ctx.wikiPage.newFromRevision(payload.revision, payload.section)\n } else if (payload.pageId) {\n return this.ctx.wikiPage.newFromPageId(payload.pageId, payload.section)\n } else if (payload.title) {\n return this.ctx.wikiPage.newFromTitle(payload.title, false, payload.section)\n }\n throw new Error('Invalid payload')\n }\n\n protected removeToolbox(ctx: InPageEdit) {\n ctx.toolbox.removeButton('quick-edit')\n }\n}\n"],"names":["WatchlistAction","_PluginQuickEditInArticleLinks_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickEditInArticleLinks","BasePlugin","ctx","mwConfig","wikiArticlePath","wikiBaseUrl","anchor","info","link","jsx","e","jsxs","el","href","hrefURL","params","action","title","section","revision","sectionNum","__decoratorStart","__decorateElement","__runInitializers","noop","_PluginQuickEdit_decorators","PluginQuickEdit","payload","outSideClose","watchList","editSummary","editMinor","options","modal","Fragment","ProgressBar","wikiPage","editForm","MBox","InputBox","RadioBox","CheckBox","formData","sleep","error","oldStr","result","beforeUnload","init","summary","text","minor","createonly","watchlist"],"mappings":"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"}
@@ -4,20 +4,20 @@ import { R as B } from "./Preferences-Bg3J5Ur9.js";
4
4
  import { s as I } from "./sleep-DpyIipK-.js";
5
5
  var j = Object.create, x = Object.defineProperty, q = Object.getOwnPropertyDescriptor, w = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), _ = (t) => {
6
6
  throw TypeError(t);
7
- }, z = (t, e, o) => e in t ? x(t, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : t[e] = o, M = (t, e) => x(t, "name", { value: e, configurable: !0 }), E = (t) => [, , , j(t?.[w("metadata")] ?? null)], $ = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], y = (t) => t !== void 0 && typeof t != "function" ? _("Function expected") : t, N = (t, e, o, i, r) => ({ kind: $[t], name: e, metadata: i, addInitializer: (l) => o._ ? _("Already initialized") : r.push(y(l || null)) }), O = (t, e) => z(e, w("metadata"), t[3]), T = (t, e, o, i) => {
7
+ }, z = (t, e, o) => e in t ? x(t, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : t[e] = o, M = (t, e) => x(t, "name", { value: e, configurable: !0 }), E = (t) => [, , , j(t?.[w("metadata")] ?? null)], T = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], y = (t) => t !== void 0 && typeof t != "function" ? _("Function expected") : t, $ = (t, e, o, i, r) => ({ kind: T[t], name: e, metadata: i, addInitializer: (l) => o._ ? _("Already initialized") : r.push(y(l || null)) }), N = (t, e) => z(e, w("metadata"), t[3]), O = (t, e, o, i) => {
8
8
  for (var r = 0, l = t[e >> 1], d = l && l.length; r < d; r++) l[r].call(o);
9
9
  return i;
10
10
  }, L = (t, e, o, i, r, l) => {
11
- var d, b, u, a = e & 7, s = !1, c = 0, g = t[c] || (t[c] = []), p = a && (r = r.prototype, a < 5 && (a > 3 || !s) && q(r, o));
11
+ var d, b, p, a = e & 7, s = !1, c = 0, g = t[c] || (t[c] = []), u = a && (r = r.prototype, a < 5 && (a > 3 || !s) && q(r, o));
12
12
  M(r, o);
13
13
  for (var h = i.length - 1; h >= 0; h--)
14
- u = N(a, o, b = {}, t[3], g), d = (0, i[h])(r, u), b._ = 1, y(d) && (r = d);
15
- return O(t, r), p && x(r, o, p), s ? a ^ 4 ? l : p : r;
14
+ p = $(a, o, b = {}, t[3], g), d = (0, i[h])(r, p), b._ = 1, y(d) && (r = d);
15
+ return N(t, r), u && x(r, o, u), s ? a ^ 4 ? l : u : r;
16
16
  }, S, m, k;
17
17
  S = [B(
18
18
  v.object({
19
19
  toolboxAlwaysShow: v.boolean().description("Make the toolbox opened by default").default(!1)
20
- }),
20
+ }).description("Toolbox preferences"),
21
21
  {
22
22
  toolboxAlwaysShow: !1
23
23
  }
@@ -109,14 +109,14 @@ class f extends (k = C) {
109
109
  return e || (e = Math.random().toString(36).substring(2, 8)), `ipe-toolbox__${e.trim()}`.replace(/\s\.#/g, "-");
110
110
  }
111
111
  addButton(e) {
112
- let { id: o, group: i, icon: r, tooltip: l, buttonProps: d, onClick: b, index: u } = e;
112
+ let { id: o, group: i, icon: r, tooltip: l, buttonProps: d, onClick: b, index: p } = e;
113
113
  o = this.normalizeButtonId(o);
114
114
  const a = this.container.querySelector(`#${o}`);
115
115
  a && (this.ctx.logger("toolbox").warn(`Button with id ${o} already exists, replacing it.`), a.remove());
116
116
  let s = null;
117
117
  if (typeof i > "u" || i === "auto") {
118
- const g = this.container.querySelector(".btn-group.group1"), p = this.container.querySelector(".btn-group.group2"), h = g?.children.length || 0, P = p?.children.length || 0;
119
- s = h <= P ? g : p;
118
+ const g = this.container.querySelector(".btn-group.group1"), u = this.container.querySelector(".btn-group.group2"), h = g?.children.length || 0, P = u?.children.length || 0;
119
+ s = h <= P ? g : u;
120
120
  } else
121
121
  s = this.container.querySelector(`.btn-group.${i}`);
122
122
  if (!s) throw new Error(`Button group ${i} not found`);
@@ -124,7 +124,7 @@ class f extends (k = C) {
124
124
  /* @__PURE__ */ n("div", { class: "btn-tip", children: l }),
125
125
  /* @__PURE__ */ n("button", { id: `${o}-btn`, class: "ipe-toolbox-btn", ...d, children: r })
126
126
  ] });
127
- return typeof u == "number" ? u <= 0 ? s.prepend(c) : u >= s.children.length ? s.appendChild(c) : s.children[u]?.before(c) : s.appendChild(c), this.ctx.emit("toolbox/button/added", {
127
+ return typeof p == "number" ? p <= 0 ? s.prepend(c) : p >= s.children.length ? s.appendChild(c) : s.children[p]?.before(c) : s.appendChild(c), this.ctx.emit("toolbox/button/added", {
128
128
  ctx: this.ctx,
129
129
  button: c
130
130
  }), c;
@@ -135,8 +135,8 @@ class f extends (k = C) {
135
135
  }
136
136
  m = E(k);
137
137
  f = L(m, 0, "PluginToolbox", S, f);
138
- T(m, 1, f);
138
+ O(m, 1, f);
139
139
  export {
140
140
  f as PluginToolbox
141
141
  };
142
- //# sourceMappingURL=index-BsYzf3Yw.js.map
142
+ //# sourceMappingURL=index-CUXLgVhg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CUXLgVhg.js","sources":["../src/plugins/toolbox/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema, Service } from '@/InPageEdit'\nimport { ReactElement } from 'jsx-dom'\nimport './styles.scss'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n toolbox: PluginToolbox\n }\n interface Events {\n 'toolbox/button/added'(payload: { ctx: InPageEdit; button: HTMLElement }): void\n 'toolbox/button/removed'(payload: { ctx: InPageEdit; id: string }): void\n }\n}\n\n@RegisterPreferences(\n Schema.object({\n toolboxAlwaysShow: Schema.boolean()\n .description('Make the toolbox opened by default')\n .default(false),\n }).description('Toolbox preferences'),\n {\n toolboxAlwaysShow: false,\n }\n)\n@Inject(['preferences'])\nexport class PluginToolbox extends Service {\n container!: HTMLElement\n private forceShow = false\n\n constructor(public ctx: InPageEdit) {\n super(ctx, 'toolbox', false)\n }\n\n protected async start(): Promise<void> {\n if (mw && mw.config.get('wgIsArticle') === false && !this.forceShow) {\n this.container = this.createIndicatorForNotArticlePage()\n } else {\n this.container = this.createToolbox()\n }\n document.body.appendChild(this.container)\n await sleep(0) // wait nextTick\n this.ctx.preferences.get('toolboxAlwaysShow').then((val) => {\n if (val) {\n this.container.querySelector('#toolbox-toggle')?.classList.add('opened')\n this.container.querySelectorAll('.btn-group').forEach((el) => {\n el.classList.add('opened')\n })\n }\n })\n }\n\n protected stop(): void | Promise<void> {\n this.container?.remove()\n }\n\n private createToolbox() {\n const toggler = (\n <button\n className=\"ipe-toolbox-btn\"\n id=\"toolbox-toggle\"\n onClick={function (e) {\n const isOpened = this.classList.contains('opened')\n this.classList.toggle('opened', !isOpened)\n element.querySelectorAll('.btn-group').forEach((el) => {\n el.classList.toggle('opened', !isOpened)\n })\n }}\n >\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-plus\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 5l0 14\" />\n <path d=\"M5 12l14 0\" />\n </svg>\n </button>\n )\n const element = (\n <div id=\"ipe-edit-toolbox\">\n <ul className=\"btn-group group1\" style={{ display: 'flex', flexDirection: 'column' }}></ul>\n <ul className=\"btn-group group2\" style={{ display: 'flex', flexDirection: 'row' }}></ul>\n {toggler}\n </div>\n )\n\n return element as HTMLElement\n }\n\n private createIndicatorForNotArticlePage() {\n const indicator = (\n <div id=\"ipe-edit-toolbox\">\n <div\n id=\"ipe-toolbox-placeholder\"\n style=\"width: 0.75rem; height: 0.75rem; border-radius: 50%; background: #3f51b5; color: #fff; pointer-events: none;\"\n >\n <svg\n style=\"width: 0.5em; height: 0.5em; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\"\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=\"4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-check\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M5 12l5 5l10 -10\" />\n </svg>\n </div>\n </div>\n )\n return indicator as HTMLElement\n }\n\n private normalizeButtonId(id: string) {\n if (!id) {\n id = Math.random().toString(36).substring(2, 8)\n }\n return `ipe-toolbox__${id.trim()}`.replace(/\\s\\.#/g, '-')\n }\n\n addButton(payload: {\n id: string\n group?: 'auto' | 'group1' | 'group2'\n icon: string | HTMLElement | SVGElement | ReactElement\n tooltip?: string | HTMLElement\n buttonProps?: Record<string, any>\n onClick?: (event: MouseEvent) => void\n index?: number\n }) {\n let { id, group, icon, tooltip, buttonProps, onClick, index } = payload\n id = this.normalizeButtonId(id)\n\n const existingButton = this.container.querySelector(`#${id}`)\n if (existingButton) {\n this.ctx.logger('toolbox').warn(`Button with id ${id} already exists, replacing it.`)\n existingButton.remove()\n }\n\n let groupEl: HTMLElement | null = null\n if (typeof group === 'undefined' || group === 'auto') {\n // 选择按钮最少的那一组,一样多就选第一组\n const group1 = this.container.querySelector('.btn-group.group1') as HTMLElement\n const group2 = this.container.querySelector('.btn-group.group2') as HTMLElement\n const group1Count = group1?.children.length || 0\n const group2Count = group2?.children.length || 0\n groupEl = group1Count <= group2Count ? group1 : group2\n } else {\n groupEl = this.container.querySelector(`.btn-group.${group}`)\n }\n if (!groupEl) throw new Error(`Button group ${group} not found`)\n\n const button = (\n <li class=\"btn-tip-group\" id={id} onClick={onClick}>\n <div class=\"btn-tip\">{tooltip}</div>\n <button id={`${id}-btn`} class=\"ipe-toolbox-btn\" {...buttonProps}>\n {icon}\n </button>\n </li>\n )\n\n if (typeof index === 'number') {\n if (index <= 0) {\n groupEl.prepend(button)\n } else if (index >= groupEl.children.length) {\n groupEl.appendChild(button)\n } else {\n groupEl.children[index]?.before(button)\n }\n } else {\n groupEl.appendChild(button)\n }\n\n this.ctx.emit('toolbox/button/added', {\n ctx: this.ctx,\n button: button as HTMLElement,\n })\n\n return button as HTMLElement\n }\n\n removeButton(id: string) {\n const button = this.container.querySelector(`.ipe-toolbox-btn#${id}`)\n button?.remove()\n this.ctx.emit('toolbox/button/removed', { ctx: this.ctx, id })\n }\n}\n"],"names":["_PluginToolbox_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginToolbox","Service","ctx","sleep","val","el","element","jsxs","jsx","e","isOpened","id","payload","group","icon","tooltip","buttonProps","onClick","index","existingButton","groupEl","group1","group2","group1Count","group2Count","button","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}