@inpageedit/core 0.8.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +55 -55
- package/dist/ActionButton-BgbTKTg7.js.map +1 -1
- package/dist/CheckBox-D3rHnX7I.js.map +1 -1
- package/dist/IconQuickEdit-CAL1HXIb.js.map +1 -1
- package/dist/InPageEdit.d.ts +1 -1
- package/dist/InputBox-BV4m05Xs.js.map +1 -1
- package/dist/Preferences-DS4-CFWe.js +9 -0
- package/dist/Preferences-DS4-CFWe.js.map +1 -0
- package/dist/RadioBox-nJqWsxW2.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/decorators/Preferences.d.ts +2 -3
- package/dist/index-Bh70Udzi.js.map +1 -1
- package/dist/{index-Tn22YSmW.js → index-C-A3jSMx.js} +2 -2
- package/dist/index-C-A3jSMx.js.map +1 -0
- package/dist/index-CInRo1qR.js +357 -0
- package/dist/index-CInRo1qR.js.map +1 -0
- package/dist/{index-OBerV4GU.js → index-CWbHdYKu.js} +3 -3
- package/dist/index-CWbHdYKu.js.map +1 -0
- package/dist/{index-CeXR4lOu.js → index-CaI9BFuB.js} +32 -34
- package/dist/{index-CeXR4lOu.js.map → index-CaI9BFuB.js.map} +1 -1
- package/dist/index-CvhkVj_L.js.map +1 -1
- package/dist/{index-mntCdHRr.js → index-D6055L55.js} +1568 -1505
- package/dist/{index-mntCdHRr.js.map → index-D6055L55.js.map} +1 -1
- package/dist/{index-kRdAN8h3.js → index-DxGjTpIn.js} +3 -3
- package/dist/index-DxGjTpIn.js.map +1 -0
- package/dist/index-Ek5d60jn.js +5583 -0
- package/dist/index-Ek5d60jn.js.map +1 -0
- package/dist/{index-Ba7Wkale.js → index-RFAZzS9C.js} +3 -3
- package/dist/{index-Ba7Wkale.js.map → index-RFAZzS9C.js.map} +1 -1
- package/dist/{index-9M1QcjCN.js → index-UjgKGkN2.js} +124 -123
- package/dist/index-UjgKGkN2.js.map +1 -0
- package/dist/{index-DBV8FBjA.js → index-btJ_NMuF.js} +3 -3
- package/dist/index-btJ_NMuF.js.map +1 -0
- package/dist/index-lZkYoUca.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/makeCallable-LDU0xZMJ.js.map +1 -1
- package/dist/models/WikiPage/index.d.ts +1 -2
- package/dist/noop-ClDc6zv4.js.map +1 -1
- package/dist/plugins/BasePlugin.d.ts +0 -2
- package/dist/plugins/{preferences/ui → preferences-ui}/index.d.ts +4 -3
- package/dist/plugins/quick-delete/index.d.ts +2 -2
- package/dist/plugins/quick-diff/components/DiffTable.d.ts +2 -2
- package/dist/plugins/quick-diff/index.d.ts +60 -1
- package/dist/plugins/quick-edit/index.d.ts +2 -2
- package/dist/plugins/quick-move/index.d.ts +2 -2
- package/dist/plugins/quick-redirect/index.d.ts +2 -2
- package/dist/services/ApiService.d.ts +1 -1
- package/dist/services/CurrentPageService.d.ts +3 -2
- package/dist/{plugins/preferences/index.d.ts → services/PreferencesService.d.ts} +9 -9
- package/dist/services/WikiMetadataService.d.ts +2 -2
- package/dist/services/WikiPageService.d.ts +2 -2
- package/dist/services/WikiTitleService.d.ts +7 -3
- package/dist/services/storage/IDBStorage.d.ts +52 -0
- package/dist/services/storage/index.d.ts +53 -0
- package/dist/style.css +1 -1
- package/dist/utils/vueHooks.d.ts +2 -1
- package/lib/index.umd.js +36 -45
- package/lib/index.umd.js.map +1 -1
- package/lib/style.css +1 -1
- package/package.json +8 -14
- package/dist/Preferences-Bg3J5Ur9.js +0 -9
- package/dist/Preferences-Bg3J5Ur9.js.map +0 -1
- package/dist/index-9M1QcjCN.js.map +0 -1
- package/dist/index-C8dOYIIz.js +0 -1249
- package/dist/index-C8dOYIIz.js.map +0 -1
- package/dist/index-COlXHFRg.js +0 -6326
- package/dist/index-COlXHFRg.js.map +0 -1
- package/dist/index-DBV8FBjA.js.map +0 -1
- package/dist/index-DwyuBkCK.js +0 -171
- package/dist/index-DwyuBkCK.js.map +0 -1
- package/dist/index-OBerV4GU.js.map +0 -1
- package/dist/index-Tn22YSmW.js.map +0 -1
- package/dist/index-kRdAN8h3.js.map +0 -1
- package/dist/plugins/quick-diff/JsDiffService.d.ts +0 -23
- package/dist/plugins/quick-diff/PluginQuickDiffCore.d.ts +0 -72
- package/dist/services/StorageService.d.ts +0 -56
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { j as l, F as q, P as j } from "./index-CvhkVj_L.js";
|
|
2
|
-
import { B as S, I as E, S as P } from "./index-
|
|
3
|
-
import { R as Q } from "./Preferences-
|
|
2
|
+
import { B as S, I as E, S as P } from "./index-Ek5d60jn.js";
|
|
3
|
+
import { R as Q } from "./Preferences-DS4-CFWe.js";
|
|
4
4
|
import { m as C } from "./makeCallable-LDU0xZMJ.js";
|
|
5
5
|
var F = Object.create, w = Object.defineProperty, T = Object.getOwnPropertyDescriptor, f = (t, i) => (i = Symbol[t]) ? i : Symbol.for("Symbol." + t), x = (t) => {
|
|
6
6
|
throw TypeError(t);
|
|
@@ -124,4 +124,4 @@ M(h, 1, v);
|
|
|
124
124
|
export {
|
|
125
125
|
v as PluginQuickPreview
|
|
126
126
|
};
|
|
127
|
-
//# sourceMappingURL=index-
|
|
127
|
+
//# sourceMappingURL=index-RFAZzS9C.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-RFAZzS9C.js","sources":["../src/plugins/quick-preview/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\nimport { IWikiPage } from '@/models/WikiPage'\nimport { MwApiParams } from 'wiki-saikou'\nimport { PageParseData } from '@/models/WikiPage/types/PageParseData'\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\nimport { QuickDeleteInitPayload } from '../quick-delete/index.js'\n\ninterface QuickPreviewEventPayload {\n ctx: InPageEdit\n modal: IPEModal\n wikiPage: IWikiPage\n text: string\n parseData: PageParseData\n}\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickPreview: PluginQuickPreview & {\n // for backward compatibility\n (\n ...args: Parameters<PluginQuickPreview['previewWikitext']>\n ): ReturnType<PluginQuickPreview['previewWikitext']>\n }\n }\n interface Events {\n 'quick-preview/show-modal'(payload: Omit<QuickPreviewEventPayload, 'parseData'>): void\n 'quick-preview/loaded'(payload: QuickPreviewEventPayload): void\n }\n}\n\n@Inject(['api', 'wikiPage', 'modal', 'preferences'])\n@RegisterPreferences(\n Schema.object({\n 'quickPreview.keyshortcut': Schema.string()\n .default('ctrl-p')\n .description('Key shortcut to open quick preview in quick edit modal'),\n })\n .extra('category', 'edit')\n .description('Quick preview options')\n)\nexport class PluginQuickPreview extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quickPreview')\n this.ctx.set('quickPreview', makeCallable(this, 'previewWikitext'))\n }\n\n protected start(): Promise<void> | void {\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\n this.ctx.on('quick-delete/wiki-page', this.injectQuickDelete.bind(this))\n }\n\n protected stop(): Promise<void> | void {}\n\n previewWikitext(\n text: string,\n params?: MwApiParams,\n wikiPage?: IWikiPage,\n modal?: IPEModal,\n modalOptions?: Partial<IPEModalOptions>\n ) {\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 center: false,\n ...modalOptions,\n })\n .init()\n }\n\n modal.show()\n modal.setTitle('Preview - Loading...')\n modal.setContent(<ProgressBar />)\n modal.bringToFront()\n this.ctx.emit('quick-preview/show-modal', {\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('quick-preview/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 private async injectQuickEdit({ options, modal, wikiPage }: QuickEditEventPayload) {\n let latestPreviewModal: IPEModal | undefined = undefined\n modal.addButton(\n {\n label: 'Preview',\n side: 'left',\n className: 'btn btn-secondary',\n keyPress:\n (await this.ctx.preferences.get('quickPreview.keyshortcut.quickEdit')) || undefined,\n method: () => {\n let wikitext =\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\n ?.value as string) || ''\n if (options.section === 'new') {\n const title = modal\n .get$content()\n .querySelector<HTMLInputElement>('input[name=\"summary\"]')?.value\n if (title) {\n wikitext = `==${title}==\\n${wikitext}`\n }\n }\n\n latestPreviewModal = this.previewWikitext(\n wikitext,\n undefined,\n wikiPage,\n latestPreviewModal,\n {\n backdrop: false,\n draggable: true,\n }\n )\n },\n },\n 1\n )\n modal.on(modal.Event.Close, () => {\n latestPreviewModal?.destroy()\n latestPreviewModal = undefined\n })\n }\n\n private injectQuickDelete({ ctx, modal, wikiPage }: QuickDeleteInitPayload) {\n modal.addButton(\n {\n label: 'Preview',\n side: 'left',\n className: 'btn btn-secondary',\n method: () => {\n this.logger.warn('To be implemented: preview wikitext for quick delete')\n },\n },\n 2\n )\n }\n}\n"],"names":["_PluginQuickPreview_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickPreview","BasePlugin","ctx","makeCallable","text","params","wikiPage","modal","modalOptions","jsx","ProgressBar","ret","parse","outputRef","el","error","jsxs","Fragment","options","latestPreviewModal","wikitext","title","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { j as t, F as
|
|
2
|
-
import { B as
|
|
3
|
-
import { m as
|
|
4
|
-
import { R
|
|
5
|
-
import { M as
|
|
6
|
-
import { I as
|
|
7
|
-
import { R as
|
|
8
|
-
import { C as
|
|
9
|
-
import { n as
|
|
10
|
-
const
|
|
11
|
-
var
|
|
1
|
+
import { j as t, F as b, P as O } from "./index-CvhkVj_L.js";
|
|
2
|
+
import { B as D, W as h, I as j, S as u } from "./index-Ek5d60jn.js";
|
|
3
|
+
import { m as L } from "./makeCallable-LDU0xZMJ.js";
|
|
4
|
+
import { R } from "./Preferences-DS4-CFWe.js";
|
|
5
|
+
import { M as y } from "./index-lZkYoUca.js";
|
|
6
|
+
import { I as q } from "./InputBox-BV4m05Xs.js";
|
|
7
|
+
import { R as U } from "./RadioBox-nJqWsxW2.js";
|
|
8
|
+
import { C as N } from "./CheckBox-D3rHnX7I.js";
|
|
9
|
+
import { n as C } from "./noop-ClDc6zv4.js";
|
|
10
|
+
const W = (i = 0) => new Promise((e) => setTimeout(e, i));
|
|
11
|
+
var z = Object.create, _ = Object.defineProperty, Q = Object.getOwnPropertyDescriptor, I = (i, e) => (e = Symbol[i]) ? e : Symbol.for("Symbol." + i), T = (i) => {
|
|
12
12
|
throw TypeError(i);
|
|
13
|
-
},
|
|
14
|
-
for (var n = 0, d = i[e >> 1], s = d && d.length; n < s; n++) d[n].call(
|
|
13
|
+
}, K = (i, e, c) => e in i ? _(i, e, { enumerable: !0, configurable: !0, writable: !0, value: c }) : i[e] = c, Y = (i, e) => _(i, "name", { value: e, configurable: !0 }), $ = (i) => [, , , z(i?.[I("metadata")] ?? null)], G = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], M = (i) => i !== void 0 && typeof i != "function" ? T("Function expected") : i, H = (i, e, c, l, n) => ({ kind: G[i], name: e, metadata: l, addInitializer: (d) => c._ ? T("Already initialized") : n.push(M(d || null)) }), X = (i, e) => K(e, I("metadata"), i[3]), J = (i, e, c, l) => {
|
|
14
|
+
for (var n = 0, d = i[e >> 1], s = d && d.length; n < s; n++) d[n].call(c);
|
|
15
15
|
return l;
|
|
16
|
-
},
|
|
17
|
-
var s,
|
|
18
|
-
|
|
19
|
-
for (var
|
|
20
|
-
|
|
21
|
-
return
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"quickEdit.editSummary":
|
|
26
|
-
"quickEdit.editMinor":
|
|
27
|
-
"quickEdit.outSideClose":
|
|
28
|
-
"quickEdit.watchList":
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
]).description("Watchlist options").default(
|
|
34
|
-
"quickEdit.keyshortcut.save":
|
|
16
|
+
}, V = (i, e, c, l, n, d) => {
|
|
17
|
+
var s, r, a, g = e & 7, f = !1, w = 0, x = i[w] || (i[w] = []), p = g && (n = n.prototype, g < 5 && (g > 3 || !f) && Q(n, c));
|
|
18
|
+
Y(n, c);
|
|
19
|
+
for (var m = l.length - 1; m >= 0; m--)
|
|
20
|
+
a = H(g, c, r = {}, i[3], x), s = (0, l[m])(n, a), r._ = 1, M(s) && (n = s);
|
|
21
|
+
return X(i, n), p && _(n, c, p), f ? g ^ 4 ? d : p : n;
|
|
22
|
+
}, B, E, A;
|
|
23
|
+
B = [j(["api", "wikiPage", "wikiTitle", "currentPage", "wiki", "modal", "preferences"]), R(
|
|
24
|
+
u.object({
|
|
25
|
+
"quickEdit.editSummary": u.string().description("Default edit summary for quick edits").default("[IPE-NEXT] Quick edit"),
|
|
26
|
+
"quickEdit.editMinor": u.boolean().description("Whether to mark the edit as minor").default(!1),
|
|
27
|
+
"quickEdit.outSideClose": u.boolean().description("Whether to close the modal outside").default(!0),
|
|
28
|
+
"quickEdit.watchList": u.union([
|
|
29
|
+
u.const(h.preferences).description("Follow my preferences"),
|
|
30
|
+
u.const(h.nochange).description("Keep the current watchlist status"),
|
|
31
|
+
u.const(h.watch).description("Add the page to watchlist"),
|
|
32
|
+
u.const(h.unwatch).description("Remove the page from watchlist")
|
|
33
|
+
]).description("Watchlist options").default(h.preferences),
|
|
34
|
+
"quickEdit.keyshortcut.save": u.string().default("ctrl-s").description("save button key shortcut (blank to disable)")
|
|
35
35
|
}).description("Quick edit options").extra("category", "edit")
|
|
36
36
|
)];
|
|
37
|
-
class
|
|
37
|
+
class S extends (A = D) {
|
|
38
38
|
constructor(e) {
|
|
39
39
|
super(e, {}, "quick-edit"), this.ctx = e, this.DEFAULT_OPTIONS = {
|
|
40
40
|
title: "",
|
|
@@ -45,7 +45,7 @@ class x extends (N = M) {
|
|
|
45
45
|
editSummary: "",
|
|
46
46
|
createOnly: !1,
|
|
47
47
|
reloadAfterSave: !0
|
|
48
|
-
}, this.ctx.root.set("quickEdit",
|
|
48
|
+
}, this.ctx.root.set("quickEdit", L(this, "showModal"));
|
|
49
49
|
}
|
|
50
50
|
start() {
|
|
51
51
|
this.ctx.inject(["toolbox"], (e) => {
|
|
@@ -59,39 +59,39 @@ class x extends (N = M) {
|
|
|
59
59
|
title: e
|
|
60
60
|
}), e?.page && (e.title = e.page, delete e.page), !e.title && !e.pageId && !e.revision) {
|
|
61
61
|
this.logger.warn("None of the title, pageId or revision provided. Using defaults.");
|
|
62
|
-
const
|
|
62
|
+
const o = new URLSearchParams(window.location.search), v = this.ctx.currentPage.wikiTitle;
|
|
63
63
|
e = {
|
|
64
64
|
...e,
|
|
65
|
-
title:
|
|
66
|
-
revision:
|
|
67
|
-
pageId:
|
|
65
|
+
title: v?.getPrefixedDBKey(),
|
|
66
|
+
revision: o.has("oldid") ? Number(o.get("oldid")) : void 0,
|
|
67
|
+
pageId: o.has("curid") ? Number(o.get("curid")) : void 0
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
if (!e.revision && !e.pageId && e.title) {
|
|
71
|
-
const
|
|
72
|
-
|
|
71
|
+
const o = this.ctx.wikiTitle.resolveSpecialPageTarget(e.title);
|
|
72
|
+
o && o.title.getNamespaceId() >= 0 && (e.title = o.title.getPrefixedDBKey(), e.section ??= o.section);
|
|
73
73
|
}
|
|
74
|
-
const
|
|
74
|
+
const c = await this.ctx.preferences.get("quickEdit.outSideClose"), l = await this.ctx.preferences.get("quickEdit.watchList"), n = typeof e.editSummary == "string" ? e.editSummary : await this.ctx.preferences.get("quickEdit.editSummary"), d = typeof e.editMinor == "boolean" ? e.editMinor : await this.ctx.preferences.get("quickEdit.editMinor"), s = {
|
|
75
75
|
...this.DEFAULT_OPTIONS,
|
|
76
76
|
editSummary: n,
|
|
77
77
|
editMinor: d,
|
|
78
78
|
...e
|
|
79
79
|
};
|
|
80
80
|
s.editSummary || (s.editSummary = await this.ctx.preferences.get("quickEdit.editSummary") || ""), this.ctx.emit("quick-edit/init-options", { ctx: this.ctx, options: s });
|
|
81
|
-
const
|
|
81
|
+
const r = this.ctx.modal.createObject({
|
|
82
82
|
className: "ipe-quickEdit",
|
|
83
83
|
sizeClass: "large",
|
|
84
84
|
// backdrop: false,
|
|
85
85
|
// draggable: true,
|
|
86
86
|
center: !1,
|
|
87
|
-
outSideClose:
|
|
87
|
+
outSideClose: c
|
|
88
88
|
}).init();
|
|
89
|
-
|
|
90
|
-
/* @__PURE__ */ t(
|
|
89
|
+
r.setTitle(
|
|
90
|
+
/* @__PURE__ */ t(b, { children: [
|
|
91
91
|
"Loading: ",
|
|
92
92
|
/* @__PURE__ */ t("u", { children: s.title })
|
|
93
93
|
] })
|
|
94
|
-
),
|
|
94
|
+
), r.setContent(
|
|
95
95
|
/* @__PURE__ */ t(
|
|
96
96
|
"section",
|
|
97
97
|
{
|
|
@@ -103,42 +103,43 @@ class x extends (N = M) {
|
|
|
103
103
|
justifyContent: "center",
|
|
104
104
|
alignItems: "center"
|
|
105
105
|
},
|
|
106
|
-
children: /* @__PURE__ */ t(
|
|
106
|
+
children: /* @__PURE__ */ t(O, {})
|
|
107
107
|
}
|
|
108
108
|
)
|
|
109
|
-
),
|
|
109
|
+
), r.addButton({
|
|
110
110
|
side: "right",
|
|
111
111
|
type: "button",
|
|
112
112
|
className: "is-danger is-ghost",
|
|
113
113
|
label: "Cancel",
|
|
114
114
|
method() {
|
|
115
|
-
|
|
115
|
+
r.close();
|
|
116
116
|
}
|
|
117
|
-
}),
|
|
118
|
-
let
|
|
117
|
+
}), r.show(), this.ctx.emit("quick-edit/show-modal", { ctx: this.ctx, modal: r, options: s });
|
|
118
|
+
let a;
|
|
119
119
|
try {
|
|
120
|
-
if (
|
|
120
|
+
if (a = await this.getWikiPageFromPayload(s), a.pageInfo.special)
|
|
121
121
|
throw new Error("Special page is not editable");
|
|
122
|
-
} catch (
|
|
123
|
-
|
|
124
|
-
content:
|
|
122
|
+
} catch (o) {
|
|
123
|
+
r.off(r.Event.Close), r.close(), this.ctx.modal.notify("error", {
|
|
124
|
+
content: o instanceof Error ? o.message : String(o)
|
|
125
125
|
});
|
|
126
126
|
return;
|
|
127
127
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
const g = s.section === "new" ? "" : a.revisions[0]?.content || "", f = a.revisions[0]?.revid, w = f && f !== a.lastrevid, x = s.section === "new", p = a.pageid === 0;
|
|
129
|
+
r.setTitle(
|
|
130
|
+
/* @__PURE__ */ t(b, { children: [
|
|
131
|
+
x ? "New section" : `Quick ${p ? "Create" : "Edit"}`,
|
|
132
132
|
":",
|
|
133
133
|
" ",
|
|
134
|
-
/* @__PURE__ */ t("u", { children:
|
|
134
|
+
/* @__PURE__ */ t("u", { children: a.pageInfo.title }),
|
|
135
|
+
w ? ` (Revision ${f})` : ""
|
|
135
136
|
] })
|
|
136
137
|
);
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
/* @__PURE__ */ t(
|
|
140
|
-
),
|
|
141
|
-
/* @__PURE__ */ t(
|
|
138
|
+
const m = [];
|
|
139
|
+
p && m.push(
|
|
140
|
+
/* @__PURE__ */ t(y, { title: "Attention", type: "important", children: /* @__PURE__ */ t("p", { children: "This page does not exist." }) })
|
|
141
|
+
), w && m.push(
|
|
142
|
+
/* @__PURE__ */ t(y, { title: "Attention", type: "warning", children: /* @__PURE__ */ t("p", { children: [
|
|
142
143
|
"You are editing a ",
|
|
143
144
|
/* @__PURE__ */ t("em", { children: "historical version" }),
|
|
144
145
|
"; the content is not the latest!"
|
|
@@ -146,20 +147,20 @@ class x extends (N = M) {
|
|
|
146
147
|
), this.ctx.emit("quick-edit/edit-notice", {
|
|
147
148
|
ctx: this.ctx,
|
|
148
149
|
options: s,
|
|
149
|
-
modal:
|
|
150
|
-
wikiPage:
|
|
151
|
-
editNotices:
|
|
150
|
+
modal: r,
|
|
151
|
+
wikiPage: a,
|
|
152
|
+
editNotices: m
|
|
152
153
|
});
|
|
153
|
-
const
|
|
154
|
-
/* @__PURE__ */ t("div", { className: "ipe-quickEdit__notices", children:
|
|
154
|
+
const k = /* @__PURE__ */ t("form", { className: "ipe-quickEdit__form", children: [
|
|
155
|
+
/* @__PURE__ */ t("div", { className: "ipe-quickEdit__notices", children: m }),
|
|
155
156
|
/* @__PURE__ */ t(
|
|
156
157
|
"div",
|
|
157
158
|
{
|
|
158
159
|
className: "ipe-quickEdit__content",
|
|
159
160
|
style: { display: "flex", flexDirection: "column", gap: "1rem" },
|
|
160
161
|
children: [
|
|
161
|
-
s.section === "new" && /* @__PURE__ */ t(
|
|
162
|
-
|
|
162
|
+
s.section === "new" && /* @__PURE__ */ t(b, { children: /* @__PURE__ */ t(
|
|
163
|
+
q,
|
|
163
164
|
{
|
|
164
165
|
label: "Section title",
|
|
165
166
|
id: "summary",
|
|
@@ -168,7 +169,7 @@ class x extends (N = M) {
|
|
|
168
169
|
inputProps: { placeholder: "Topic for new section, this will be the h2 heading" }
|
|
169
170
|
}
|
|
170
171
|
) }),
|
|
171
|
-
/* @__PURE__ */ t("textarea", { className: "ipe-quickEdit__textarea", name: "text", id: "wpTextbox1", children:
|
|
172
|
+
/* @__PURE__ */ t("textarea", { className: "ipe-quickEdit__textarea", name: "text", id: "wpTextbox1", children: g })
|
|
172
173
|
]
|
|
173
174
|
}
|
|
174
175
|
),
|
|
@@ -183,70 +184,70 @@ class x extends (N = M) {
|
|
|
183
184
|
marginTop: "1rem"
|
|
184
185
|
},
|
|
185
186
|
children: [
|
|
186
|
-
|
|
187
|
+
!x && /* @__PURE__ */ t(q, { label: "Summary", id: "summary", name: "summary", value: s.editSummary }),
|
|
187
188
|
/* @__PURE__ */ t("div", { className: "ipe-input-box", children: [
|
|
188
189
|
/* @__PURE__ */ t("label", { htmlFor: "watchlist", style: { display: "block" }, children: "Watchlist" }),
|
|
189
190
|
/* @__PURE__ */ t("div", { style: { display: "flex", gap: "1rem" }, children: [
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
].map((
|
|
195
|
-
|
|
191
|
+
h.preferences,
|
|
192
|
+
h.nochange,
|
|
193
|
+
h.watch,
|
|
194
|
+
h.unwatch
|
|
195
|
+
].map((o) => /* @__PURE__ */ t(
|
|
196
|
+
U,
|
|
196
197
|
{
|
|
197
198
|
name: "watchlist",
|
|
198
|
-
value:
|
|
199
|
-
inputProps: { checked: l ===
|
|
200
|
-
children:
|
|
199
|
+
value: o,
|
|
200
|
+
inputProps: { checked: l === o },
|
|
201
|
+
children: o
|
|
201
202
|
},
|
|
202
|
-
|
|
203
|
+
o
|
|
203
204
|
)) })
|
|
204
205
|
] }),
|
|
205
206
|
/* @__PURE__ */ t("div", { style: { display: "flex", gap: "1rem" }, children: [
|
|
206
|
-
/* @__PURE__ */ t(
|
|
207
|
-
/* @__PURE__ */ t(
|
|
207
|
+
/* @__PURE__ */ t(N, { name: "minor", id: "minor", checked: s.editMinor, children: "Minor edit" }),
|
|
208
|
+
/* @__PURE__ */ t(N, { name: "reloadAfterSave", id: "reloadAfterSave", checked: s.reloadAfterSave, children: "Reload after save" })
|
|
208
209
|
] })
|
|
209
210
|
]
|
|
210
211
|
}
|
|
211
212
|
),
|
|
212
213
|
!1
|
|
213
214
|
] });
|
|
214
|
-
|
|
215
|
+
r.setContent(k), r.addButton(
|
|
215
216
|
{
|
|
216
217
|
side: "left",
|
|
217
218
|
className: "is-primary submit-btn",
|
|
218
219
|
label: "Submit",
|
|
219
220
|
keyPress: await this.ctx.preferences.get("quickEdit.keyshortcut.save") || void 0,
|
|
220
221
|
method: () => {
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
wikiPage:
|
|
224
|
-
text:
|
|
225
|
-
summary:
|
|
226
|
-
minor:
|
|
222
|
+
const o = new FormData(k);
|
|
223
|
+
r.setLoadingState(!0), this.handleSubmit({
|
|
224
|
+
wikiPage: a,
|
|
225
|
+
text: o.get("text"),
|
|
226
|
+
summary: o.get("summary"),
|
|
227
|
+
minor: o.get("minor") === "on",
|
|
227
228
|
section: s.section,
|
|
228
|
-
createonly:
|
|
229
|
+
createonly: a.pageid === 0,
|
|
229
230
|
watchlist: l
|
|
230
231
|
}).then(async () => {
|
|
231
|
-
|
|
232
|
-
beforeClose:
|
|
233
|
-
}),
|
|
232
|
+
r.setOptions({
|
|
233
|
+
beforeClose: C
|
|
234
|
+
}), r.close(), this.ctx.modal.notify("success", {
|
|
234
235
|
title: "Submission Successful",
|
|
235
236
|
content: "Your changes have been saved."
|
|
236
|
-
}),
|
|
237
|
-
}).catch((
|
|
237
|
+
}), o.get("reloadAfterSave") && (await W(500), location.reload());
|
|
238
|
+
}).catch((v) => {
|
|
238
239
|
this.ctx.modal.notify("error", {
|
|
239
240
|
title: "Submission Error",
|
|
240
|
-
content:
|
|
241
|
-
}),
|
|
241
|
+
content: v instanceof Error ? v.message : String(v)
|
|
242
|
+
}), r.setLoadingState(!1);
|
|
242
243
|
});
|
|
243
244
|
}
|
|
244
245
|
},
|
|
245
246
|
0
|
|
246
|
-
),
|
|
247
|
+
), r.setOptions({
|
|
247
248
|
beforeClose: () => {
|
|
248
|
-
const
|
|
249
|
-
return (
|
|
249
|
+
const o = a.revisions[0]?.content || "";
|
|
250
|
+
return (k.querySelector("textarea")?.value || "") === o ? !0 : (this.ctx.modal.confirm(
|
|
250
251
|
{
|
|
251
252
|
className: "is-primary",
|
|
252
253
|
title: "Unsaved Changes",
|
|
@@ -261,30 +262,30 @@ class x extends (N = M) {
|
|
|
261
262
|
className: "is-primary is-ghost"
|
|
262
263
|
}
|
|
263
264
|
},
|
|
264
|
-
(
|
|
265
|
-
beforeClose:
|
|
266
|
-
}),
|
|
265
|
+
(F) => (F && (r.setOptions({
|
|
266
|
+
beforeClose: C
|
|
267
|
+
}), r.close()), !0)
|
|
267
268
|
), !1);
|
|
268
269
|
}
|
|
269
270
|
}), this.ctx.emit("quick-edit/wiki-page", {
|
|
270
271
|
ctx: this.ctx,
|
|
271
272
|
options: s,
|
|
272
|
-
modal:
|
|
273
|
-
wikiPage:
|
|
273
|
+
modal: r,
|
|
274
|
+
wikiPage: a
|
|
274
275
|
});
|
|
275
|
-
const
|
|
276
|
-
window.addEventListener("beforeunload",
|
|
277
|
-
window.removeEventListener("beforeunload",
|
|
276
|
+
const P = (o) => k.querySelector("textarea")?.value === a.revisions[0]?.content ? !0 : (o.preventDefault(), "You have unsaved changes. Are you sure you want to leave?");
|
|
277
|
+
window.addEventListener("beforeunload", P), r.on(r.Event.Close, () => {
|
|
278
|
+
window.removeEventListener("beforeunload", P);
|
|
278
279
|
});
|
|
279
280
|
}
|
|
280
281
|
async handleSubmit(e) {
|
|
281
|
-
const
|
|
282
|
-
return
|
|
282
|
+
const c = e.wikiPage, l = e.summary || "", n = e.text || "", d = e.minor, s = e.createonly, r = e.watchlist, a = e.section;
|
|
283
|
+
return c.edit(
|
|
283
284
|
{
|
|
284
285
|
summary: l,
|
|
285
286
|
text: n,
|
|
286
|
-
watchlist:
|
|
287
|
-
section:
|
|
287
|
+
watchlist: r,
|
|
288
|
+
section: a
|
|
288
289
|
},
|
|
289
290
|
{
|
|
290
291
|
minor: d,
|
|
@@ -302,7 +303,7 @@ class x extends (N = M) {
|
|
|
302
303
|
throw new Error("Invalid payload");
|
|
303
304
|
}
|
|
304
305
|
async injectToolbox(e) {
|
|
305
|
-
const
|
|
306
|
+
const c = this.ctx.currentPage.wikiTitle, l = this.ctx.wiki.hasRight("edit") && c && c.getNamespaceId() >= 0;
|
|
306
307
|
e.toolbox.addButton({
|
|
307
308
|
id: "quick-edit",
|
|
308
309
|
group: "group1",
|
|
@@ -335,7 +336,7 @@ class x extends (N = M) {
|
|
|
335
336
|
onClick: () => {
|
|
336
337
|
const n = new URLSearchParams(window.location.search).get("oldid");
|
|
337
338
|
this.showModal({
|
|
338
|
-
title:
|
|
339
|
+
title: c?.getPrefixedText(),
|
|
339
340
|
revision: n ? Number(n) : void 0
|
|
340
341
|
});
|
|
341
342
|
}
|
|
@@ -345,10 +346,10 @@ class x extends (N = M) {
|
|
|
345
346
|
e.toolbox.removeButton("quick-edit");
|
|
346
347
|
}
|
|
347
348
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
349
|
+
E = $(A);
|
|
350
|
+
S = V(E, 0, "PluginQuickEdit", B, S);
|
|
351
|
+
J(E, 1, S);
|
|
351
352
|
export {
|
|
352
|
-
|
|
353
|
+
S as PluginQuickEdit
|
|
353
354
|
};
|
|
354
|
-
//# sourceMappingURL=index-
|
|
355
|
+
//# sourceMappingURL=index-UjgKGkN2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-UjgKGkN2.js","sources":["../src/utils/sleep.ts","../src/plugins/quick-edit/index.tsx"],"sourcesContent":["export const sleep = (ms: number = 0) =>\r\n new Promise((resolve) => setTimeout(resolve, ms))\r\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { IWikiPage } from '@/models/WikiPage'\nimport { WatchlistAction } from '@/models/WikiPage/types/WatchlistAction'\nimport { IPEModal } from '@inpageedit/modal'\nimport { ReactNode } from 'jsx-dom'\nimport { makeCallable } from '@/utils/makeCallable.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickEdit: PluginQuickEdit & {\n (...args: Parameters<PluginQuickEdit['showModal']>): ReturnType<PluginQuickEdit['showModal']>\n }\n }\n interface Events {\n 'quick-edit/init-options'(payload: Omit<QuickEditEventPayload, 'modal' | 'wikiPage'>): void\n 'quick-edit/show-modal'(payload: Omit<QuickEditEventPayload, 'wikiPage'>): void\n 'quick-edit/wiki-page'(payload: QuickEditEventPayload): void\n 'quick-edit/edit-notice'(payload: QuickEditEventPayload & { editNotices: ReactNode[] }): 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 QuickEditEventPayload {\n ctx: InPageEdit\n options: QuickEditOptions\n modal: IPEModal\n wikiPage: IWikiPage\n}\n\nexport interface QuickEditSubmitPayload {\n wikiPage: IWikiPage\n text?: string\n summary?: string\n section?: number | 'new' | undefined\n minor?: boolean\n createonly?: boolean\n watchlist?: WatchlistAction\n}\n\n@Inject(['api', 'wikiPage', 'wikiTitle', 'currentPage', 'wiki', 'modal', 'preferences'])\n@RegisterPreferences(\n Schema.object({\n 'quickEdit.editSummary': Schema.string()\n .description('Default edit summary for quick edits')\n .default('[IPE-NEXT] Quick edit'),\n 'quickEdit.editMinor': Schema.boolean()\n .description('Whether to mark the edit as minor')\n .default(false),\n 'quickEdit.outSideClose': Schema.boolean()\n .description('Whether to close the modal outside')\n .default(true),\n 'quickEdit.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 'quickEdit.keyshortcut.save': Schema.string()\n .default('ctrl-s')\n .description('save button key shortcut (blank to disable)'),\n })\n .description('Quick edit options')\n .extra('category', 'edit')\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 this.ctx.root.set('quickEdit', 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 }\n\n async showModal(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 const searchParams = new URLSearchParams(window.location.search)\n const title = this.ctx.currentPage.wikiTitle\n payload = {\n ...payload,\n title: title?.getPrefixedDBKey(),\n revision: searchParams.has('oldid') ? Number(searchParams.get('oldid')) : undefined,\n pageId: searchParams.has('curid') ? Number(searchParams.get('curid')) : undefined,\n }\n }\n\n if (!payload.revision && !payload.pageId && payload.title) {\n const realTarget = this.ctx.wikiTitle.resolveSpecialPageTarget(payload.title)\n if (realTarget && realTarget.title.getNamespaceId() >= 0) {\n payload.title = realTarget.title.getPrefixedDBKey()\n payload.section ??= realTarget.section\n }\n }\n\n const outSideClose = (await this.ctx.preferences.get<boolean>('quickEdit.outSideClose'))!\n const watchList = (await this.ctx.preferences.get<WatchlistAction>('quickEdit.watchList'))!\n const editSummary =\n typeof payload.editSummary === 'string'\n ? payload.editSummary\n : (await this.ctx.preferences.get<string>('quickEdit.editSummary'))!\n const editMinor =\n typeof payload.editMinor === 'boolean'\n ? payload.editMinor\n : (await this.ctx.preferences.get<boolean>('quickEdit.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>('quickEdit.editSummary')) || ''\n }\n this.ctx.emit('quick-edit/init-options', { 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('quick-edit/show-modal', { ctx: this.ctx, modal, options })\n\n let wikiPage: IWikiPage\n try {\n wikiPage = await this.getWikiPageFromPayload(options)\n if (wikiPage.pageInfo.special) {\n throw new Error('Special page is not editable')\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\n const editContent = options.section === 'new' ? '' : wikiPage.revisions[0]?.content || ''\n const editRevId = wikiPage.revisions[0]?.revid\n const isEdittingOld = editRevId && editRevId !== wikiPage.lastrevid\n const isCreatingNewSection = options.section === 'new'\n const isCreatingNewPage = wikiPage.pageid === 0\n\n modal.setTitle(\n (\n <>\n {isCreatingNewSection ? 'New section' : `Quick ${isCreatingNewPage ? 'Create' : 'Edit'}`}:{' '}\n <u>{wikiPage.pageInfo.title}</u>\n {isEdittingOld ? ` (Revision ${editRevId})` : ''}\n </>\n ) as HTMLElement\n )\n\n const editNotices = [] as ReactNode[]\n // Page not exists\n if (isCreatingNewPage) {\n editNotices.push(\n <MBox title=\"Attention\" type=\"important\">\n <p>This page does not exist.</p>\n </MBox>\n )\n }\n // Edit based on old revision\n if (isEdittingOld) {\n editNotices.push(\n <MBox title=\"Attention\" type=\"warning\">\n <p>\n You are editing a <em>historical version</em>; the content is not the latest!\n </p>\n </MBox>\n )\n }\n this.ctx.emit('quick-edit/edit-notice', {\n ctx: this.ctx,\n options,\n modal,\n wikiPage,\n editNotices,\n })\n\n const editForm = (\n <form className=\"ipe-quickEdit__form\">\n <div className=\"ipe-quickEdit__notices\">{editNotices}</div>\n <div\n className=\"ipe-quickEdit__content\"\n style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}\n >\n {options.section === 'new' && (\n <>\n <InputBox\n label=\"Section title\"\n id=\"summary\"\n name=\"summary\"\n value={''}\n inputProps={{ placeholder: 'Topic for new section, this will be the h2 heading' }}\n />\n </>\n )}\n <textarea className=\"ipe-quickEdit__textarea\" name=\"text\" id=\"wpTextbox1\">\n {editContent}\n </textarea>\n </div>\n <div\n class=\"ipe-quickEdit__options\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n marginTop: '1rem',\n }}\n >\n {!isCreatingNewSection && (\n <InputBox label=\"Summary\" id=\"summary\" name=\"summary\" value={options.editSummary} />\n )}\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 keyPress:\n (await this.ctx.preferences.get<string>('quickEdit.keyshortcut.save')) || undefined,\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 wikiPage,\n text: formData.get('text') as string,\n summary: formData.get('summary') as string,\n minor: formData.get('minor') === 'on',\n section: options.section,\n createonly: wikiPage.pageid === 0,\n watchlist: watchList,\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 Editing',\n className: 'is-primary is-ghost',\n },\n },\n (confirmed) => {\n if (confirmed) {\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('quick-edit/wiki-page', {\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 async handleSubmit(payload: QuickEditSubmitPayload) {\n const wikiPage = payload.wikiPage\n const summary = payload.summary || ''\n const text = payload.text || ''\n const minor = payload.minor\n const createonly = payload.createonly\n const watchlist = payload.watchlist\n const section = payload.section\n\n return wikiPage.edit(\n {\n summary,\n text,\n watchlist,\n section,\n },\n {\n minor,\n createonly,\n }\n )\n }\n\n 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 private async injectToolbox(ctx: InPageEdit) {\n const title = this.ctx.currentPage.wikiTitle\n const canEdit = this.ctx.wiki.hasRight('edit') && title && title.getNamespaceId() >= 0\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 buttonProps: {\n disabled: !canEdit,\n },\n tooltip: canEdit ? 'Quick Edit' : 'Not editable',\n onClick: () => {\n const revision = new URLSearchParams(window.location.search).get('oldid')\n this.showModal({\n title: title?.getPrefixedText(),\n revision: revision ? Number(revision) : undefined,\n })\n },\n })\n }\n\n protected removeToolbox(ctx: InPageEdit) {\n ctx.toolbox.removeButton('quick-edit')\n }\n}\n"],"names":["sleep","ms","resolve","_PluginQuickEdit_decorators","_init","_a","Inject","RegisterPreferences","Schema","WatchlistAction","PluginQuickEdit","BasePlugin","ctx","makeCallable","payload","searchParams","title","realTarget","outSideClose","watchList","editSummary","editMinor","options","modal","jsxs","Fragment","jsx","ProgressBar","wikiPage","e","editContent","editRevId","isEdittingOld","isCreatingNewSection","isCreatingNewPage","editNotices","MBox","editForm","InputBox","action","RadioBox","CheckBox","formData","noop","error","oldStr","confirmed","beforeUnload","summary","text","minor","createonly","watchlist","section","canEdit","revision","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { j as a } from "./index-CvhkVj_L.js";
|
|
2
|
-
import {
|
|
3
|
-
import { R as T } from "./Preferences-
|
|
2
|
+
import { a as D, I as C, S as m } from "./index-Ek5d60jn.js";
|
|
3
|
+
import { R as T } from "./Preferences-DS4-CFWe.js";
|
|
4
4
|
var E = Object.create, x = Object.defineProperty, q = Object.getOwnPropertyDescriptor, y = (e, t) => (t = Symbol[e]) ? t : Symbol.for("Symbol." + e), _ = (e) => {
|
|
5
5
|
throw TypeError(e);
|
|
6
6
|
}, I = (e, t, o) => t in e ? x(e, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : e[t] = o, $ = (e, t) => x(e, "name", { value: t, configurable: !0 }), z = (e) => [, , , E(e?.[y("metadata")] ?? null)], j = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], w = (e) => e !== void 0 && typeof e != "function" ? _("Function expected") : e, A = (e, t, o, n, r) => ({ kind: j[e], name: t, metadata: n, addInitializer: (i) => o._ ? _("Already initialized") : r.push(w(i || null)) }), M = (e, t) => I(t, y("metadata"), e[3]), O = (e, t, o, n) => {
|
|
@@ -136,4 +136,4 @@ O(f, 1, v);
|
|
|
136
136
|
export {
|
|
137
137
|
v as PluginToolbox
|
|
138
138
|
};
|
|
139
|
-
//# sourceMappingURL=index-
|
|
139
|
+
//# sourceMappingURL=index-btJ_NMuF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-btJ_NMuF.js","sources":["../src/plugins/toolbox/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema, Service } from '@/InPageEdit'\r\nimport { JSX, ReactElement } from 'jsx-dom'\r\nimport './styles.scss'\r\n\r\ndeclare module '@/InPageEdit' {\r\n interface InPageEdit {\r\n toolbox: PluginToolbox\r\n }\r\n interface Events {\r\n 'toolbox/button-added'(payload: { ctx: InPageEdit; button: HTMLElement }): void\r\n 'toolbox/button-removed'(payload: { ctx: InPageEdit; id: string }): void\r\n }\r\n}\r\n\r\n@RegisterPreferences(\r\n Schema.object({\r\n toolboxAlwaysShow: Schema.boolean()\r\n .description('Make the toolbox opened by default')\r\n .default(false),\r\n }).description('Toolbox preferences')\r\n)\r\n@Inject(['preferences'])\r\nexport class PluginToolbox extends Service {\r\n container!: HTMLElement\r\n\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, 'toolbox', false)\r\n }\r\n\r\n protected async start(): Promise<void> {\r\n this.container = this.createToolbox()\r\n this.ctx.preferences.get('toolboxAlwaysShow').then((val) => {\r\n if (val) {\r\n this.container.classList.add('is-persistent')\r\n }\r\n })\r\n this.setupHoverLogic()\r\n document.body.appendChild(this.container)\r\n\r\n // 初始化时更新按钮延迟\r\n this.updateButtonDelays()\r\n }\r\n\r\n protected stop(): void | Promise<void> {\r\n this.container?.remove()\r\n }\r\n\r\n private get isPersistent() {\r\n return this.container.classList.contains('is-persistent')\r\n }\r\n\r\n private setupHoverLogic() {\r\n let hoverTimeout: number | null = null\r\n\r\n // 鼠标进入时暂时展开\r\n this.container.addEventListener('mouseenter', () => {\r\n if (hoverTimeout) {\r\n clearTimeout(hoverTimeout)\r\n hoverTimeout = null\r\n }\r\n\r\n // 如果不在持久化状态,则添加hover展开效果\r\n if (!this.isPersistent) {\r\n this.container.classList.add('is-hovered')\r\n }\r\n })\r\n\r\n // 鼠标离开时收起(如果不是持久化状态)\r\n this.container.addEventListener('mouseleave', () => {\r\n if (!this.isPersistent) {\r\n hoverTimeout = window.setTimeout(() => {\r\n this.container.classList.remove('is-hovered')\r\n }, 150) // 延迟150ms收起,避免快速移动鼠标时闪烁\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 计算按钮动画延迟\r\n * @param index 按钮索引(从0开始)\r\n * @param totalCount 总按钮数量\r\n * @returns 延迟时间(秒)\r\n */\r\n private calculateButtonDelay(index: number, totalCount: number): number {\r\n if (totalCount <= 1) return 0\r\n\r\n // 总动画时长150ms = 0.15s\r\n const totalDuration = 0.15\r\n // 使用平方根函数创建非线性延迟,差值逐渐缩小\r\n const normalizedIndex = index / (totalCount - 1)\r\n const delay = totalDuration * Math.sqrt(normalizedIndex)\r\n\r\n return Math.round(delay * 1000) / 1000 // 保留3位小数\r\n }\r\n\r\n /**\r\n * 更新按钮组的动画延迟\r\n */\r\n private updateButtonDelays() {\r\n const btnGroups = this.container.querySelectorAll('.btn-group')\r\n\r\n btnGroups.forEach((group) => {\r\n const buttons = group.querySelectorAll('.btn-tip-group')\r\n const totalCount = buttons.length\r\n\r\n buttons.forEach((button, index) => {\r\n const delay = this.calculateButtonDelay(index, totalCount)\r\n ;(button as HTMLElement).style.setProperty('--transition-delay', `${delay}s`)\r\n ;(button as HTMLElement).style.setProperty('--max-transition-delay', '0.15s')\r\n })\r\n })\r\n }\r\n\r\n private createToolbox() {\r\n const toggler = (\r\n <button\r\n className=\"ipe-toolbox-btn\"\r\n id=\"toolbox-toggler\"\r\n onClick={() => {\r\n this.toggle()\r\n }}\r\n >\r\n {/* Font Awesome 5 Solid: Plus */}\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"448\" height=\"512\" viewBox=\"0 0 448 512\">\r\n <rect width=\"448\" height=\"512\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32\"\r\n />\r\n </svg>\r\n </button>\r\n )\r\n const element = (\r\n <div id=\"ipe-edit-toolbox\">\r\n <ul className=\"btn-group group1\" style={{ display: 'flex', flexDirection: 'column' }}></ul>\r\n <ul className=\"btn-group group2\" style={{ display: 'flex', flexDirection: 'row' }}></ul>\r\n {toggler}\r\n </div>\r\n )\r\n\r\n return element as HTMLElement\r\n }\r\n\r\n private normalizeButtonId(id: string) {\r\n if (!id) {\r\n id = Math.random().toString(36).substring(2, 8)\r\n }\r\n return `ipe-toolbox__${id.trim()}`.replace(/\\s\\.#/g, '-')\r\n }\r\n\r\n addButton(payload: {\r\n id: string\r\n group?: 'auto' | 'group1' | 'group2'\r\n icon: string | HTMLElement | SVGElement | ReactElement\r\n tooltip?: string | HTMLElement\r\n itemProps?: JSX.IntrinsicElements['li']\r\n buttonProps?: JSX.IntrinsicElements['button']\r\n onClick?: (event: MouseEvent) => void\r\n index?: number\r\n }) {\r\n let { id, group, icon, tooltip, itemProps, buttonProps, onClick, index } = payload\r\n id = this.normalizeButtonId(id)\r\n\r\n const existingButton = this.container.querySelector(`#${id}`)\r\n if (existingButton) {\r\n this.ctx.logger('toolbox').warn(`Button with id ${id} already exists, replacing it.`)\r\n existingButton.remove()\r\n }\r\n\r\n let groupEl: HTMLElement | null = null\r\n if (typeof group === 'undefined' || group === 'auto') {\r\n // 选择按钮最少的那一组,一样多就选第一组\r\n const group1 = this.container.querySelector('.btn-group.group1') as HTMLElement\r\n const group2 = this.container.querySelector('.btn-group.group2') as HTMLElement\r\n const group1Count = group1?.children.length || 0\r\n const group2Count = group2?.children.length || 0\r\n groupEl = group1Count <= group2Count ? group1 : group2\r\n } else {\r\n groupEl = this.container.querySelector(`.btn-group.${group}`)\r\n }\r\n if (!groupEl) throw new Error(`Button group ${group} not found`)\r\n\r\n const button = (\r\n <li class=\"btn-tip-group\" id={id} onClick={onClick} {...itemProps}>\r\n <div class=\"btn-tip\">{tooltip}</div>\r\n <button id={`${id}-btn`} class=\"ipe-toolbox-btn\" {...buttonProps}>\r\n {icon}\r\n </button>\r\n </li>\r\n )\r\n\r\n if (typeof index === 'number') {\r\n if (index <= 0) {\r\n groupEl.prepend(button)\r\n } else if (index >= groupEl.children.length) {\r\n groupEl.appendChild(button)\r\n } else {\r\n groupEl.children[index]?.before(button)\r\n }\r\n } else {\r\n groupEl.appendChild(button)\r\n }\r\n\r\n this.ctx.emit('toolbox/button-added', {\r\n ctx: this.ctx,\r\n button: button as HTMLElement,\r\n })\r\n\r\n // 更新按钮延迟\r\n this.updateButtonDelays()\r\n\r\n return button as HTMLElement\r\n }\r\n\r\n removeButton(id: string) {\r\n const button = this.container.querySelector(`.ipe-toolbox-btn#${id}`)\r\n button?.remove()\r\n this.ctx.emit('toolbox/button-removed', { ctx: this.ctx, id })\r\n\r\n // 更新按钮延迟\r\n this.updateButtonDelays()\r\n }\r\n\r\n getContainer() {\r\n return this.container\r\n }\r\n\r\n get isOpened() {\r\n return (\r\n this.container.classList.contains('is-persistent') ||\r\n this.container.classList.contains('is-hovered')\r\n )\r\n }\r\n\r\n toggle(force?: boolean) {\r\n const isPersistent = this.isPersistent\r\n const newPersistent = typeof force === 'boolean' ? force : !isPersistent\r\n this.container.classList.toggle('is-persistent', newPersistent)\r\n this.container.classList.remove('is-hovered')\r\n this.ctx.preferences.set('toolboxAlwaysShow', newPersistent)\r\n }\r\n}\r\n"],"names":["_PluginToolbox_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginToolbox","Service","ctx","val","hoverTimeout","index","totalCount","totalDuration","normalizedIndex","delay","group","buttons","button","jsxs","jsx","id","payload","icon","tooltip","itemProps","buttonProps","onClick","existingButton","groupEl","group1","group2","group1Count","group2Count","force","isPersistent","newPersistent","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|