@inpageedit/core 0.5.4 → 0.6.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 (64) hide show
  1. package/dist/CheckBox-D3rHnX7I.js +13 -0
  2. package/dist/CheckBox-D3rHnX7I.js.map +1 -0
  3. package/dist/InputBox-BV4m05Xs.js +22 -0
  4. package/dist/InputBox-BV4m05Xs.js.map +1 -0
  5. package/dist/RadioBox-nJqWsxW2.js +13 -0
  6. package/dist/RadioBox-nJqWsxW2.js.map +1 -0
  7. package/dist/__test__/utils/constants.d.ts +2 -0
  8. package/dist/components/index.js +13 -11
  9. package/dist/components/index.js.map +1 -1
  10. package/dist/{index-i-Uf0vuA.js → index-5zB57uWM.js} +180 -178
  11. package/dist/{index-i-Uf0vuA.js.map → index-5zB57uWM.js.map} +1 -1
  12. package/dist/{index-xJ2bdsOD.js → index-B7Ok-t-3.js} +5 -5
  13. package/dist/{index-xJ2bdsOD.js.map → index-B7Ok-t-3.js.map} +1 -1
  14. package/dist/index-BHruEVsx.js +319 -0
  15. package/dist/index-BHruEVsx.js.map +1 -0
  16. package/dist/{index-DNQjqBV-.js → index-BnRuHI16.js} +3396 -3167
  17. package/dist/index-BnRuHI16.js.map +1 -0
  18. package/dist/{index-BSjnoNn2.js → index-BqqQgaGG.js} +6 -5
  19. package/dist/{index-BSjnoNn2.js.map → index-BqqQgaGG.js.map} +1 -1
  20. package/dist/index-Bs5MFAHs.js +110 -0
  21. package/dist/index-Bs5MFAHs.js.map +1 -0
  22. package/dist/index-C9QOZJ8o.js +167 -0
  23. package/dist/index-C9QOZJ8o.js.map +1 -0
  24. package/dist/{index-UyiZ7umI.js → index-CPCQc37I.js} +3 -3
  25. package/dist/{index-UyiZ7umI.js.map → index-CPCQc37I.js.map} +1 -1
  26. package/dist/{index-BedbUMp8.js → index-ClYojws9.js} +13 -12
  27. package/dist/{index-BedbUMp8.js.map → index-ClYojws9.js.map} +1 -1
  28. package/dist/{index-DtOC8Ck-.js → index-SDBp__LY.js} +2 -2
  29. package/dist/{index-DtOC8Ck-.js.map → index-SDBp__LY.js.map} +1 -1
  30. package/dist/index-clwjxJi5.js +295 -0
  31. package/dist/index-clwjxJi5.js.map +1 -0
  32. package/dist/index-lZkYoUca.js +46 -0
  33. package/dist/index-lZkYoUca.js.map +1 -0
  34. package/dist/index.js +1 -1
  35. package/dist/makeCallable-LDU0xZMJ.js +40 -0
  36. package/dist/makeCallable-LDU0xZMJ.js.map +1 -0
  37. package/dist/models/WikiPage/index.d.ts +2 -2
  38. package/dist/models/WikiTitle/index.d.ts +86 -11
  39. package/dist/models/WikiTitle/index.spec.d.ts +1 -0
  40. package/dist/noop-ClDc6zv4.js +6 -0
  41. package/dist/noop-ClDc6zv4.js.map +1 -0
  42. package/dist/plugins/in-article-links/index.d.ts +15 -7
  43. package/dist/plugins/quick-delete/index.d.ts +47 -0
  44. package/dist/plugins/quick-diff/PluginQuickDiffCore.d.ts +2 -2
  45. package/dist/plugins/quick-preview/index.d.ts +5 -2
  46. package/dist/services/SiteMetadataService.d.ts +7 -3
  47. package/dist/services/WikiPageService.d.ts +2 -2
  48. package/dist/services/WikiTitleService.d.ts +14 -0
  49. package/dist/style.css +1 -1
  50. package/dist/types/SiteMetadata.d.ts +1 -1
  51. package/lib/index.umd.js +28 -28
  52. package/lib/index.umd.js.map +1 -1
  53. package/lib/style.css +1 -1
  54. package/package.json +1 -1
  55. package/dist/InputBox-FIzJ-rPN.js +0 -30
  56. package/dist/InputBox-FIzJ-rPN.js.map +0 -1
  57. package/dist/RadioBox-CaA8VgLu.js +0 -54
  58. package/dist/RadioBox-CaA8VgLu.js.map +0 -1
  59. package/dist/index-DNQjqBV-.js.map +0 -1
  60. package/dist/index-e7eyr1FL.js +0 -96
  61. package/dist/index-e7eyr1FL.js.map +0 -1
  62. package/dist/index-rMDuLpcz.js +0 -458
  63. package/dist/index-rMDuLpcz.js.map +0 -1
  64. package/dist/plugins/quick-edit/PluginQuickEditInArticleLinks.d.ts +0 -14
@@ -0,0 +1,295 @@
1
+ import { j as i, F as f, P as R } from "./index-CvhkVj_L.js";
2
+ import { B as S, I as N, S as w } from "./index-BnRuHI16.js";
3
+ import { m as T } from "./makeCallable-LDU0xZMJ.js";
4
+ import { R as q } from "./Preferences-Bg3J5Ur9.js";
5
+ import { M as _ } from "./index-lZkYoUca.js";
6
+ import { I as E } from "./InputBox-BV4m05Xs.js";
7
+ import { n as y } from "./noop-ClDc6zv4.js";
8
+ var B = Object.create, x = Object.defineProperty, F = Object.getOwnPropertyDescriptor, k = (o, e) => (e = Symbol[o]) ? e : Symbol.for("Symbol." + o), b = (o) => {
9
+ throw TypeError(o);
10
+ }, M = (o, e, s) => e in o ? x(o, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : o[e] = s, j = (o, e) => x(o, "name", { value: e, configurable: !0 }), O = (o) => [, , , B(o?.[k("metadata")] ?? null)], A = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], P = (o) => o !== void 0 && typeof o != "function" ? b("Function expected") : o, L = (o, e, s, r, t) => ({ kind: A[o], name: e, metadata: r, addInitializer: (n) => s._ ? b("Already initialized") : t.push(P(n || null)) }), z = (o, e) => M(e, k("metadata"), o[3]), Q = (o, e, s, r) => {
11
+ for (var t = 0, n = o[e >> 1], a = n && n.length; t < a; t++) n[t].call(s);
12
+ return r;
13
+ }, U = (o, e, s, r, t, n) => {
14
+ var a, h, c, l = e & 7, g = !1, d = 0, C = o[d] || (o[d] = []), m = l && (t = t.prototype, l < 5 && (l > 3 || !g) && F(t, s));
15
+ j(t, s);
16
+ for (var p = r.length - 1; p >= 0; p--)
17
+ c = L(l, s, h = {}, o[3], C), a = (0, r[p])(t, c), h._ = 1, P(a) && (t = a);
18
+ return z(o, t), m && x(t, s, m), g ? l ^ 4 ? n : m : t;
19
+ }, I, v, D;
20
+ I = [N(["api", "wikiPage", "sitemeta", "modal", "preferences"]), q(
21
+ w.object({
22
+ deleteReason: w.string().description("Default delete reason for quick delete").default("[IPE-NEXT] Quick delete")
23
+ }).description("Quick delete options").extra("category", "delete")
24
+ )];
25
+ class u extends (D = S) {
26
+ constructor(e) {
27
+ super(e, {}, "quick-delete"), this.ctx = e, this.DEFAULT_OPTIONS = {
28
+ title: "",
29
+ pageId: 0,
30
+ revision: 0,
31
+ deleteReason: "",
32
+ reloadAfterDelete: !0
33
+ }, this.ctx.root.set("quickDelete", T(this, "showModal"));
34
+ }
35
+ start() {
36
+ this.ctx.inject(["toolbox"], (e) => {
37
+ this.injectToolbox(e), e.on("dispose", () => {
38
+ this.removeToolbox(e);
39
+ });
40
+ }), this.ctx.preferences.defineCategory({
41
+ label: "Delete",
42
+ name: "delete",
43
+ description: "Settings related to deleting pages",
44
+ index: 3
45
+ });
46
+ }
47
+ async showModal(e) {
48
+ typeof e > "u" ? e = {} : typeof e == "string" && (e = {
49
+ title: e
50
+ }), !e.title && !e.pageId && !e.revision && (this.logger.warn("None of the title, pageId or revision provided. Using defaults."), e = {
51
+ ...e,
52
+ title: this.ctx.sitemeta.mwConfig.get("wgPageName"),
53
+ pageId: this.ctx.sitemeta.mwConfig.get("wgArticleId"),
54
+ revision: this.ctx.sitemeta.mwConfig.get("wgRevisionId")
55
+ });
56
+ const s = typeof e.deleteReason == "string" ? e.deleteReason : await this.ctx.preferences.get("deleteReason"), r = {
57
+ ...this.DEFAULT_OPTIONS,
58
+ deleteReason: s,
59
+ ...e
60
+ };
61
+ r.deleteReason || (r.deleteReason = await this.ctx.preferences.get("deleteReason") || ""), r || this.ctx.emit("quick-delete/init-options", { ctx: this.ctx, options: r });
62
+ const t = this.ctx.modal.createObject({
63
+ className: "ipe-quickDelete",
64
+ sizeClass: "small",
65
+ center: !0
66
+ }).init();
67
+ t.setTitle(
68
+ /* @__PURE__ */ i(f, { children: [
69
+ "Loading: ",
70
+ /* @__PURE__ */ i("u", { children: r.title })
71
+ ] })
72
+ ), t.setContent(/* @__PURE__ */ i(R, {})), t.addButton({
73
+ side: "right",
74
+ type: "button",
75
+ className: "is-ghost",
76
+ label: "Cancel",
77
+ method() {
78
+ t.close();
79
+ }
80
+ }), t.show(), this.ctx.emit("quick-delete/show-modal", { ctx: this.ctx, modal: t, options: r });
81
+ let n;
82
+ try {
83
+ if (n = await this.getWikiPageFromPayload(r), n.pageInfo.special)
84
+ throw new Error("Special page cannot be deleted");
85
+ if (n.pageInfo.pageid === 0)
86
+ throw new Error("Page does not exist, cannot be deleted");
87
+ } catch (c) {
88
+ t.off(t.Event.Close), t.close(), this.ctx.modal.notify("error", {
89
+ content: c instanceof Error ? c.message : String(c)
90
+ });
91
+ return;
92
+ }
93
+ t.setTitle(
94
+ /* @__PURE__ */ i(f, { children: [
95
+ "Quick Delete: ",
96
+ /* @__PURE__ */ i("u", { children: n.pageInfo.title })
97
+ ] })
98
+ );
99
+ const a = [];
100
+ n.userCan("delete") || a.push(
101
+ /* @__PURE__ */ i(_, { title: "Permission Denied", type: "error", children: /* @__PURE__ */ i("p", { children: "You do not have permission to delete this page." }) })
102
+ ), n.pageInfo.protection && n.pageInfo.protection.length > 0 && a.push(
103
+ /* @__PURE__ */ i(_, { title: "Warning", type: "warning", children: /* @__PURE__ */ i("p", { children: "This page is protected and may has special use or purpose. Delete it at your own risk." }) })
104
+ ), this.ctx.emit("quick-delete/delete-notice", {
105
+ ctx: this.ctx,
106
+ options: r,
107
+ modal: t,
108
+ wikiPage: n,
109
+ deleteNotices: a
110
+ });
111
+ const h = /* @__PURE__ */ i("form", { className: "ipe-quickDelete__form", children: [
112
+ /* @__PURE__ */ i("div", { className: "ipe-quickDelete__notices", children: a }),
113
+ /* @__PURE__ */ i("div", { className: "ipe-quickDelete__content", children: /* @__PURE__ */ i(
114
+ "div",
115
+ {
116
+ className: "ipe-quickDelete__page-info",
117
+ style: {
118
+ padding: "1rem",
119
+ backgroundColor: "#f8f9fa",
120
+ border: "1px solid #dee2e6",
121
+ borderRadius: "4px",
122
+ marginBottom: "1rem"
123
+ },
124
+ children: /* @__PURE__ */ i("ul", { children: [
125
+ /* @__PURE__ */ i("li", { children: [
126
+ /* @__PURE__ */ i("strong", { children: "Title:" }),
127
+ " ",
128
+ n.pageInfo.title
129
+ ] }),
130
+ /* @__PURE__ */ i("li", { children: [
131
+ /* @__PURE__ */ i("strong", { children: "Page ID:" }),
132
+ " ",
133
+ n.pageInfo.pageid
134
+ ] }),
135
+ /* @__PURE__ */ i("li", { children: [
136
+ /* @__PURE__ */ i("strong", { children: "Last Revision:" }),
137
+ " ",
138
+ n.pageInfo.lastrevid
139
+ ] }),
140
+ /* @__PURE__ */ i("li", { children: [
141
+ /* @__PURE__ */ i("strong", { children: "Length:" }),
142
+ " ",
143
+ n.pageInfo.length,
144
+ " characters"
145
+ ] })
146
+ ] })
147
+ }
148
+ ) }),
149
+ /* @__PURE__ */ i(
150
+ "div",
151
+ {
152
+ class: "ipe-quickDelete__options",
153
+ style: {
154
+ display: "flex",
155
+ flexDirection: "column",
156
+ gap: "1rem",
157
+ marginTop: "1rem"
158
+ },
159
+ children: /* @__PURE__ */ i(
160
+ E,
161
+ {
162
+ label: "Delete Reason",
163
+ id: "reason",
164
+ name: "reason",
165
+ value: r.deleteReason,
166
+ inputProps: {
167
+ placeholder: "Enter reason for deletion...",
168
+ required: !0
169
+ }
170
+ }
171
+ )
172
+ }
173
+ ),
174
+ !1
175
+ ] });
176
+ t.setContent(h), t.addButton(
177
+ {
178
+ side: "left",
179
+ className: "is-danger submit-btn",
180
+ label: "Delete Page",
181
+ method: () => {
182
+ const l = new FormData(h).get("reason");
183
+ if (!l || l.trim() === "") {
184
+ this.ctx.modal.notify("error", {
185
+ title: "Missing Reason",
186
+ content: "Please provide a reason for deletion."
187
+ });
188
+ return;
189
+ }
190
+ this.ctx.modal.confirm(
191
+ {
192
+ className: "is-danger",
193
+ title: "Confirm Deletion",
194
+ content: /* @__PURE__ */ i(f, { children: /* @__PURE__ */ i("p", { children: /* @__PURE__ */ i("strong", { children: n.pageInfo.title }) }) }),
195
+ center: !0,
196
+ okBtn: {
197
+ label: "Delete it now",
198
+ className: "is-danger"
199
+ },
200
+ cancelBtn: {
201
+ label: "Cancel",
202
+ className: "is-ghost"
203
+ }
204
+ },
205
+ (g) => (g && (t.setLoadingState(!0), this.handleSubmit({
206
+ wikiPage: n,
207
+ reason: l
208
+ }).then(async () => {
209
+ t.setOptions({
210
+ beforeClose: y
211
+ }), t.close(), this.ctx.modal.notify("success", {
212
+ title: "Deletion Successful",
213
+ content: `The page "${n.pageInfo.title}" has been deleted.`
214
+ });
215
+ }).catch((d) => {
216
+ this.ctx.modal.notify("error", {
217
+ title: "Deletion Error",
218
+ content: d instanceof Error ? d.message : String(d)
219
+ }), t.setLoadingState(!1);
220
+ })), !0)
221
+ );
222
+ }
223
+ },
224
+ 0
225
+ ), this.ctx.emit("quick-delete/wiki-page", {
226
+ ctx: this.ctx,
227
+ options: r,
228
+ modal: t,
229
+ wikiPage: n
230
+ });
231
+ }
232
+ async handleSubmit(e) {
233
+ const s = e.wikiPage, r = e.reason || "";
234
+ return s.delete(r);
235
+ }
236
+ async getWikiPageFromPayload(e) {
237
+ if (e.revision)
238
+ return this.ctx.wikiPage.newFromRevision(e.revision);
239
+ if (e.pageId)
240
+ return this.ctx.wikiPage.newFromPageId(e.pageId);
241
+ if (e.title)
242
+ return this.ctx.wikiPage.newFromTitle(e.title, !1);
243
+ throw new Error("Invalid payload");
244
+ }
245
+ injectToolbox(e) {
246
+ e.toolbox.addButton({
247
+ id: "quick-delete",
248
+ group: "group2",
249
+ icon: /* @__PURE__ */ i(
250
+ "svg",
251
+ {
252
+ xmlns: "http://www.w3.org/2000/svg",
253
+ width: "24",
254
+ height: "24",
255
+ viewBox: "0 0 24 24",
256
+ fill: "none",
257
+ stroke: "currentColor",
258
+ "stroke-width": "2",
259
+ "stroke-linecap": "round",
260
+ "stroke-linejoin": "round",
261
+ class: "icon icon-tabler icons-tabler-outline icon-tabler-trash",
262
+ children: [
263
+ /* @__PURE__ */ i("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
264
+ /* @__PURE__ */ i("path", { d: "M4 7l16 0" }),
265
+ /* @__PURE__ */ i("path", { d: "M10 11l0 6" }),
266
+ /* @__PURE__ */ i("path", { d: "M14 11l0 6" }),
267
+ /* @__PURE__ */ i("path", { d: "M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12" }),
268
+ /* @__PURE__ */ i("path", { d: "M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3" })
269
+ ]
270
+ }
271
+ ),
272
+ tooltip: "Delete this page",
273
+ onClick: () => {
274
+ this.ctx.sitemeta.hasAnyRight("delete") ? this.showModal({
275
+ title: this.ctx.sitemeta.mwConfig.get("wgPageName"),
276
+ pageId: this.ctx.sitemeta.mwConfig.get("wgArticleId"),
277
+ revision: this.ctx.sitemeta.mwConfig.get("wgRevisionId")
278
+ }) : this.ctx.modal.notify("error", {
279
+ title: "Permission Denied",
280
+ content: "You do not have permission to delete pages."
281
+ });
282
+ }
283
+ });
284
+ }
285
+ removeToolbox(e) {
286
+ e.toolbox.removeButton("quick-delete");
287
+ }
288
+ }
289
+ v = O(D);
290
+ u = U(v, 0, "PluginQuickDelete", I, u);
291
+ Q(v, 1, u);
292
+ export {
293
+ u as PluginQuickDelete
294
+ };
295
+ //# sourceMappingURL=index-clwjxJi5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-clwjxJi5.js","sources":["../src/plugins/quick-delete/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { WikiPage } from '@/models/WikiPage'\nimport { IPEModal } from '@/services/ModalService/IPEModal'\nimport { ReactNode } from 'jsx-dom'\nimport { makeCallable } from '@/utils/makeCallable.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickDelete: PluginQuickDelete & {\n (\n ...args: Parameters<PluginQuickDelete['showModal']>\n ): ReturnType<PluginQuickDelete['showModal']>\n }\n }\n interface Events {\n 'quick-delete/init-options'(payload: Omit<QuickDeleteInitPayload, 'modal' | 'wikiPage'>): void\n 'quick-delete/show-modal'(payload: Omit<QuickDeleteInitPayload, 'wikiPage'>): void\n 'quick-delete/wiki-page'(payload: QuickDeleteInitPayload): void\n 'quick-delete/delete-notice'(\n payload: QuickDeleteInitPayload & { deleteNotices: ReactNode[] }\n ): void\n }\n}\n\nexport interface QuickDeleteOptions {\n title: string\n pageId: number\n revision: number\n deleteReason: string\n reloadAfterDelete: boolean\n}\n\nexport interface QuickDeleteInitPayload {\n ctx: InPageEdit\n options: QuickDeleteOptions\n modal: IPEModal\n wikiPage: WikiPage\n}\n\nexport interface QuickDeleteSubmitPayload {\n wikiPage: WikiPage\n reason?: string\n}\n\n@Inject(['api', 'wikiPage', 'sitemeta', 'modal', 'preferences'])\n@RegisterPreferences(\n Schema.object({\n deleteReason: Schema.string()\n .description('Default delete reason for quick delete')\n .default('[IPE-NEXT] Quick delete'),\n })\n .description('Quick delete options')\n .extra('category', 'delete')\n)\nexport class PluginQuickDelete extends BasePlugin {\n private readonly DEFAULT_OPTIONS: QuickDeleteOptions = {\n title: '',\n pageId: 0,\n revision: 0,\n deleteReason: '',\n reloadAfterDelete: true,\n }\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-delete')\n this.ctx.root.set('quickDelete', makeCallable(this, 'showModal'))\n }\n\n protected start(): Promise<void> | void {\n this.ctx.inject(['toolbox'], (ctx) => {\n this.injectToolbox(ctx)\n ctx.on('dispose', () => {\n this.removeToolbox(ctx)\n })\n })\n this.ctx.preferences.defineCategory({\n label: 'Delete',\n name: 'delete',\n description: 'Settings related to deleting pages',\n index: 3,\n })\n }\n\n async showModal(payload?: string | Partial<QuickDeleteOptions>) {\n if (typeof payload === 'undefined') {\n payload = {}\n } else if (typeof payload === 'string') {\n payload = {\n title: payload,\n } as Partial<QuickDeleteOptions>\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: this.ctx.sitemeta.mwConfig.get('wgPageName'),\n pageId: this.ctx.sitemeta.mwConfig.get('wgArticleId'),\n revision: this.ctx.sitemeta.mwConfig.get('wgRevisionId'),\n }\n }\n\n const deleteReason =\n typeof payload.deleteReason === 'string'\n ? payload.deleteReason\n : (await this.ctx.preferences.get<string>('deleteReason'))!\n\n const options: QuickDeleteOptions = {\n ...this.DEFAULT_OPTIONS,\n deleteReason,\n ...payload,\n }\n if (!options.deleteReason) {\n options.deleteReason = (await this.ctx.preferences.get<string>('deleteReason')) || ''\n }\n if (!options) this.ctx.emit('quick-delete/init-options', { ctx: this.ctx, options })\n\n const modal = this.ctx.modal\n .createObject({\n className: 'ipe-quickDelete',\n sizeClass: 'small',\n center: true,\n })\n .init()\n modal.setTitle(\n (\n <>\n Loading: <u>{options.title}</u>\n </>\n ) as HTMLElement\n )\n modal.setContent(<ProgressBar />)\n modal.addButton({\n side: 'right',\n type: 'button',\n className: 'is-ghost',\n label: 'Cancel',\n method() {\n modal.close()\n },\n })\n modal.show()\n this.ctx.emit('quick-delete/show-modal', { ctx: this.ctx, modal, options })\n\n let wikiPage: WikiPage\n try {\n wikiPage = await this.getWikiPageFromPayload(options)\n if (wikiPage.pageInfo.special) {\n throw new Error('Special page cannot be deleted')\n }\n if (wikiPage.pageInfo.pageid === 0) {\n throw new Error('Page does not exist, cannot be deleted')\n }\n } catch (e) {\n modal.off(modal.Event.Close)\n modal.close()\n this.ctx.modal.notify('error', {\n content: e instanceof Error ? e.message : String(e),\n })\n return\n }\n modal.setTitle(\n (\n <>\n Quick Delete: <u>{wikiPage.pageInfo.title}</u>\n </>\n ) as HTMLElement\n )\n\n const deleteNotices = [] as ReactNode[]\n\n // Check delete permissions\n if (!wikiPage.userCan('delete')) {\n deleteNotices.push(\n <MBox title=\"Permission Denied\" type=\"error\">\n <p>You do not have permission to delete this page.</p>\n </MBox>\n )\n }\n\n // Check if page has protection\n if (wikiPage.pageInfo.protection && wikiPage.pageInfo.protection.length > 0) {\n deleteNotices.push(\n <MBox title=\"Warning\" type=\"warning\">\n <p>\n This page is protected and may has special use or purpose. Delete it at your own risk.\n </p>\n </MBox>\n )\n }\n\n this.ctx.emit('quick-delete/delete-notice', {\n ctx: this.ctx,\n options,\n modal,\n wikiPage,\n deleteNotices,\n })\n\n const deleteForm = (\n <form className=\"ipe-quickDelete__form\">\n <div className=\"ipe-quickDelete__notices\">{deleteNotices}</div>\n <div className=\"ipe-quickDelete__content\">\n <div\n className=\"ipe-quickDelete__page-info\"\n style={{\n padding: '1rem',\n backgroundColor: '#f8f9fa',\n border: '1px solid #dee2e6',\n borderRadius: '4px',\n marginBottom: '1rem',\n }}\n >\n <ul>\n <li>\n <strong>Title:</strong> {wikiPage.pageInfo.title}\n </li>\n <li>\n <strong>Page ID:</strong> {wikiPage.pageInfo.pageid}\n </li>\n <li>\n <strong>Last Revision:</strong> {wikiPage.pageInfo.lastrevid}\n </li>\n <li>\n <strong>Length:</strong> {wikiPage.pageInfo.length} characters\n </li>\n </ul>\n </div>\n </div>\n <div\n class=\"ipe-quickDelete__options\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n marginTop: '1rem',\n }}\n >\n <InputBox\n label=\"Delete Reason\"\n id=\"reason\"\n name=\"reason\"\n value={options.deleteReason}\n inputProps={{\n placeholder: 'Enter reason for deletion...',\n required: true,\n }}\n />\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(deleteForm)\n\n // Add delete button\n modal.addButton(\n {\n side: 'left',\n className: 'is-danger submit-btn',\n label: 'Delete Page',\n method: () => {\n const formData = new FormData(deleteForm)\n const reason = formData.get('reason') as string\n\n if (!reason || reason.trim() === '') {\n this.ctx.modal.notify('error', {\n title: 'Missing Reason',\n content: 'Please provide a reason for deletion.',\n })\n return\n }\n\n // 二次确认删除\n this.ctx.modal.confirm(\n {\n className: 'is-danger',\n title: 'Confirm Deletion',\n content: (\n <>\n <p>\n <strong>{wikiPage.pageInfo.title}</strong>\n </p>\n </>\n ) as HTMLElement,\n center: true,\n okBtn: {\n label: 'Delete it now',\n className: 'is-danger',\n },\n cancelBtn: {\n label: 'Cancel',\n className: 'is-ghost',\n },\n },\n (confirmed) => {\n if (confirmed) {\n console.info(wikiPage, deleteForm, {\n reason: reason,\n })\n\n modal.setLoadingState(true)\n this.handleSubmit({\n wikiPage,\n reason,\n })\n .then(async () => {\n modal.setOptions({\n beforeClose: noop,\n })\n modal.close()\n this.ctx.modal.notify('success', {\n title: 'Deletion Successful',\n content: `The page \"${wikiPage.pageInfo.title}\" has been deleted.`,\n })\n })\n .catch((error) => {\n this.ctx.modal.notify('error', {\n title: 'Deletion Error',\n content: error instanceof Error ? error.message : String(error),\n })\n modal.setLoadingState(false)\n })\n }\n return true\n }\n )\n },\n },\n 0\n )\n\n this.ctx.emit('quick-delete/wiki-page', {\n ctx: this.ctx,\n options,\n modal,\n wikiPage,\n })\n }\n\n async handleSubmit(payload: QuickDeleteSubmitPayload) {\n const wikiPage = payload.wikiPage\n const reason = payload.reason || ''\n\n return wikiPage.delete(reason)\n }\n\n async getWikiPageFromPayload(payload: Partial<QuickDeleteOptions>) {\n if (payload.revision) {\n return this.ctx.wikiPage.newFromRevision(payload.revision)\n } else if (payload.pageId) {\n return this.ctx.wikiPage.newFromPageId(payload.pageId)\n } else if (payload.title) {\n return this.ctx.wikiPage.newFromTitle(payload.title, false)\n }\n throw new Error('Invalid payload')\n }\n\n private injectToolbox(ctx: InPageEdit) {\n ctx.toolbox.addButton({\n id: 'quick-delete',\n group: 'group2',\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-trash\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 7l16 0\" />\n <path d=\"M10 11l0 6\" />\n <path d=\"M14 11l0 6\" />\n <path d=\"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12\" />\n <path d=\"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3\" />\n </svg>\n ) as HTMLElement,\n tooltip: 'Delete this page',\n onClick: () => {\n const hasPermission = this.ctx.sitemeta.hasAnyRight('delete')\n if (hasPermission) {\n this.showModal({\n title: this.ctx.sitemeta.mwConfig.get('wgPageName'),\n pageId: this.ctx.sitemeta.mwConfig.get('wgArticleId'),\n revision: this.ctx.sitemeta.mwConfig.get('wgRevisionId'),\n })\n } else {\n this.ctx.modal.notify('error', {\n title: 'Permission Denied',\n content: 'You do not have permission to delete pages.',\n })\n }\n },\n })\n }\n\n protected removeToolbox(ctx: InPageEdit) {\n ctx.toolbox.removeButton('quick-delete')\n }\n}\n"],"names":["_PluginQuickDelete_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickDelete","BasePlugin","ctx","makeCallable","payload","deleteReason","options","modal","jsxs","Fragment","jsx","ProgressBar","wikiPage","e","deleteNotices","MBox","deleteForm","InputBox","reason","confirmed","noop","error","__decoratorStart","__decorateElement","__runInitializers"],"mappings":";;;;;;;;;;;;;;;;;;GAAAA,GAAAC,GAAAC;AA4CAF,IAAA,CAACG,EAAO,CAAC,OAAO,YAAY,YAAY,SAAS,aAAa,CAAC,GAC9DC;AAAA,EACCC,EAAO,OAAO;AAAA,IACZ,cAAcA,EAAO,OAAA,EAClB,YAAY,wCAAwC,EACpD,QAAQ,yBAAyB;AAAA,EAAA,CACrC,EACE,YAAY,sBAAsB,EAClC,MAAM,YAAY,QAAQ;AAC/B,CAAA;AACO,MAAMC,WAA0BJ,IAAAK,GAAW;AAAA,EAShD,YAAmBC,GAAiB;AAClC,UAAMA,GAAK,CAAA,GAAI,cAAc,GADZ,KAAA,MAAAA,GARnB,KAAiB,kBAAsC;AAAA,MACrD,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,cAAc;AAAA,MACd,mBAAmB;AAAA,IAAA,GAKnB,KAAK,IAAI,KAAK,IAAI,eAAeC,EAAa,MAAM,WAAW,CAAC;AAAA,EAClE;AAAA,EAEU,QAA8B;AACtC,SAAK,IAAI,OAAO,CAAC,SAAS,GAAG,CAACD,MAAQ;AACpC,WAAK,cAAcA,CAAG,GACtBA,EAAI,GAAG,WAAW,MAAM;AACtB,aAAK,cAAcA,CAAG;AAAA,MACxB,CAAC;AAAA,IACH,CAAC,GACD,KAAK,IAAI,YAAY,eAAe;AAAA,MAClC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,IAAA,CACR;AAAA,EACH;AAAA,EAEA,MAAM,UAAUE,GAAgD;AAC9D,IAAI,OAAOA,IAAY,MACrBA,IAAU,CAAA,IACD,OAAOA,KAAY,aAC5BA,IAAU;AAAA,MACR,OAAOA;AAAA,IAAA,IAIP,CAACA,EAAQ,SAAS,CAACA,EAAQ,UAAU,CAACA,EAAQ,aAChD,KAAK,OAAO,KAAK,iEAAiE,GAClFA,IAAU;AAAA,MACR,GAAGA;AAAA,MACH,OAAO,KAAK,IAAI,SAAS,SAAS,IAAI,YAAY;AAAA,MAClD,QAAQ,KAAK,IAAI,SAAS,SAAS,IAAI,aAAa;AAAA,MACpD,UAAU,KAAK,IAAI,SAAS,SAAS,IAAI,cAAc;AAAA,IAAA;AAI3D,UAAMC,IACJ,OAAOD,EAAQ,gBAAiB,WAC5BA,EAAQ,eACP,MAAM,KAAK,IAAI,YAAY,IAAY,cAAc,GAEtDE,IAA8B;AAAA,MAClC,GAAG,KAAK;AAAA,MACR,cAAAD;AAAA,MACA,GAAGD;AAAA,IAAA;AAEL,IAAKE,EAAQ,iBACXA,EAAQ,eAAgB,MAAM,KAAK,IAAI,YAAY,IAAY,cAAc,KAAM,KAEhFA,KAAS,KAAK,IAAI,KAAK,6BAA6B,EAAE,KAAK,KAAK,KAAK,SAAAA,EAAA,CAAS;AAEnF,UAAMC,IAAQ,KAAK,IAAI,MACpB,aAAa;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT,EACA,KAAA;AACH,IAAAA,EAAM;AAAA,MAEFC,gBAAAA,EAAAC,GAAA,EAAE,UAAA;AAAA,QAAA;AAAA,0BACU,KAAA,EAAG,UAAAH,EAAQ,OAAM;AAAA,MAAA,GAC7B;AAAA,IAAA,GAGJC,EAAM,WAAW,gBAAAG,EAACC,GAAA,CAAA,CAAY,CAAE,GAChCJ,EAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AACP,QAAAA,EAAM,MAAA;AAAA,MACR;AAAA,IAAA,CACD,GACDA,EAAM,KAAA,GACN,KAAK,IAAI,KAAK,2BAA2B,EAAE,KAAK,KAAK,KAAK,OAAAA,GAAO,SAAAD,GAAS;AAE1E,QAAIM;AACJ,QAAI;AAEF,UADAA,IAAW,MAAM,KAAK,uBAAuBN,CAAO,GAChDM,EAAS,SAAS;AACpB,cAAM,IAAI,MAAM,gCAAgC;AAElD,UAAIA,EAAS,SAAS,WAAW;AAC/B,cAAM,IAAI,MAAM,wCAAwC;AAAA,IAE5D,SAASC,GAAG;AACV,MAAAN,EAAM,IAAIA,EAAM,MAAM,KAAK,GAC3BA,EAAM,MAAA,GACN,KAAK,IAAI,MAAM,OAAO,SAAS;AAAA,QAC7B,SAASM,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC;AAAA,MAAA,CACnD;AACD;AAAA,IACF;AACA,IAAAN,EAAM;AAAA,MAEFC,gBAAAA,EAAAC,GAAA,EAAE,UAAA;AAAA,QAAA;AAAA,0BACe,KAAA,EAAG,UAAAG,EAAS,SAAS,OAAM;AAAA,MAAA,GAC5C;AAAA,IAAA;AAIJ,UAAME,IAAgB,CAAA;AAGtB,IAAKF,EAAS,QAAQ,QAAQ,KAC5BE,EAAc;AAAA,MACZ,gBAAAJ,EAACK,KAAK,OAAM,qBAAoB,MAAK,SACnC,UAAA,gBAAAL,EAAC,KAAA,EAAE,UAAA,kDAAA,CAA+C,GACpD;AAAA,IAAA,GAKAE,EAAS,SAAS,cAAcA,EAAS,SAAS,WAAW,SAAS,KACxEE,EAAc;AAAA,MACZ,gBAAAJ,EAACK,KAAK,OAAM,WAAU,MAAK,WACzB,UAAA,gBAAAL,EAAC,KAAA,EAAE,UAAA,yFAAA,CAEH,GACF;AAAA,IAAA,GAIJ,KAAK,IAAI,KAAK,8BAA8B;AAAA,MAC1C,KAAK,KAAK;AAAA,MACV,SAAAJ;AAAA,MACA,OAAAC;AAAA,MACA,UAAAK;AAAA,MACA,eAAAE;AAAA,IAAA,CACD;AAED,UAAME,IACJR,gBAAAA,EAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,wBAAC,OAAA,EAAI,WAAU,4BAA4B,UAAAM,GAAc;AAAA,MACzD,gBAAAJ,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,cAAc;AAAA,UAAA;AAAA,UAGhB,4BAAC,MAAA,EACC,UAAA;AAAA,YAAAF,gBAAAA,EAAC,MAAA,EACC,UAAA;AAAA,cAAA,gBAAAE,EAAC,YAAO,UAAA,UAAM;AAAA,cAAS;AAAA,cAAEE,EAAS,SAAS;AAAA,YAAA,GAC7C;AAAA,8BACC,MAAA,EACC,UAAA;AAAA,cAAA,gBAAAF,EAAC,YAAO,UAAA,YAAQ;AAAA,cAAS;AAAA,cAAEE,EAAS,SAAS;AAAA,YAAA,GAC/C;AAAA,8BACC,MAAA,EACC,UAAA;AAAA,cAAA,gBAAAF,EAAC,YAAO,UAAA,kBAAc;AAAA,cAAS;AAAA,cAAEE,EAAS,SAAS;AAAA,YAAA,GACrD;AAAA,8BACC,MAAA,EACC,UAAA;AAAA,cAAA,gBAAAF,EAAC,YAAO,UAAA,WAAO;AAAA,cAAS;AAAA,cAAEE,EAAS,SAAS;AAAA,cAAO;AAAA,YAAA,GACrD;AAAA,UAAA,GACF;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,MACA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,KAAK;AAAA,YACL,WAAW;AAAA,UAAA;AAAA,UAGb,UAAA,gBAAAA;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAOX,EAAQ;AAAA,cACf,YAAY;AAAA,gBACV,aAAa;AAAA,gBACb,UAAU;AAAA,cAAA;AAAA,YACZ;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,MAGD;AAAA,IAAA,GAOH;AAEF,IAAAC,EAAM,WAAWS,CAAU,GAG3BT,EAAM;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ,MAAM;AAEZ,gBAAMW,IADW,IAAI,SAASF,CAAU,EAChB,IAAI,QAAQ;AAEpC,cAAI,CAACE,KAAUA,EAAO,KAAA,MAAW,IAAI;AACnC,iBAAK,IAAI,MAAM,OAAO,SAAS;AAAA,cAC7B,OAAO;AAAA,cACP,SAAS;AAAA,YAAA,CACV;AACD;AAAA,UACF;AAGA,eAAK,IAAI,MAAM;AAAA,YACb;AAAA,cACE,WAAW;AAAA,cACX,OAAO;AAAA,cACP,2BACET,GAAA,EACE,UAAA,gBAAAC,EAAC,KAAA,EACC,UAAA,gBAAAA,EAAC,YAAQ,UAAAE,EAAS,SAAS,MAAA,CAAM,EAAA,CACnC,GACF;AAAA,cAEF,QAAQ;AAAA,cACR,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,WAAW;AAAA,cAAA;AAAA,cAEb,WAAW;AAAA,gBACT,OAAO;AAAA,gBACP,WAAW;AAAA,cAAA;AAAA,YACb;AAAA,YAEF,CAACO,OACKA,MAKFZ,EAAM,gBAAgB,EAAI,GAC1B,KAAK,aAAa;AAAA,cAChB,UAAAK;AAAA,cACA,QAAAM;AAAA,YAAA,CACD,EACE,KAAK,YAAY;AAChB,cAAAX,EAAM,WAAW;AAAA,gBACf,aAAaa;AAAA,cAAA,CACd,GACDb,EAAM,MAAA,GACN,KAAK,IAAI,MAAM,OAAO,WAAW;AAAA,gBAC/B,OAAO;AAAA,gBACP,SAAS,aAAaK,EAAS,SAAS,KAAK;AAAA,cAAA,CAC9C;AAAA,YACH,CAAC,EACA,MAAM,CAACS,MAAU;AAChB,mBAAK,IAAI,MAAM,OAAO,SAAS;AAAA,gBAC7B,OAAO;AAAA,gBACP,SAASA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,cAAA,CAC/D,GACDd,EAAM,gBAAgB,EAAK;AAAA,YAC7B,CAAC,IAEE;AAAA,UACT;AAAA,QAEJ;AAAA,MAAA;AAAA,MAEF;AAAA,IAAA,GAGF,KAAK,IAAI,KAAK,0BAA0B;AAAA,MACtC,KAAK,KAAK;AAAA,MACV,SAAAD;AAAA,MACA,OAAAC;AAAA,MACA,UAAAK;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,MAAM,aAAaR,GAAmC;AACpD,UAAMQ,IAAWR,EAAQ,UACnBc,IAASd,EAAQ,UAAU;AAEjC,WAAOQ,EAAS,OAAOM,CAAM;AAAA,EAC/B;AAAA,EAEA,MAAM,uBAAuBd,GAAsC;AACjE,QAAIA,EAAQ;AACV,aAAO,KAAK,IAAI,SAAS,gBAAgBA,EAAQ,QAAQ;AAC3D,QAAWA,EAAQ;AACjB,aAAO,KAAK,IAAI,SAAS,cAAcA,EAAQ,MAAM;AACvD,QAAWA,EAAQ;AACjB,aAAO,KAAK,IAAI,SAAS,aAAaA,EAAQ,OAAO,EAAK;AAE5D,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEQ,cAAcF,GAAiB;AACrC,IAAAA,EAAI,QAAQ,UAAU;AAAA,MACpB,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MACEM,gBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,gBAAa;AAAA,UACb,kBAAe;AAAA,UACf,mBAAgB;AAAA,UAChB,OAAM;AAAA,UAEN,UAAA;AAAA,YAAA,gBAAAE,EAAC,UAAK,QAAO,QAAO,GAAE,iBAAgB,MAAK,QAAO;AAAA,YAClD,gBAAAA,EAAC,QAAA,EAAK,GAAE,aAAY;AAAA,YACpB,gBAAAA,EAAC,QAAA,EAAK,GAAE,cAAa;AAAA,YACrB,gBAAAA,EAAC,QAAA,EAAK,GAAE,cAAa;AAAA,YACrB,gBAAAA,EAAC,QAAA,EAAK,GAAE,kDAAiD;AAAA,YACzD,gBAAAA,EAAC,QAAA,EAAK,GAAE,4CAA2C;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGvD,SAAS;AAAA,MACT,SAAS,MAAM;AAEb,QADsB,KAAK,IAAI,SAAS,YAAY,QAAQ,IAE1D,KAAK,UAAU;AAAA,UACb,OAAO,KAAK,IAAI,SAAS,SAAS,IAAI,YAAY;AAAA,UAClD,QAAQ,KAAK,IAAI,SAAS,SAAS,IAAI,aAAa;AAAA,UACpD,UAAU,KAAK,IAAI,SAAS,SAAS,IAAI,cAAc;AAAA,QAAA,CACxD,IAED,KAAK,IAAI,MAAM,OAAO,SAAS;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QAAA,CACV;AAAA,MAEL;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEU,cAAcR,GAAiB;AACvC,IAAAA,EAAI,QAAQ,aAAa,cAAc;AAAA,EACzC;AACF;AArWOP,IAAA2B,EAAA1B,CAAA;AAAMI,IAANuB,6BAVP7B,GAUaM,CAAA;AAANwB,EAAA7B,GAAA,GAAMK,CAAA;"}
@@ -0,0 +1,46 @@
1
+ import { j as o } from "./index-CvhkVj_L.js";
2
+ const b = "_mbox_5x43w_1", f = "_title_5x43w_12", u = "_content_5x43w_19", v = "_close_5x43w_27", n = {
3
+ mbox: b,
4
+ title: f,
5
+ content: u,
6
+ close: v
7
+ }, g = (l) => {
8
+ const {
9
+ type: t = "default",
10
+ title: i,
11
+ content: a,
12
+ closeable: r = !0,
13
+ titleProps: m,
14
+ contentProps: p,
15
+ children: x,
16
+ ...d
17
+ } = l;
18
+ let s = i;
19
+ typeof i > "u" && t !== "default" && (s = t[0].toUpperCase() + t.slice(1).toLowerCase());
20
+ const c = async () => {
21
+ if (!e)
22
+ return Promise.resolve();
23
+ const { promise: h, resolve: _ } = Promise.withResolvers();
24
+ return e.animate(
25
+ [
26
+ { opacity: "1", height: e.clientHeight + "px" },
27
+ { opacity: "0", height: "0px", margin: "0px" }
28
+ ],
29
+ {
30
+ duration: 300,
31
+ easing: "ease"
32
+ }
33
+ ).addEventListener("finish", () => {
34
+ e.remove(), _();
35
+ }), h;
36
+ }, e = /* @__PURE__ */ o("div", { className: `theme-ipe ipe-mbox mbox-type-${t || "default"} ${n.mbox}`, ...d, children: [
37
+ s && /* @__PURE__ */ o("div", { className: `ipe-mbox-title ${n.title}`, ...m, children: s }),
38
+ /* @__PURE__ */ o("div", { className: `ipe-mbox-content ${n.content}`, ...p, children: x || a }),
39
+ r && /* @__PURE__ */ o("a", { onClick: c, className: `ipe-mbox-close ${n.close}`, children: "×" })
40
+ ] });
41
+ return e.close = c, e;
42
+ };
43
+ export {
44
+ g as M
45
+ };
46
+ //# sourceMappingURL=index-lZkYoUca.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-lZkYoUca.js","sources":["../src/components/MBox/index.tsx"],"sourcesContent":["import { ReactNode } from 'jsx-dom'\nimport { JSX } from 'jsx-dom/jsx-runtime'\nimport styles from './styles.module.sass'\n\nexport type MBoxProps = {\n type?:\n | ''\n | 'default'\n | 'note'\n | 'info'\n | 'tip'\n | 'success'\n | 'important'\n | 'done'\n | 'warning'\n | 'caution'\n | 'error'\n title?: ReactNode\n content?: ReactNode\n closeable?: boolean\n titleProps?: JSX.IntrinsicElements['div']\n contentProps?: JSX.IntrinsicElements['div']\n} & JSX.IntrinsicElements['div']\n\nexport type MBoxElement = HTMLElement & {\n close: () => Promise<void>\n}\n\nexport const MBox = (props: MBoxProps) => {\n const {\n type = 'default',\n title,\n content,\n closeable = true,\n titleProps,\n contentProps,\n children,\n ...rest\n } = props\n let titleContent = title\n if (typeof title === 'undefined' && type !== 'default') {\n titleContent = type[0].toUpperCase() + type.slice(1).toLowerCase()\n }\n\n const close = async () => {\n if (!box) {\n return Promise.resolve()\n }\n const { promise, resolve } = Promise.withResolvers<void>()\n\n const animation = box.animate(\n [\n { opacity: '1', height: box.clientHeight + 'px' },\n { opacity: '0', height: '0px', margin: '0px' },\n ],\n {\n duration: 300,\n easing: 'ease',\n }\n )\n\n animation.addEventListener('finish', () => {\n box.remove()\n resolve()\n })\n\n return promise\n }\n\n const box = (\n <div className={`theme-ipe ipe-mbox mbox-type-${type || 'default'} ${styles.mbox}`} {...rest}>\n {titleContent && (\n <div className={`ipe-mbox-title ${styles.title}`} {...titleProps}>\n {titleContent}\n </div>\n )}\n <div className={`ipe-mbox-content ${styles.content}`} {...contentProps}>\n {children || content}\n </div>\n {closeable && (\n <a onClick={close} className={`ipe-mbox-close ${styles.close}`}>\n ×\n </a>\n )}\n </div>\n ) as MBoxElement\n box.close = close\n return box\n}\n"],"names":["MBox","props","type","title","content","closeable","titleProps","contentProps","children","rest","titleContent","close","box","promise","resolve","jsxs","styles","jsx"],"mappings":";;;;;;GA4BaA,IAAO,CAACC,MAAqB;AACxC,QAAM;AAAA,IACJ,MAAAC,IAAO;AAAA,IACP,OAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,YAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACDR;AACJ,MAAIS,IAAeP;AACnB,EAAI,OAAOA,IAAU,OAAeD,MAAS,cAC3CQ,IAAeR,EAAK,CAAC,EAAE,YAAA,IAAgBA,EAAK,MAAM,CAAC,EAAE,YAAA;AAGvD,QAAMS,IAAQ,YAAY;AACxB,QAAI,CAACC;AACH,aAAO,QAAQ,QAAA;AAEjB,UAAM,EAAE,SAAAC,GAAS,SAAAC,MAAY,QAAQ,cAAA;AAarC,WAXkBF,EAAI;AAAA,MACpB;AAAA,QACE,EAAE,SAAS,KAAK,QAAQA,EAAI,eAAe,KAAA;AAAA,QAC3C,EAAE,SAAS,KAAK,QAAQ,OAAO,QAAQ,MAAA;AAAA,MAAM;AAAA,MAE/C;AAAA,QACE,UAAU;AAAA,QACV,QAAQ;AAAA,MAAA;AAAA,IACV,EAGQ,iBAAiB,UAAU,MAAM;AACzC,MAAAA,EAAI,OAAA,GACJE,EAAA;AAAA,IACF,CAAC,GAEMD;AAAA,EACT,GAEMD,IACJG,gBAAAA,EAAC,OAAA,EAAI,WAAW,gCAAgCb,KAAQ,SAAS,IAAIc,EAAO,IAAI,IAAK,GAAGP,GACrF,UAAA;AAAA,IAAAC,KACC,gBAAAO,EAAC,SAAI,WAAW,kBAAkBD,EAAO,KAAK,IAAK,GAAGV,GACnD,UAAAI,EAAA,CACH;AAAA,IAEF,gBAAAO,EAAC,OAAA,EAAI,WAAW,oBAAoBD,EAAO,OAAO,IAAK,GAAGT,GACvD,UAAAC,KAAYJ,EAAA,CACf;AAAA,IACCC,KACC,gBAAAY,EAAC,KAAA,EAAE,SAASN,GAAO,WAAW,kBAAkBK,EAAO,KAAK,IAAI,UAAA,IAAA,CAEhE;AAAA,EAAA,GAEJ;AAEF,SAAAJ,EAAI,QAAQD,GACLC;AACT;"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { B as s, I as g, a as r, m as c, $ as o, S as t, b as L, c as i } from "./index-DNQjqBV-.js";
1
+ import { B as s, a as g, I as r, m as c, $ as o, S as t, b as L, c as i } from "./index-BnRuHI16.js";
2
2
  export {
3
3
  s as BasePlugin,
4
4
  g as InPageEdit,
@@ -0,0 +1,40 @@
1
+ const f = Symbol("@@apply"), u = Symbol("@@ctor");
2
+ function c(e, p) {
3
+ if (typeof e != "object" || e === null || Array.isArray(e))
4
+ throw new TypeError("instance is not an object");
5
+ const o = (...t) => {
6
+ const r = e[p];
7
+ if (typeof r != "function")
8
+ throw new TypeError(`Property "${String(p)}" is not a function`);
9
+ return r.apply(e, t);
10
+ };
11
+ o[f] = o, o[u] = e;
12
+ const l = e?.constructor?.name;
13
+ return l && (o[Symbol.toStringTag] = l), new Proxy(o, {
14
+ get(t, r, y) {
15
+ return r === "prototype" ? Reflect.get(o, r, y) : Reflect.get(e, r, e);
16
+ },
17
+ set(t, r, y) {
18
+ return Reflect.set(e, r, y);
19
+ },
20
+ has(t, r) {
21
+ return Reflect.has(e, r);
22
+ },
23
+ deleteProperty(t, r) {
24
+ return Reflect.deleteProperty(e, r);
25
+ },
26
+ ownKeys() {
27
+ return Reflect.ownKeys(e);
28
+ },
29
+ getOwnPropertyDescriptor(t, r) {
30
+ return Object.getOwnPropertyDescriptor(e, r);
31
+ },
32
+ defineProperty(t, r, y) {
33
+ return Object.defineProperty(e, r, y);
34
+ }
35
+ });
36
+ }
37
+ export {
38
+ c as m
39
+ };
40
+ //# sourceMappingURL=makeCallable-LDU0xZMJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeCallable-LDU0xZMJ.js","sources":["../src/utils/makeCallable.ts"],"sourcesContent":["export const CALLABLE_APPLY_SYMBOL = Symbol('@@apply')\nexport const CALLABLE_CTOR_SYMBOL = Symbol('@@ctor')\nexport function makeCallable<C extends object, M extends keyof C>(\n instance: C,\n method: M\n): C &\n ((\n ...args: C[M] extends (...a: infer P) => any ? P : never\n ) => C[M] extends (...a: any[]) => infer R ? R : never) {\n if (typeof instance !== 'object' || instance === null || Array.isArray(instance)) {\n throw new TypeError('instance is not an object')\n }\n\n const apply: any = (...args: any[]) => {\n const fn = (instance as any)[method]\n if (typeof fn !== 'function') {\n throw new TypeError(`Property \"${String(method)}\" is not a function`)\n }\n return fn.apply(instance, args)\n }\n apply[CALLABLE_APPLY_SYMBOL] = apply\n apply[CALLABLE_CTOR_SYMBOL] = instance\n\n const ctorName = (instance as any)?.constructor?.name\n if (ctorName) (apply as any)[Symbol.toStringTag] = ctorName\n\n const proxy = new Proxy(apply, {\n get(_, p, receiver) {\n if (p === 'prototype') return Reflect.get(apply, p, receiver)\n return Reflect.get(instance as any, p, instance)\n },\n set(_, p, v) {\n return Reflect.set(instance as any, p, v)\n },\n has(_, p) {\n return Reflect.has(instance as any, p)\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(instance as any, p)\n },\n ownKeys() {\n return Reflect.ownKeys(instance as any)\n },\n getOwnPropertyDescriptor(_, p) {\n return Object.getOwnPropertyDescriptor(instance as any, p)\n },\n defineProperty(_, p, desc) {\n return Object.defineProperty(instance as any, p, desc)\n },\n })\n\n return proxy as unknown as any\n}\n"],"names":["CALLABLE_APPLY_SYMBOL","CALLABLE_CTOR_SYMBOL","makeCallable","instance","method","apply","args","fn","ctorName","_","p","receiver","v","desc"],"mappings":"AAAO,MAAMA,IAAwB,OAAO,SAAS,GACxCC,IAAuB,OAAO,QAAQ;AAC5C,SAASC,EACdC,GACAC,GAIwD;AACxD,MAAI,OAAOD,KAAa,YAAYA,MAAa,QAAQ,MAAM,QAAQA,CAAQ;AAC7E,UAAM,IAAI,UAAU,2BAA2B;AAGjD,QAAME,IAAa,IAAIC,MAAgB;AACrC,UAAMC,IAAMJ,EAAiBC,CAAM;AACnC,QAAI,OAAOG,KAAO;AAChB,YAAM,IAAI,UAAU,aAAa,OAAOH,CAAM,CAAC,qBAAqB;AAEtE,WAAOG,EAAG,MAAMJ,GAAUG,CAAI;AAAA,EAChC;AACA,EAAAD,EAAML,CAAqB,IAAIK,GAC/BA,EAAMJ,CAAoB,IAAIE;AAE9B,QAAMK,IAAYL,GAAkB,aAAa;AACjD,SAAIK,MAAWH,EAAc,OAAO,WAAW,IAAIG,IAErC,IAAI,MAAMH,GAAO;AAAA,IAC7B,IAAII,GAAGC,GAAGC,GAAU;AAClB,aAAID,MAAM,cAAoB,QAAQ,IAAIL,GAAOK,GAAGC,CAAQ,IACrD,QAAQ,IAAIR,GAAiBO,GAAGP,CAAQ;AAAA,IACjD;AAAA,IACA,IAAIM,GAAGC,GAAGE,GAAG;AACX,aAAO,QAAQ,IAAIT,GAAiBO,GAAGE,CAAC;AAAA,IAC1C;AAAA,IACA,IAAIH,GAAGC,GAAG;AACR,aAAO,QAAQ,IAAIP,GAAiBO,CAAC;AAAA,IACvC;AAAA,IACA,eAAeD,GAAGC,GAAG;AACnB,aAAO,QAAQ,eAAeP,GAAiBO,CAAC;AAAA,IAClD;AAAA,IACA,UAAU;AACR,aAAO,QAAQ,QAAQP,CAAe;AAAA,IACxC;AAAA,IACA,yBAAyBM,GAAGC,GAAG;AAC7B,aAAO,OAAO,yBAAyBP,GAAiBO,CAAC;AAAA,IAC3D;AAAA,IACA,eAAeD,GAAGC,GAAGG,GAAM;AACzB,aAAO,OAAO,eAAeV,GAAiBO,GAAGG,CAAI;AAAA,IACvD;AAAA,EAAA,CACD;AAGH;"}
@@ -7,7 +7,7 @@ export declare class WikiPage {
7
7
  pageInfo: PageInfo;
8
8
  static readonly DEFAULT_PAGE_INFO: PageInfo;
9
9
  constructor(pageInfo: Partial<PageInfo>, api?: MediaWikiApi);
10
- getPageInfo(payload: MwApiParams): Promise<PageInfo>;
10
+ fetchPageInfo(payload: MwApiParams): Promise<PageInfo>;
11
11
  parse(params?: MwApiParams): Promise<import('fexios').FexiosFinalContext<import('wiki-saikou').MwApiResponse<{
12
12
  parse: PageParseData;
13
13
  }>>>;
@@ -34,7 +34,7 @@ export declare class WikiPage {
34
34
  }>): Promise<import('fexios').FexiosFinalContext<any>>;
35
35
  userCan(action: keyof PageInfo['actions']): boolean;
36
36
  userCanEdit(): boolean;
37
- refetch(): Promise<this>;
37
+ reloadSelfInfo(): Promise<this>;
38
38
  get pageid(): number;
39
39
  get title(): string;
40
40
  get ns(): number;
@@ -1,12 +1,87 @@
1
- export declare class WikiTitle {
2
- readonly namespaceMap: {
3
- id: number;
4
- canonical: string;
5
- aliases: string[];
6
- };
7
- constructor(title: string, ns: string | number, namespaceMap: {
8
- id: number;
9
- canonical: string;
10
- aliases: string[];
11
- });
1
+ import { SiteMetadata } from '../../types/SiteMetadata';
2
+ export interface IWikiTitle {
3
+ /**
4
+ * Get db key without namespace prefix
5
+ * e.g. "template:hello world" -> "Hello_world"
6
+ */
7
+ getMainDBKey(): string;
8
+ /**
9
+ * Get page name without namespace prefix
10
+ * e.g. "template:hello world" -> "Hello world"
11
+ */
12
+ getMainText(): string;
13
+ /**
14
+ * Get db key with namespace prefix
15
+ * e.g. "template:hello world" -> "Template:Hello_world"
16
+ */
17
+ getPrefixedDBKey(): string;
18
+ /**
19
+ * Get page name with namespace prefix
20
+ * e.g. "template:hello world" -> "Template:Hello world"
21
+ */
22
+ getPrefixedText(): string;
23
+ toText: () => string;
24
+ toString: () => string;
25
+ /**
26
+ * Get namespace ID
27
+ * e.g. "template:hello world" -> 10
28
+ */
29
+ getNamespaceId(): number;
30
+ /**
31
+ * Get namespace text
32
+ * e.g. "template:hello world" -> "Template"
33
+ */
34
+ getNamespaceText(): string;
35
+ /**
36
+ * Get namespace db key
37
+ * e.g. "template talk:hello world" -> "Template_talk"
38
+ */
39
+ getNamespaceDBKey(): string;
40
+ /**
41
+ * Get subject page
42
+ * If current page is subject page, return itself
43
+ * e.g. "template talk:hello world" -> new WikiTitle("Template:Hello world")
44
+ */
45
+ getSubjectPage(): IWikiTitle;
46
+ /**
47
+ * Get talk page
48
+ * If current page is talk page, return itself
49
+ * If current page cannot have talk page, return null
50
+ * e.g. "template:hello world" -> new WikiTitle("Template talk:Hello world")
51
+ */
52
+ getTalkPage(): IWikiTitle | null;
53
+ /**
54
+ * Get URL of the page
55
+ * e.g. "template:hello world" -> "https://example.com/wiki/Template:Hello_world"
56
+ */
57
+ getURL(params?: Record<string, string> | URLSearchParams): URL;
58
+ /**
59
+ * Reset current title with given title string
60
+ */
61
+ setTitle(title: string): IWikiTitle;
62
+ /**
63
+ * Set main title, keep current ns, update dbkey
64
+ */
65
+ setMainText(mainTitle: string): IWikiTitle;
66
+ /**
67
+ * Set namespace by text
68
+ */
69
+ setNamespaceText(namespaceText: string): IWikiTitle;
70
+ /**
71
+ * Set namespace by ID
72
+ */
73
+ setNamespaceId(namespaceId: number): IWikiTitle;
74
+ /**
75
+ * Check if the title is equal to another title
76
+ */
77
+ equals(other: IWikiTitle | string): boolean;
78
+ /**
79
+ * Check if the title is specific special page
80
+ * e.g. "Special:Diff" is "差异" or "diff" -> true
81
+ */
82
+ isSpecial(alia: string): boolean;
12
83
  }
84
+ export interface WikiTitleConstructor {
85
+ new (title: string, namespace?: number): IWikiTitle;
86
+ }
87
+ export declare function createWikiTitleModel(metadata: SiteMetadata): WikiTitleConstructor;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ const o = () => {
2
+ };
3
+ export {
4
+ o as n
5
+ };
6
+ //# sourceMappingURL=noop-ClDc6zv4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop-ClDc6zv4.js","sources":["../src/utils/noop.ts"],"sourcesContent":["export const noop = () => {}\n"],"names":["noop"],"mappings":"AAAO,MAAMA,IAAO,MAAM;AAAC;"}
@@ -1,19 +1,22 @@
1
1
  import { InPageEdit } from '../../InPageEdit';
2
+ import { IWikiTitle } from '../../models/WikiTitle/index.js';
2
3
  declare module '../../InPageEdit' {
3
4
  interface InPageEdit {
4
5
  inArticleLinks: PluginInArticleLinks;
5
6
  }
6
7
  }
7
- export interface InArticleWikiLinkStat {
8
- $el: HTMLAnchorElement;
8
+ export interface InArticleWikiLinkInfo {
9
+ title: IWikiTitle;
9
10
  url: URL;
10
- query: URLSearchParams;
11
+ params: URLSearchParams;
11
12
  hash: string;
13
+ action: 'view' | 'edit' | 'create' | 'diff' | string;
14
+ }
15
+ export interface InArticleWikiAnchorInfo extends InArticleWikiLinkInfo {
16
+ $el: HTMLAnchorElement;
12
17
  kind: 'normal' | 'mw:File';
13
- /** MediaWiki page title */
14
- title: string;
15
18
  external: boolean;
16
- action: 'view' | 'edit' | 'create' | 'diff' | string;
19
+ redlink: boolean;
17
20
  }
18
21
  export declare class PluginInArticleLinks extends BasePlugin<{
19
22
  wikiBaseUrl: string;
@@ -25,5 +28,10 @@ export declare class PluginInArticleLinks extends BasePlugin<{
25
28
  constructor(ctx: InPageEdit);
26
29
  protected start(): Promise<void>;
27
30
  protected stop(): Promise<void>;
28
- parseInArticleLinkInfo(anchor: HTMLAnchorElement): InArticleWikiLinkStat | null;
31
+ private _cachedAnchorInfo;
32
+ parseAnchor(anchor: HTMLAnchorElement): InArticleWikiAnchorInfo | null;
33
+ parseLink(link: string | URL): InArticleWikiLinkInfo | null;
34
+ scanAnchors(parent: HTMLElement): InArticleWikiAnchorInfo[];
35
+ handleQuickEdit(): void;
36
+ handleQuickDiff(): void;
29
37
  }