@inpageedit/core 0.12.0 → 0.13.0-alpha.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.
- package/LICENSE +20 -20
- package/dist/BasePlugin-Bf2UuIHF.js +64 -0
- package/dist/BasePlugin-Bf2UuIHF.js.map +1 -0
- package/dist/IconQuickEdit-CMCQncyj.js.map +1 -1
- package/dist/InputBox-nQKtiWtZ.js +30 -0
- package/dist/InputBox-nQKtiWtZ.js.map +1 -0
- package/dist/PluginPrefSync-Dn1Xsiqz.js +341 -0
- package/dist/PluginPrefSync-Dn1Xsiqz.js.map +1 -0
- package/dist/PluginStoreApp-CpOLArL7.js +452 -0
- package/dist/PluginStoreApp-CpOLArL7.js.map +1 -0
- package/dist/Preferences-DS4-CFWe.js.map +1 -1
- package/dist/WatchlistAction-BbNAyryN.js +5 -0
- package/dist/WatchlistAction-BbNAyryN.js.map +1 -0
- package/dist/components/index.js +6 -7
- package/dist/components/index.js.map +1 -1
- package/dist/endpoints-DgyuoRZd.js +1507 -0
- package/dist/endpoints-DgyuoRZd.js.map +1 -0
- package/dist/{index-B5DtUqkK.js → index-2RfILgXm.js} +11 -11
- package/dist/{index-B5DtUqkK.js.map → index-2RfILgXm.js.map} +1 -1
- package/dist/{index-hSl8LzNb.js → index-BCdABp0e.js} +24 -24
- package/dist/index-BCdABp0e.js.map +1 -0
- package/dist/{index-Ckozkp6W.js → index-BJ7_Q1mB.js} +8 -7
- package/dist/{index-Ckozkp6W.js.map → index-BJ7_Q1mB.js.map} +1 -1
- package/dist/{index-CJFePavo.js → index-BNh95-x2.js} +37 -49
- package/dist/index-BNh95-x2.js.map +1 -0
- package/dist/{index-CYc6LH26.js → index-BQ-cHWkJ.js} +15 -16
- package/dist/{index-CYc6LH26.js.map → index-BQ-cHWkJ.js.map} +1 -1
- package/dist/index-BwdWyHLe.js +362 -0
- package/dist/index-BwdWyHLe.js.map +1 -0
- package/dist/{index-D4uwfUZL.js → index-CCRMmnwk.js} +10 -9
- package/dist/index-CCRMmnwk.js.map +1 -0
- package/dist/index-CG38LlAh.js.map +1 -1
- package/dist/index-CM_6yF2v.js.map +1 -1
- package/dist/{index-CZXxH2-9.js → index-CnIpUF9x.js} +4 -4
- package/dist/{index-CZXxH2-9.js.map → index-CnIpUF9x.js.map} +1 -1
- package/dist/{index-CPoUaSMw.js → index-CyG7_IYz.js} +14 -13
- package/dist/index-CyG7_IYz.js.map +1 -0
- package/dist/index-DD5CVCfD.js.map +1 -1
- package/dist/index-DdTiZqwt.js +3744 -0
- package/dist/index-DdTiZqwt.js.map +1 -0
- package/dist/{index-Bv7Dw5eO.js → index-eSlbrNqF.js} +6 -6
- package/dist/{index-Bv7Dw5eO.js.map → index-eSlbrNqF.js.map} +1 -1
- package/dist/index.d.ts +1723 -31
- package/dist/index.js +73 -9
- package/dist/index.js.map +1 -1
- package/dist/makeCallable-LDU0xZMJ.js.map +1 -1
- package/dist/models/index.js +486 -0
- package/dist/models/index.js.map +1 -0
- package/dist/noop-ClDc6zv4.js.map +1 -1
- package/dist/plugins/index.js +23 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/services/index.js +16 -0
- package/dist/services/index.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/{vueHooks-D0uVqbO-.js → vueHooks-l04s8cIl.js} +1112 -1080
- package/dist/{vueHooks-D0uVqbO-.js.map → vueHooks-l04s8cIl.js.map} +1 -1
- package/lib/index.umd.js +15 -11
- package/lib/index.umd.js.map +1 -1
- package/lib/style.css +1 -1
- package/package.json +22 -25
- package/dist/CheckBox-Bc79KBEB.js +0 -13
- package/dist/CheckBox-Bc79KBEB.js.map +0 -1
- package/dist/InPageEdit.d.ts +0 -42
- package/dist/InputBox-DZAdyZ4B.js +0 -22
- package/dist/InputBox-DZAdyZ4B.js.map +0 -1
- package/dist/PluginPrefSync-BPQkNtX8.js +0 -292
- package/dist/PluginPrefSync-BPQkNtX8.js.map +0 -1
- package/dist/PluginStoreApp-Cxspe6t8.js +0 -158
- package/dist/PluginStoreApp-Cxspe6t8.js.map +0 -1
- package/dist/__test__/utils/constants.d.ts +0 -3
- package/dist/components/ActionButton.d.ts +0 -6
- package/dist/components/CheckBox.d.ts +0 -10
- package/dist/components/Icon/IconEdit.d.ts +0 -2
- package/dist/components/Icon/IconQuickEdit.d.ts +0 -2
- package/dist/components/InputBox.d.ts +0 -11
- package/dist/components/MBox/index.d.ts +0 -14
- package/dist/components/MwUserLinks.d.ts +0 -6
- package/dist/components/ProgressBar/index.d.ts +0 -7
- package/dist/components/RadioBox.d.ts +0 -10
- package/dist/components/TabView/index.d.ts +0 -19
- package/dist/components/TwinSwapInput/index.d.ts +0 -19
- package/dist/components/index.d.ts +0 -8
- package/dist/components/utils.d.ts +0 -4
- package/dist/constants/endpoints.d.ts +0 -8
- package/dist/decorators/Preferences.d.ts +0 -35
- package/dist/index-BXaiDKnr.js +0 -5828
- package/dist/index-BXaiDKnr.js.map +0 -1
- package/dist/index-CB7TltEb.js +0 -297
- package/dist/index-CB7TltEb.js.map +0 -1
- package/dist/index-CJFePavo.js.map +0 -1
- package/dist/index-CPoUaSMw.js.map +0 -1
- package/dist/index-D4uwfUZL.js.map +0 -1
- package/dist/index-DEav9Ptt.js +0 -365
- package/dist/index-DEav9Ptt.js.map +0 -1
- package/dist/index-hSl8LzNb.js.map +0 -1
- package/dist/models/MemoryStorage.d.ts +0 -10
- package/dist/models/WikiPage/index.d.ts +0 -72
- package/dist/models/WikiPage/types/PageInfo.d.ts +0 -58
- package/dist/models/WikiPage/types/PageParseData.d.ts +0 -17
- package/dist/models/WikiPage/types/WatchlistAction.d.ts +0 -6
- package/dist/models/WikiTitle/index.d.ts +0 -89
- package/dist/models/WikiTitle/index.spec.d.ts +0 -1
- package/dist/plugins/BasePlugin.d.ts +0 -25
- package/dist/plugins/_debug/index.d.ts +0 -8
- package/dist/plugins/analytics/index.d.ts +0 -41
- package/dist/plugins/in-article-links/index.d.ts +0 -44
- package/dist/plugins/plugin-store/index.d.ts +0 -59
- package/dist/plugins/plugin-store/schema.d.ts +0 -41
- package/dist/plugins/preferences-ui/PluginPrefSync.d.ts +0 -28
- package/dist/plugins/preferences-ui/index.d.ts +0 -48
- package/dist/plugins/quick-delete/index.d.ts +0 -55
- package/dist/plugins/quick-diff/components/DiffTable.d.ts +0 -23
- package/dist/plugins/quick-diff/index.d.ts +0 -85
- package/dist/plugins/quick-edit/index.d.ts +0 -79
- package/dist/plugins/quick-move/index.d.ts +0 -47
- package/dist/plugins/quick-preview/index.d.ts +0 -37
- package/dist/plugins/quick-redirect/index.d.ts +0 -48
- package/dist/plugins/toolbox/index.d.ts +0 -65
- package/dist/polyfills/Promise.withResolvers.d.ts +0 -5
- package/dist/polyfills/index.d.ts +0 -0
- package/dist/services/ApiService.d.ts +0 -14
- package/dist/services/CurrentPageService.d.ts +0 -28
- package/dist/services/ModalService.d.ts +0 -27
- package/dist/services/PreferencesService.d.ts +0 -94
- package/dist/services/ResourceLoaderService.d.ts +0 -17
- package/dist/services/WikiMetadataService.d.ts +0 -108
- package/dist/services/WikiPageService.d.ts +0 -20
- package/dist/services/WikiTitleService.d.ts +0 -70
- package/dist/services/storage/index.d.ts +0 -40
- package/dist/services/storage/managers/IDBStorageManager.d.ts +0 -28
- package/dist/services/storage/managers/LocalStorageManager.d.ts +0 -27
- package/dist/types/WikiMetadata.d.ts +0 -131
- package/dist/utils/computeable.d.ts +0 -2
- package/dist/utils/defineAsyncPlugin.d.ts +0 -2
- package/dist/utils/interpolate.d.ts +0 -20
- package/dist/utils/interpolate.spec.d.ts +0 -1
- package/dist/utils/makeCallable.d.ts +0 -3
- package/dist/utils/noop.d.ts +0 -1
- package/dist/utils/sleep.d.ts +0 -1
- package/dist/utils/string.d.ts +0 -7
- package/dist/utils/url.d.ts +0 -24
- package/dist/utils/vueHooks.d.ts +0 -6
- package/dist/utils/vueReactivity.d.ts +0 -2
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 dragon-fish
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 dragon-fish
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function c(t) {
|
|
2
|
+
return t.charAt(0).toLowerCase() + t.slice(1);
|
|
3
|
+
}
|
|
4
|
+
function p(t) {
|
|
5
|
+
return c(t).replace(/_/g, "-").replace(/.[A-Z]+/g, (e) => e[0] + "-" + e.slice(1).toLowerCase());
|
|
6
|
+
}
|
|
7
|
+
function l(t) {
|
|
8
|
+
return c(t).replace(/-/g, "_").replace(/.[A-Z]+/g, (e) => e[0] + "_" + e.slice(1).toLowerCase());
|
|
9
|
+
}
|
|
10
|
+
class d {
|
|
11
|
+
constructor(e, r = void 0, h) {
|
|
12
|
+
this.ctx = e, this.disposeHandlers = [], this.name = h || "", this.config = r || {};
|
|
13
|
+
const { promise: i, resolve: o, reject: a } = Promise.withResolvers();
|
|
14
|
+
queueMicrotask(() => {
|
|
15
|
+
this.name || (this.name = this.constructor.name);
|
|
16
|
+
try {
|
|
17
|
+
const s = this.start();
|
|
18
|
+
s && typeof s.then == "function" ? s.then(() => o()).catch((n) => {
|
|
19
|
+
this.logger.error("start() returns a rejected promise", n), a(n);
|
|
20
|
+
}) : o();
|
|
21
|
+
} catch (s) {
|
|
22
|
+
this.logger.error("start() threw synchronously", s), a(s);
|
|
23
|
+
}
|
|
24
|
+
i.then(() => {
|
|
25
|
+
this.logger.debug("started");
|
|
26
|
+
}), i.catch((s) => {
|
|
27
|
+
this.logger.error("start failed", s), this.ctx.scope.dispose();
|
|
28
|
+
});
|
|
29
|
+
}), this.ctx.once("dispose", () => {
|
|
30
|
+
this.disposeHandlers.forEach((s) => s(this.ctx)), this.stop(), this.logger.debug("disposed");
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
#e;
|
|
34
|
+
static {
|
|
35
|
+
this.inject = [];
|
|
36
|
+
}
|
|
37
|
+
static {
|
|
38
|
+
this.reusable = !1;
|
|
39
|
+
}
|
|
40
|
+
start() {
|
|
41
|
+
}
|
|
42
|
+
stop() {
|
|
43
|
+
}
|
|
44
|
+
addDisposeHandler(e) {
|
|
45
|
+
this.disposeHandlers.push(e);
|
|
46
|
+
}
|
|
47
|
+
removeDisposeHandler(e) {
|
|
48
|
+
this.disposeHandlers = this.disposeHandlers.filter((r) => r !== e);
|
|
49
|
+
}
|
|
50
|
+
set name(e) {
|
|
51
|
+
this.#e = l(e).toUpperCase();
|
|
52
|
+
}
|
|
53
|
+
get name() {
|
|
54
|
+
return this.#e;
|
|
55
|
+
}
|
|
56
|
+
get logger() {
|
|
57
|
+
return this.ctx.logger(this.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
d as B,
|
|
62
|
+
p
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=BasePlugin-Bf2UuIHF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasePlugin-Bf2UuIHF.js","sources":["../src/utils/string.ts","../src/plugins/BasePlugin.ts"],"sourcesContent":["export function capitalize(source: string) {\n return source.charAt(0).toUpperCase() + source.slice(1)\n}\n\nexport function uncapitalize(source: string) {\n return source.charAt(0).toLowerCase() + source.slice(1)\n}\n\nexport function camelCase(source: string) {\n return source.replace(/[_-][a-z]/g, (str) => str.slice(1).toUpperCase())\n}\n\nexport function paramCase(source: string) {\n return uncapitalize(source)\n .replace(/_/g, '-')\n .replace(/.[A-Z]+/g, (str) => str[0] + '-' + str.slice(1).toLowerCase())\n}\n\nexport function snakeCase(source: string) {\n return uncapitalize(source)\n .replace(/-/g, '_')\n .replace(/.[A-Z]+/g, (str) => str[0] + '_' + str.slice(1).toLowerCase())\n}\n\nexport function trimSlash(source: string) {\n return source.replace(/\\/+$/, '')\n}\n\nexport function ensureSlash(source: string) {\n return source.endsWith('/') ? source : source + '/'\n}\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport type { Logger } from '@inpageedit/logger'\nimport { snakeCase } from '@/utils/string'\n\ninterface DisposeHandler {\n (ctx: InPageEdit): Promise<void> | void\n}\n\nexport default class BasePlugin<ConfigType extends unknown = any> {\n #name!: string\n public config: ConfigType\n private disposeHandlers: DisposeHandler[] = []\n /** 依赖注入 */\n static inject?: Inject = []\n /** 可重用? */\n static reusable = false\n /** 插件的偏好设置模式 */\n static PreferencesSchema?: Schema\n\n constructor(\n public ctx: InPageEdit,\n config: ConfigType = undefined as unknown as ConfigType,\n name?: string\n ) {\n this.name = name || ''\n this.config = config || ({} as ConfigType)\n const { promise, resolve, reject } = Promise.withResolvers<void>()\n queueMicrotask(() => {\n if (!this.name) {\n this.name = this.constructor.name\n }\n try {\n const ret = this.start()\n if (ret && typeof (ret as Promise<unknown>).then === 'function') {\n ;(ret as Promise<unknown>)\n .then(() => resolve())\n .catch((err) => {\n this.logger.error('start() returns a rejected promise', err)\n reject(err)\n })\n } else {\n resolve()\n }\n } catch (err) {\n this.logger.error('start() threw synchronously', err)\n reject(err)\n }\n\n promise.then(() => {\n this.logger.debug('started')\n })\n promise.catch((e) => {\n this.logger.error('start failed', e)\n this.ctx.scope.dispose()\n })\n })\n this.ctx.once('dispose', () => {\n this.disposeHandlers.forEach((fn) => fn(this.ctx))\n this.stop()\n this.logger.debug('disposed')\n })\n }\n\n protected start(): Promise<void> | void {}\n protected stop(): Promise<void> | void {}\n protected addDisposeHandler(fn: DisposeHandler): void {\n this.disposeHandlers.push(fn)\n }\n protected removeDisposeHandler(fn: DisposeHandler): void {\n this.disposeHandlers = this.disposeHandlers.filter((f) => f !== fn)\n }\n\n set name(name: string) {\n this.#name = snakeCase(name).toUpperCase()\n }\n get name(): string {\n return this.#name\n }\n\n get logger(): Logger {\n return this.ctx.logger(this.name)\n }\n}\n"],"names":["uncapitalize","source","paramCase","str","snakeCase","BasePlugin","ctx","config","name","promise","resolve","reject","ret","err","e","fn","#name","f"],"mappings":"AAIO,SAASA,EAAaC,GAAgB;AAC3C,SAAOA,EAAO,OAAO,CAAC,EAAE,gBAAgBA,EAAO,MAAM,CAAC;AACxD;AAMO,SAASC,EAAUD,GAAgB;AACxC,SAAOD,EAAaC,CAAM,EACvB,QAAQ,MAAM,GAAG,EACjB,QAAQ,YAAY,CAACE,MAAQA,EAAI,CAAC,IAAI,MAAMA,EAAI,MAAM,CAAC,EAAE,aAAa;AAC3E;AAEO,SAASC,EAAUH,GAAgB;AACxC,SAAOD,EAAaC,CAAM,EACvB,QAAQ,MAAM,GAAG,EACjB,QAAQ,YAAY,CAACE,MAAQA,EAAI,CAAC,IAAI,MAAMA,EAAI,MAAM,CAAC,EAAE,aAAa;AAC3E;ACdA,MAAqBE,EAA6C;AAAA,EAWhE,YACSC,GACPC,IAAqB,QACrBC,GACA;AAHO,SAAA,MAAAF,GATT,KAAQ,kBAAoC,CAAA,GAa1C,KAAK,OAAOE,KAAQ,IACpB,KAAK,SAASD,KAAW,CAAA;AACzB,UAAM,EAAE,SAAAE,GAAS,SAAAC,GAAS,QAAAC,EAAA,IAAW,QAAQ,cAAA;AAC7C,mBAAe,MAAM;AACnB,MAAK,KAAK,SACR,KAAK,OAAO,KAAK,YAAY;AAE/B,UAAI;AACF,cAAMC,IAAM,KAAK,MAAA;AACjB,QAAIA,KAAO,OAAQA,EAAyB,QAAS,aACjDA,EACC,KAAK,MAAMF,EAAA,CAAS,EACpB,MAAM,CAACG,MAAQ;AACd,eAAK,OAAO,MAAM,sCAAsCA,CAAG,GAC3DF,EAAOE,CAAG;AAAA,QACZ,CAAC,IAEHH,EAAA;AAAA,MAEJ,SAASG,GAAK;AACZ,aAAK,OAAO,MAAM,+BAA+BA,CAAG,GACpDF,EAAOE,CAAG;AAAA,MACZ;AAEA,MAAAJ,EAAQ,KAAK,MAAM;AACjB,aAAK,OAAO,MAAM,SAAS;AAAA,MAC7B,CAAC,GACDA,EAAQ,MAAM,CAACK,MAAM;AACnB,aAAK,OAAO,MAAM,gBAAgBA,CAAC,GACnC,KAAK,IAAI,MAAM,QAAA;AAAA,MACjB,CAAC;AAAA,IACH,CAAC,GACD,KAAK,IAAI,KAAK,WAAW,MAAM;AAC7B,WAAK,gBAAgB,QAAQ,CAACC,MAAOA,EAAG,KAAK,GAAG,CAAC,GACjD,KAAK,KAAA,GACL,KAAK,OAAO,MAAM,UAAU;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EApDAC;AAAA,EAIA,OAAA;AAAA,SAAO,SAAkB,CAAA;AAAA,EAAC;AAAA,EAE1B,OAAA;AAAA,SAAO,WAAW;AAAA,EAAA;AAAA,EAgDR,QAA8B;AAAA,EAAC;AAAA,EAC/B,OAA6B;AAAA,EAAC;AAAA,EAC9B,kBAAkBD,GAA0B;AACpD,SAAK,gBAAgB,KAAKA,CAAE;AAAA,EAC9B;AAAA,EACU,qBAAqBA,GAA0B;AACvD,SAAK,kBAAkB,KAAK,gBAAgB,OAAO,CAACE,MAAMA,MAAMF,CAAE;AAAA,EACpE;AAAA,EAEA,IAAI,KAAKP,GAAc;AACrB,SAAKQ,KAAQZ,EAAUI,CAAI,EAAE,YAAA;AAAA,EAC/B;AAAA,EACA,IAAI,OAAe;AACjB,WAAO,KAAKQ;AAAA,EACd;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK,IAAI,OAAO,KAAK,IAAI;AAAA,EAClC;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconQuickEdit-CMCQncyj.js","sources":["../src/components/Icon/IconQuickEdit.tsx"],"sourcesContent":["import { SVGProps } from 'jsx-dom'\
|
|
1
|
+
{"version":3,"file":"IconQuickEdit-CMCQncyj.js","sources":["../src/components/Icon/IconQuickEdit.tsx"],"sourcesContent":["import { SVGProps } from 'jsx-dom'\n\nexport const IconQuickEdit = (props: SVGProps<SVGSVGElement>) => (\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 {...props}\n class={`icon icon-tabler icons-tabler-outline icon-tabler-pencil-bolt ${props.className || ''}`}\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4\" />\n <path d=\"M13.5 6.5l4 4\" />\n <path d=\"M19 16l-2 3h4l-2 3\" />\n </svg>\n)\n"],"names":["IconQuickEdit","props","jsxs","jsx"],"mappings":";AAEO,MAAMA,IAAgB,CAACC,MAC5BC,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,gBAAa;AAAA,IACb,kBAAe;AAAA,IACf,mBAAgB;AAAA,IACf,GAAGD;AAAA,IACJ,OAAO,iEAAiEA,EAAM,aAAa,EAAE;AAAA,IAE7F,UAAA;AAAA,MAAA,gBAAAE,EAAC,UAAK,QAAO,QAAO,GAAE,iBAAgB,MAAK,QAAO;AAAA,MAClD,gBAAAA,EAAC,QAAA,EAAK,GAAE,0DAAA,CAA0D;AAAA,MAClE,gBAAAA,EAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,MACxB,gBAAAA,EAAC,QAAA,EAAK,GAAE,qBAAA,CAAqB;AAAA,IAAA;AAAA,EAAA;AAC/B;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { j as e } from "./index-CM_6yF2v.js";
|
|
2
|
+
const h = (s) => {
|
|
3
|
+
const { id: t, name: l, label: a, checked: c, inputProps: i, labelProps: n, children: p, ...o } = s;
|
|
4
|
+
return /* @__PURE__ */ e("label", { className: "theme-ipe ipe-checkbox", ...o, children: [
|
|
5
|
+
/* @__PURE__ */ e("input", { type: "checkbox", id: t, name: l, checked: c, ...i }),
|
|
6
|
+
/* @__PURE__ */ e("span", { className: "ipe-checkbox-box" }),
|
|
7
|
+
/* @__PURE__ */ e("span", { ...n, children: a || p })
|
|
8
|
+
] });
|
|
9
|
+
}, b = (s) => {
|
|
10
|
+
const { label: t, id: l, name: a, value: c, disabled: i, labelProps: n, inputProps: p, ...o } = s;
|
|
11
|
+
return /* @__PURE__ */ e("div", { className: "theme-ipe ipe-input-box", ...o, children: [
|
|
12
|
+
/* @__PURE__ */ e("label", { htmlFor: l, style: { display: "block" }, ...n, children: t }),
|
|
13
|
+
/* @__PURE__ */ e(
|
|
14
|
+
"input",
|
|
15
|
+
{
|
|
16
|
+
id: l,
|
|
17
|
+
name: a,
|
|
18
|
+
value: c,
|
|
19
|
+
disabled: i,
|
|
20
|
+
style: { width: "100%" },
|
|
21
|
+
...p
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
] });
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
h as C,
|
|
28
|
+
b as I
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=InputBox-nQKtiWtZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputBox-nQKtiWtZ.js","sources":["../src/components/CheckBox.tsx","../src/components/InputBox.tsx"],"sourcesContent":["import { JSX } from 'jsx-dom'\n\nexport type CheckBoxProps = {\n id?: string\n name: string\n label?: string | HTMLElement\n checked?: boolean\n inputProps?: JSX.IntrinsicElements['input']\n labelProps?: JSX.IntrinsicElements['span']\n} & JSX.IntrinsicElements['label']\n\nexport const CheckBox = (props: CheckBoxProps) => {\n const { id, name, label, checked, inputProps, labelProps, children, ...rest } = props\n return (\n <label className=\"theme-ipe ipe-checkbox\" {...rest}>\n <input type=\"checkbox\" id={id} name={name} checked={checked} {...inputProps} />\n <span className=\"ipe-checkbox-box\"></span>\n <span {...labelProps}>{label || children}</span>\n </label>\n )\n}\n","import { JSX } from 'jsx-dom'\n\nexport type InputBoxProps = {\n label: string\n id?: string\n name: string\n value?: string\n disabled?: boolean\n labelProps?: JSX.IntrinsicElements['label']\n inputProps?: JSX.IntrinsicElements['input']\n} & JSX.IntrinsicElements['div']\n\nexport const InputBox = (props: InputBoxProps) => {\n const { label, id, name, value, disabled, labelProps, inputProps, ...rest } = props\n return (\n <div className=\"theme-ipe ipe-input-box\" {...rest}>\n <label htmlFor={id} style={{ display: 'block' }} {...labelProps}>\n {label}\n </label>\n <input\n id={id}\n name={name}\n value={value}\n disabled={disabled}\n style={{ width: '100%' }}\n {...inputProps}\n />\n </div>\n )\n}\n"],"names":["CheckBox","props","id","name","label","checked","inputProps","labelProps","children","rest","jsxs","jsx","InputBox","value","disabled"],"mappings":";AAWO,MAAMA,IAAW,CAACC,MAAyB;AAChD,QAAM,EAAE,IAAAC,GAAI,MAAAC,GAAM,OAAAC,GAAO,SAAAC,GAAS,YAAAC,GAAY,YAAAC,GAAY,UAAAC,GAAU,GAAGC,EAAA,IAASR;AAChF,SACES,gBAAAA,EAAC,SAAA,EAAM,WAAU,0BAA0B,GAAGD,GAC5C,UAAA;AAAA,IAAA,gBAAAE,EAAC,WAAM,MAAK,YAAW,IAAAT,GAAQ,MAAAC,GAAY,SAAAE,GAAmB,GAAGC,GAAY;AAAA,IAC7E,gBAAAK,EAAC,QAAA,EAAK,WAAU,mBAAA,CAAmB;AAAA,IACnC,gBAAAA,EAAC,QAAA,EAAM,GAAGJ,GAAa,eAASC,EAAA,CAAS;AAAA,EAAA,GAC3C;AAEJ,GCRaI,IAAW,CAACX,MAAyB;AAChD,QAAM,EAAE,OAAAG,GAAO,IAAAF,GAAI,MAAAC,GAAM,OAAAU,GAAO,UAAAC,GAAU,YAAAP,GAAY,YAAAD,GAAY,GAAGG,EAAA,IAASR;AAC9E,SACES,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BAA2B,GAAGD,GAC3C,UAAA;AAAA,IAAA,gBAAAE,EAAC,SAAA,EAAM,SAAST,GAAI,OAAO,EAAE,SAAS,QAAA,GAAY,GAAGK,GAClD,UAAAH,EAAA,CACH;AAAA,IACA,gBAAAO;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAAT;AAAA,QACA,MAAAC;AAAA,QACA,OAAAU;AAAA,QACA,UAAAC;AAAA,QACA,OAAO,EAAE,OAAO,OAAA;AAAA,QACf,GAAGR;AAAA,MAAA;AAAA,IAAA;AAAA,EACN,GACF;AAEJ;"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { j as r } from "./index-CM_6yF2v.js";
|
|
2
|
+
import { W as k } from "./WatchlistAction-BbNAyryN.js";
|
|
3
|
+
import { B as I } from "./BasePlugin-Bf2UuIHF.js";
|
|
4
|
+
import { A as p } from "./ActionButton-CRjo_l3y.js";
|
|
5
|
+
import { I as U } from "./endpoints-DgyuoRZd.js";
|
|
6
|
+
var L = Object.create, m = Object.defineProperty, C = Object.getOwnPropertyDescriptor, v = (a, e) => (e = Symbol[a]) ? e : Symbol.for("Symbol." + a), x = (a) => {
|
|
7
|
+
throw TypeError(a);
|
|
8
|
+
}, E = (a, e, n) => e in a ? m(a, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : a[e] = n, F = (a, e) => m(a, "name", { value: e, configurable: !0 }), T = (a) => [, , , L(a?.[v("metadata")] ?? null)], j = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], S = (a) => a !== void 0 && typeof a != "function" ? x("Function expected") : a, M = (a, e, n, o, t) => ({ kind: j[a], name: e, metadata: o, addInitializer: (i) => n._ ? x("Already initialized") : t.push(S(i || null)) }), D = (a, e) => E(e, v("metadata"), a[3]), O = (a, e, n, o) => {
|
|
9
|
+
for (var t = 0, i = a[e >> 1], s = i && i.length; t < s; t++) i[t].call(n);
|
|
10
|
+
return o;
|
|
11
|
+
}, R = (a, e, n, o, t, i) => {
|
|
12
|
+
var s, l, c, d = e & 7, f = !1, w = 0, P = a[w] || (a[w] = []), h = d && (t = t.prototype, d < 5 && (d > 3 || !f) && C(t, n));
|
|
13
|
+
F(t, n);
|
|
14
|
+
for (var u = o.length - 1; u >= 0; u--)
|
|
15
|
+
c = M(d, n, l = {}, a[3], P), s = (0, o[u])(t, c), l._ = 1, S(s) && (t = s);
|
|
16
|
+
return D(a, t), h && m(t, n, h), f ? d ^ 4 ? i : h : t;
|
|
17
|
+
}, b, y, _;
|
|
18
|
+
b = [U(["preferences", "wikiPage", "wikiTitle", "modal", "preferencesUI"])];
|
|
19
|
+
class g extends (_ = I) {
|
|
20
|
+
constructor(e) {
|
|
21
|
+
super(e, {}, "pref-sync"), this.ctx = e, e.set("prefSync", this);
|
|
22
|
+
}
|
|
23
|
+
start() {
|
|
24
|
+
const e = this.ctx;
|
|
25
|
+
e.preferences.defineCategory({
|
|
26
|
+
name: "pref-sync",
|
|
27
|
+
label: "Sync",
|
|
28
|
+
description: "Import and export preferences",
|
|
29
|
+
index: 98,
|
|
30
|
+
customRenderer: () => {
|
|
31
|
+
const n = this.getUserPrefsPageTitle();
|
|
32
|
+
return /* @__PURE__ */ r("div", { className: "theme-ipe-prose", children: [
|
|
33
|
+
n && /* @__PURE__ */ r("section", { children: [
|
|
34
|
+
/* @__PURE__ */ r("h3", { children: "Backup your preferences via user page" }),
|
|
35
|
+
/* @__PURE__ */ r("p", { children: /* @__PURE__ */ r("a", { href: n?.getURL().toString(), target: "_blank", children: [
|
|
36
|
+
n?.getPrefixedText(),
|
|
37
|
+
" →"
|
|
38
|
+
] }) }),
|
|
39
|
+
/* @__PURE__ */ r("div", { style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: [
|
|
40
|
+
/* @__PURE__ */ r(
|
|
41
|
+
p,
|
|
42
|
+
{
|
|
43
|
+
type: "primary",
|
|
44
|
+
onClick: (o) => {
|
|
45
|
+
o.preventDefault();
|
|
46
|
+
const t = o.target;
|
|
47
|
+
t.disabled = !0;
|
|
48
|
+
const i = e.preferencesUI.getCurrentModal();
|
|
49
|
+
i?.setLoadingState(!0), this.exportToUserPage().then((s) => {
|
|
50
|
+
e.modal.notify("success", {
|
|
51
|
+
title: "Preferences Exported",
|
|
52
|
+
content: /* @__PURE__ */ r("p", { children: [
|
|
53
|
+
"Your preferences have been exported to",
|
|
54
|
+
" ",
|
|
55
|
+
/* @__PURE__ */ r("a", { href: s.getURL().toString(), target: "_blank", children: s.getPrefixedText() }),
|
|
56
|
+
"."
|
|
57
|
+
] })
|
|
58
|
+
});
|
|
59
|
+
}).finally(() => {
|
|
60
|
+
t.disabled = !1, i?.setLoadingState(!1);
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ r(
|
|
65
|
+
"svg",
|
|
66
|
+
{
|
|
67
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
68
|
+
width: "24",
|
|
69
|
+
height: "24",
|
|
70
|
+
viewBox: "0 0 24 24",
|
|
71
|
+
fill: "none",
|
|
72
|
+
stroke: "currentColor",
|
|
73
|
+
"stroke-width": "2",
|
|
74
|
+
"stroke-linecap": "round",
|
|
75
|
+
"stroke-linejoin": "round",
|
|
76
|
+
class: "icon icon-tabler icons-tabler-outline icon-tabler-cloud-up",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ r("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
|
|
79
|
+
/* @__PURE__ */ r("path", { d: "M12 18.004h-5.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.38 0 2.57 .811 3.128 1.986" }),
|
|
80
|
+
/* @__PURE__ */ r("path", { d: "M19 22v-6" }),
|
|
81
|
+
/* @__PURE__ */ r("path", { d: "M22 19l-3 -3l-3 3" })
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
" ",
|
|
86
|
+
"Backup"
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ r(
|
|
91
|
+
p,
|
|
92
|
+
{
|
|
93
|
+
onClick: (o) => {
|
|
94
|
+
o.preventDefault();
|
|
95
|
+
const t = e.preferencesUI.getCurrentModal(), i = o.target;
|
|
96
|
+
i.disabled = !0, t?.setLoadingState(!0), this.importFromUserPage().then((s) => {
|
|
97
|
+
this.notifyImportSuccess(s);
|
|
98
|
+
}).finally(() => {
|
|
99
|
+
i.disabled = !1, t?.setLoadingState(!1);
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
children: [
|
|
103
|
+
/* @__PURE__ */ r(
|
|
104
|
+
"svg",
|
|
105
|
+
{
|
|
106
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
107
|
+
width: "24",
|
|
108
|
+
height: "24",
|
|
109
|
+
viewBox: "0 0 24 24",
|
|
110
|
+
fill: "none",
|
|
111
|
+
stroke: "currentColor",
|
|
112
|
+
"stroke-width": "2",
|
|
113
|
+
"stroke-linecap": "round",
|
|
114
|
+
"stroke-linejoin": "round",
|
|
115
|
+
class: "icon icon-tabler icons-tabler-outline icon-tabler-cloud-down",
|
|
116
|
+
children: [
|
|
117
|
+
/* @__PURE__ */ r("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
|
|
118
|
+
/* @__PURE__ */ r("path", { d: "M12 18.004h-5.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.38 0 2.573 .813 3.13 1.99" }),
|
|
119
|
+
/* @__PURE__ */ r("path", { d: "M19 16v6" }),
|
|
120
|
+
/* @__PURE__ */ r("path", { d: "M22 19l-3 3l-3 -3" })
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
),
|
|
124
|
+
" ",
|
|
125
|
+
"Restore"
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
] })
|
|
130
|
+
] }),
|
|
131
|
+
/* @__PURE__ */ r("section", { children: [
|
|
132
|
+
/* @__PURE__ */ r("h3", { children: "Import and export preferences" }),
|
|
133
|
+
/* @__PURE__ */ r("div", { style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: [
|
|
134
|
+
/* @__PURE__ */ r(
|
|
135
|
+
p,
|
|
136
|
+
{
|
|
137
|
+
onClick: (o) => {
|
|
138
|
+
o.preventDefault();
|
|
139
|
+
const t = e.preferencesUI.getCurrentModal();
|
|
140
|
+
t?.setLoadingState(!0);
|
|
141
|
+
const i = document.createElement("input");
|
|
142
|
+
i.type = "file", i.accept = "application/json";
|
|
143
|
+
let s = !1;
|
|
144
|
+
const l = () => {
|
|
145
|
+
s || t?.setLoadingState(!1), window.removeEventListener("focus", l);
|
|
146
|
+
};
|
|
147
|
+
window.addEventListener("focus", l, { once: !0 }), i.addEventListener("change", async (c) => {
|
|
148
|
+
s = !0;
|
|
149
|
+
try {
|
|
150
|
+
const d = c.target.files?.[0];
|
|
151
|
+
if (!d)
|
|
152
|
+
return;
|
|
153
|
+
const f = await this.importFromFile(d);
|
|
154
|
+
this.notifyImportSuccess(f);
|
|
155
|
+
} catch (d) {
|
|
156
|
+
e.modal.notify("error", {
|
|
157
|
+
title: "Import failed",
|
|
158
|
+
content: d instanceof Error ? d.message : String(d)
|
|
159
|
+
});
|
|
160
|
+
} finally {
|
|
161
|
+
t?.setLoadingState(!1);
|
|
162
|
+
}
|
|
163
|
+
}), i.click();
|
|
164
|
+
},
|
|
165
|
+
children: "Import from file"
|
|
166
|
+
}
|
|
167
|
+
),
|
|
168
|
+
/* @__PURE__ */ r(
|
|
169
|
+
p,
|
|
170
|
+
{
|
|
171
|
+
onClick: (o) => {
|
|
172
|
+
o.preventDefault();
|
|
173
|
+
const t = /* @__PURE__ */ r("input", { type: "url" }), i = e.preferencesUI.getCurrentModal();
|
|
174
|
+
e.modal.confirm(
|
|
175
|
+
{
|
|
176
|
+
title: "Import Preferences from URL",
|
|
177
|
+
content: /* @__PURE__ */ r("div", { children: [
|
|
178
|
+
/* @__PURE__ */ r("label", { htmlFor: "url-input", children: "Enter the URL of the preferences JSON file:" }),
|
|
179
|
+
t
|
|
180
|
+
] })
|
|
181
|
+
},
|
|
182
|
+
async (s) => {
|
|
183
|
+
const l = t.value.trim();
|
|
184
|
+
if (!(!s || !l))
|
|
185
|
+
try {
|
|
186
|
+
i?.setLoadingState(!0);
|
|
187
|
+
const c = await this.importFromUrl(l);
|
|
188
|
+
this.notifyImportSuccess(c);
|
|
189
|
+
} catch (c) {
|
|
190
|
+
e.modal.notify("error", {
|
|
191
|
+
title: "Import failed",
|
|
192
|
+
content: c instanceof Error ? c.message : String(c)
|
|
193
|
+
});
|
|
194
|
+
} finally {
|
|
195
|
+
i?.setLoadingState(!1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
},
|
|
200
|
+
children: "Import from URL"
|
|
201
|
+
}
|
|
202
|
+
),
|
|
203
|
+
/* @__PURE__ */ r(
|
|
204
|
+
p,
|
|
205
|
+
{
|
|
206
|
+
onClick: async (o) => {
|
|
207
|
+
o.preventDefault(), await e.preferencesUI.dispatchFormSave();
|
|
208
|
+
const t = await e.preferences.getExportableRecord(), i = JSON.stringify(t, null, 2);
|
|
209
|
+
e.modal.dialog(
|
|
210
|
+
{
|
|
211
|
+
title: "Save to file",
|
|
212
|
+
content: /* @__PURE__ */ r("div", { children: [
|
|
213
|
+
/* @__PURE__ */ r("label", { htmlFor: "data", children: "Your InPageEdit preferences:" }),
|
|
214
|
+
/* @__PURE__ */ r(
|
|
215
|
+
"textarea",
|
|
216
|
+
{
|
|
217
|
+
name: "data",
|
|
218
|
+
id: "data",
|
|
219
|
+
rows: 10,
|
|
220
|
+
value: i,
|
|
221
|
+
readOnly: !0,
|
|
222
|
+
style: { width: "100%" }
|
|
223
|
+
}
|
|
224
|
+
)
|
|
225
|
+
] }),
|
|
226
|
+
buttons: [
|
|
227
|
+
{
|
|
228
|
+
label: "Copy",
|
|
229
|
+
method: (s, l) => {
|
|
230
|
+
navigator.clipboard.writeText(i), e.modal.notify("success", {
|
|
231
|
+
content: "Copied to clipboard"
|
|
232
|
+
}), l.close();
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
label: "Download",
|
|
237
|
+
method: (s, l) => {
|
|
238
|
+
const c = document.createElement("a");
|
|
239
|
+
c.href = `data:text/json;charset=utf-8,${encodeURIComponent(i)}`, c.download = `ipe-prefs-${(/* @__PURE__ */ new Date()).toISOString()}.json`, c.click(), l.close();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
() => {
|
|
245
|
+
}
|
|
246
|
+
);
|
|
247
|
+
},
|
|
248
|
+
children: "Save as file"
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
] })
|
|
252
|
+
] })
|
|
253
|
+
] });
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
stop() {
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 获取用户页配置文件的标题
|
|
261
|
+
*/
|
|
262
|
+
getUserPrefsPageTitle() {
|
|
263
|
+
try {
|
|
264
|
+
const e = this.ctx.wiki?.userInfo?.name;
|
|
265
|
+
return e ? this.ctx.wikiTitle.newTitle(`User:${e}/ipe-prefs.json`, 2) : null;
|
|
266
|
+
} catch {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* 从用户页加载配置
|
|
272
|
+
*/
|
|
273
|
+
async importFromUserPage() {
|
|
274
|
+
const e = this.getUserPrefsPageTitle();
|
|
275
|
+
if (!e)
|
|
276
|
+
return this.logger.debug("Cannot get user page title, skipping load"), {};
|
|
277
|
+
try {
|
|
278
|
+
const n = e.getURL({ action: "raw", ctype: "application/json" }), o = await this.importFromUrl(n.toString());
|
|
279
|
+
return this.logger.info("Loaded preferences from user page:", e), o;
|
|
280
|
+
} catch (n) {
|
|
281
|
+
return this.logger.error("Failed to load preferences from user page:", n), {};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 导出配置到用户页
|
|
286
|
+
*/
|
|
287
|
+
async exportToUserPage() {
|
|
288
|
+
const e = this.ctx, n = this.getUserPrefsPageTitle();
|
|
289
|
+
if (!n)
|
|
290
|
+
throw new Error("Cannot get user page title");
|
|
291
|
+
await e.preferencesUI.dispatchFormSave();
|
|
292
|
+
const o = await e.preferences.getExportableRecord(), t = JSON.stringify(o, null, 2);
|
|
293
|
+
try {
|
|
294
|
+
return await this.ctx.wikiPage.newBlankPage({
|
|
295
|
+
title: n.toString(),
|
|
296
|
+
ns: 2
|
|
297
|
+
// User namespace
|
|
298
|
+
}).edit({
|
|
299
|
+
text: t,
|
|
300
|
+
summary: "Update InPageEdit preferences",
|
|
301
|
+
watchlist: k.nochange
|
|
302
|
+
}), this.logger.info("Exported preferences to user page:", n), n;
|
|
303
|
+
} catch (i) {
|
|
304
|
+
throw this.logger.error("Failed to export preferences to user page:", i), i;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async importFromUrl(e) {
|
|
308
|
+
const n = await fetch(e);
|
|
309
|
+
if (!n.ok)
|
|
310
|
+
throw new Error(`HTTP ${n.status}: ${n.statusText}`);
|
|
311
|
+
const o = await n.blob();
|
|
312
|
+
return await this.importFromFile(o);
|
|
313
|
+
}
|
|
314
|
+
async importFromFile(e) {
|
|
315
|
+
const n = await e.text(), o = JSON.parse(n);
|
|
316
|
+
return await this.ctx.preferences.setMany(o);
|
|
317
|
+
}
|
|
318
|
+
notifyImportSuccess(e) {
|
|
319
|
+
const n = Object.keys(e ?? {}), o = n.length;
|
|
320
|
+
return this.ctx.modal.notify("success", {
|
|
321
|
+
title: "Preferences Imported",
|
|
322
|
+
content: /* @__PURE__ */ r("section", { children: [
|
|
323
|
+
/* @__PURE__ */ r("p", { children: [
|
|
324
|
+
"Successfully imported ",
|
|
325
|
+
o || "",
|
|
326
|
+
" ",
|
|
327
|
+
o !== 1 ? "settings" : "setting",
|
|
328
|
+
":"
|
|
329
|
+
] }),
|
|
330
|
+
/* @__PURE__ */ r("ol", { style: { listStyle: "auto", paddingLeft: "1em" }, children: n.map((t) => /* @__PURE__ */ r("li", { children: t }, t)) })
|
|
331
|
+
] })
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
y = T(_);
|
|
336
|
+
g = R(y, 0, "PluginPrefSync", b, g);
|
|
337
|
+
O(y, 1, g);
|
|
338
|
+
export {
|
|
339
|
+
g as PluginPrefSync
|
|
340
|
+
};
|
|
341
|
+
//# sourceMappingURL=PluginPrefSync-Dn1Xsiqz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginPrefSync-Dn1Xsiqz.js","sources":["../src/plugins/preferences-ui/PluginPrefSync.tsx"],"sourcesContent":["import { Inject, InPageEdit } from '@/InPageEdit.js'\nimport { WatchlistAction } from '@/models/WikiPage/types/WatchlistAction.js'\nimport { IWikiTitle } from '@/models/WikiTitle/index.js'\n\ndeclare module '@/InPageEdit' {\n export interface InPageEdit {\n prefSync: PluginPrefSync\n }\n}\n\n@Inject(['preferences', 'wikiPage', 'wikiTitle', 'modal', 'preferencesUI'])\nexport class PluginPrefSync extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'pref-sync')\n ctx.set('prefSync', this)\n }\n\n protected start(): Promise<void> | void {\n const ctx = this.ctx\n ctx.preferences.defineCategory({\n name: 'pref-sync',\n label: 'Sync',\n description: 'Import and export preferences',\n index: 98,\n customRenderer: () => {\n const userPageTitle = this.getUserPrefsPageTitle()\n return (\n <div className=\"theme-ipe-prose\">\n {userPageTitle && (\n <section>\n <h3>Backup your preferences via user page</h3>\n <p>\n <a href={userPageTitle?.getURL().toString()} target=\"_blank\">\n {userPageTitle?.getPrefixedText()} →\n </a>\n </p>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <ActionButton\n type=\"primary\"\n onClick={(e) => {\n e.preventDefault()\n const btn = e.target as HTMLButtonElement\n btn.disabled = true\n const modal = ctx.preferencesUI.getCurrentModal()\n modal?.setLoadingState(true)\n this.exportToUserPage()\n .then((title) => {\n ctx.modal.notify('success', {\n title: 'Preferences Exported',\n content: (\n <p>\n Your preferences have been exported to{' '}\n <a href={title.getURL().toString()} target=\"_blank\">\n {title.getPrefixedText()}\n </a>\n .\n </p>\n ),\n })\n })\n .finally(() => {\n btn.disabled = false\n modal?.setLoadingState(false)\n })\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-cloud-up\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 18.004h-5.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.38 0 2.57 .811 3.128 1.986\" />\n <path d=\"M19 22v-6\" />\n <path d=\"M22 19l-3 -3l-3 3\" />\n </svg>{' '}\n Backup\n </ActionButton>\n <ActionButton\n onClick={(e) => {\n e.preventDefault()\n const modal = ctx.preferencesUI.getCurrentModal()\n const btn = e.target as HTMLButtonElement\n btn.disabled = true\n modal?.setLoadingState(true)\n this.importFromUserPage()\n .then((record) => {\n this.notifyImportSuccess(record)\n })\n .finally(() => {\n btn.disabled = false\n modal?.setLoadingState(false)\n })\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-cloud-down\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 18.004h-5.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.38 0 2.573 .813 3.13 1.99\" />\n <path d=\"M19 16v6\" />\n <path d=\"M22 19l-3 3l-3 -3\" />\n </svg>{' '}\n Restore\n </ActionButton>\n </div>\n </section>\n )}\n <section>\n <h3>Import and export preferences</h3>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <ActionButton\n onClick={(e) => {\n e.preventDefault()\n const modal = ctx.preferencesUI.getCurrentModal()\n modal?.setLoadingState(true)\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'application/json'\n // Mobile Safari (and some older browsers) do not fire a 'cancel' event when\n // the file picker is dismissed without selecting a file. We use a\n // window 'focus' listener as a heuristic: once the picker closes\n // the window regains focus; if no file was chosen we treat it as cancel.\n // Fuck you Apple\n let handled = false\n const onDialogClose = () => {\n // If change handler did not run, treat as cancel\n if (!handled) {\n modal?.setLoadingState(false)\n }\n window.removeEventListener('focus', onDialogClose)\n }\n window.addEventListener('focus', onDialogClose, { once: true })\n\n input.addEventListener('change', async (e) => {\n handled = true\n try {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) {\n return\n }\n const record = await this.importFromFile(file)\n this.notifyImportSuccess(record)\n } catch (e) {\n ctx.modal.notify('error', {\n title: 'Import failed',\n content: e instanceof Error ? e.message : String(e),\n })\n } finally {\n modal?.setLoadingState(false)\n }\n })\n input.click()\n }}\n >\n Import from file\n </ActionButton>\n <ActionButton\n onClick={(e) => {\n e.preventDefault()\n const input = (<input type=\"url\"></input>) as HTMLInputElement\n const modal = ctx.preferencesUI.getCurrentModal()\n ctx.modal.confirm(\n {\n title: 'Import Preferences from URL',\n content: (\n <div>\n <label htmlFor=\"url-input\">\n Enter the URL of the preferences JSON file:\n </label>\n {input}\n </div>\n ),\n },\n async (result) => {\n const url = input.value.trim()\n if (!result || !url) {\n return\n }\n try {\n modal?.setLoadingState(true)\n const record = await this.importFromUrl(url)\n this.notifyImportSuccess(record)\n } catch (e) {\n ctx.modal.notify('error', {\n title: 'Import failed',\n content: e instanceof Error ? e.message : String(e),\n })\n } finally {\n modal?.setLoadingState(false)\n }\n }\n )\n }}\n >\n Import from URL\n </ActionButton>\n <ActionButton\n onClick={async (e) => {\n e.preventDefault()\n // 首先尝试保存当前的表单内容\n await ctx.preferencesUI.dispatchFormSave()\n const data = await ctx.preferences.getExportableRecord()\n const json = JSON.stringify(data, null, 2)\n ctx.modal.dialog(\n {\n title: 'Save to file',\n content: (\n <div>\n <label htmlFor=\"data\">Your InPageEdit preferences:</label>\n <textarea\n name=\"data\"\n id=\"data\"\n rows={10}\n value={json}\n readOnly\n style={{ width: '100%' }}\n ></textarea>\n </div>\n ),\n buttons: [\n {\n label: 'Copy',\n method: (_, m) => {\n navigator.clipboard.writeText(json)\n ctx.modal.notify('success', {\n content: 'Copied to clipboard',\n })\n m.close()\n },\n },\n {\n label: 'Download',\n method: (_, m) => {\n const a = document.createElement('a')\n a.href = `data:text/json;charset=utf-8,${encodeURIComponent(json)}`\n a.download = `ipe-prefs-${new Date().toISOString()}.json`\n a.click()\n m.close()\n },\n },\n ],\n },\n () => {}\n )\n }}\n >\n Save as file\n </ActionButton>\n </div>\n </section>\n </div>\n )\n },\n })\n }\n\n protected stop(): Promise<void> | void {}\n\n /**\n * 获取用户页配置文件的标题\n */\n private getUserPrefsPageTitle(): IWikiTitle | null {\n try {\n const userName = this.ctx.wiki?.userInfo?.name\n if (!userName) {\n return null\n }\n // 使用 User: 命名空间\n return this.ctx.wikiTitle.newTitle(`User:${userName}/ipe-prefs.json`, 2)\n } catch {\n return null\n }\n }\n\n /**\n * 从用户页加载配置\n */\n async importFromUserPage(): Promise<Record<string, unknown>> {\n const title = this.getUserPrefsPageTitle()\n if (!title) {\n this.logger.debug('Cannot get user page title, skipping load')\n return {}\n }\n\n try {\n // 使用 raw action 获取 JSON 内容\n const rawUrl = title.getURL({ action: 'raw', ctype: 'application/json' })\n const changed = await this.importFromUrl(rawUrl.toString())\n this.logger.info('Loaded preferences from user page:', title)\n return changed\n } catch (error) {\n this.logger.error('Failed to load preferences from user page:', error)\n return {}\n }\n }\n\n /**\n * 导出配置到用户页\n */\n async exportToUserPage(): Promise<IWikiTitle> {\n const ctx = this.ctx\n const title = this.getUserPrefsPageTitle()\n if (!title) {\n throw new Error('Cannot get user page title')\n }\n\n // 首先尝试保存当前的表单内容\n await ctx.preferencesUI.dispatchFormSave()\n\n const json = await ctx.preferences.getExportableRecord()\n const text = JSON.stringify(json, null, 2)\n\n try {\n const page = this.ctx.wikiPage.newBlankPage({\n title: title.toString(),\n ns: 2, // User namespace\n })\n await page.edit({\n text,\n summary: 'Update InPageEdit preferences',\n watchlist: WatchlistAction.nochange,\n })\n\n this.logger.info('Exported preferences to user page:', title)\n return title\n } catch (error) {\n this.logger.error('Failed to export preferences to user page:', error)\n throw error\n }\n }\n\n async importFromUrl(input: string): Promise<Record<string, unknown>> {\n const response = await fetch(input)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n const blob = await response.blob()\n const changed = await this.importFromFile(blob)\n return changed\n }\n\n async importFromFile(input: Blob): Promise<Record<string, unknown>> {\n const text = await input.text()\n const data = JSON.parse(text)\n const changed = await this.ctx.preferences.setMany(data)\n return changed\n }\n\n private notifyImportSuccess(configs?: Record<string, unknown>) {\n const keys = Object.keys(configs ?? {})\n const count = keys.length\n return this.ctx.modal.notify('success', {\n title: 'Preferences Imported',\n content: (\n <section>\n <p>\n Successfully imported {count || ''} {count !== 1 ? 'settings' : 'setting'}:\n </p>\n <ol style={{ listStyle: 'auto', paddingLeft: '1em' }}>\n {keys.map((key) => (\n <li key={key}>{key}</li>\n ))}\n </ol>\n </section>\n ),\n })\n }\n}\n"],"names":["_PluginPrefSync_decorators","_init","_a","Inject","PluginPrefSync","BasePlugin","ctx","userPageTitle","jsxs","jsx","ActionButton","e","btn","modal","title","record","input","handled","onDialogClose","file","result","url","data","json","_","m","a","userName","rawUrl","changed","error","text","WatchlistAction","response","blob","configs","keys","count","key","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|