@inpageedit/core 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +55 -55
  3. package/dist/ActionButton-BgbTKTg7.js.map +1 -1
  4. package/dist/CheckBox-D3rHnX7I.js.map +1 -1
  5. package/dist/{IconQuickEdit-YVn1ANbm.js → IconQuickEdit-CAL1HXIb.js} +4 -4
  6. package/dist/IconQuickEdit-CAL1HXIb.js.map +1 -0
  7. package/dist/InputBox-BV4m05Xs.js.map +1 -1
  8. package/dist/Preferences-Bg3J5Ur9.js.map +1 -1
  9. package/dist/RadioBox-nJqWsxW2.js.map +1 -1
  10. package/dist/__test__/utils/constants.d.ts +2 -2
  11. package/dist/components/index.js.map +1 -1
  12. package/dist/index-9M1QcjCN.js +354 -0
  13. package/dist/index-9M1QcjCN.js.map +1 -0
  14. package/dist/{index-C0V2s48o.js → index-Ba7Wkale.js} +38 -33
  15. package/dist/index-Ba7Wkale.js.map +1 -0
  16. package/dist/index-Bh70Udzi.js.map +1 -1
  17. package/dist/{index--xn9BebC.js → index-C8dOYIIz.js} +61 -69
  18. package/dist/{index--xn9BebC.js.map → index-C8dOYIIz.js.map} +1 -1
  19. package/dist/{index-DpLwTw4C.js → index-COlXHFRg.js} +2599 -2080
  20. package/dist/index-COlXHFRg.js.map +1 -0
  21. package/dist/{index-DTA86mHU.js → index-CeXR4lOu.js} +5 -5
  22. package/dist/index-CeXR4lOu.js.map +1 -0
  23. package/dist/index-CvhkVj_L.js.map +1 -1
  24. package/dist/{index-VzP81S7B.js → index-DBV8FBjA.js} +2 -2
  25. package/dist/index-DBV8FBjA.js.map +1 -0
  26. package/dist/{index-DlgTb4XY.js → index-DwyuBkCK.js} +3 -3
  27. package/dist/index-DwyuBkCK.js.map +1 -0
  28. package/dist/{index-DDWds9Jg.js → index-OBerV4GU.js} +28 -28
  29. package/dist/index-OBerV4GU.js.map +1 -0
  30. package/dist/{index-TzKe6Ebm.js → index-Tn22YSmW.js} +2 -2
  31. package/dist/index-Tn22YSmW.js.map +1 -0
  32. package/dist/index-kRdAN8h3.js +193 -0
  33. package/dist/index-kRdAN8h3.js.map +1 -0
  34. package/dist/index-lZkYoUca.js.map +1 -1
  35. package/dist/{index-BT1mN_St.js → index-mntCdHRr.js} +3 -3
  36. package/dist/{index-BT1mN_St.js.map → index-mntCdHRr.js.map} +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/makeCallable-LDU0xZMJ.js.map +1 -1
  39. package/dist/models/WikiTitle/index.d.ts +1 -0
  40. package/dist/noop-ClDc6zv4.js.map +1 -1
  41. package/dist/plugins/in-article-links/index.d.ts +1 -1
  42. package/dist/plugins/quick-delete/index.d.ts +1 -1
  43. package/dist/plugins/quick-diff/PluginQuickDiffCore.d.ts +1 -1
  44. package/dist/plugins/quick-edit/index.d.ts +1 -1
  45. package/dist/plugins/quick-preview/index.d.ts +1 -1
  46. package/dist/services/CurrentPageService.d.ts +27 -0
  47. package/dist/services/{ModalService/index.d.ts → ModalService.d.ts} +4 -4
  48. package/dist/services/WikiTitleService.d.ts +19 -7
  49. package/dist/style.css +1 -1
  50. package/lib/index.umd.js +34 -35
  51. package/lib/index.umd.js.map +1 -1
  52. package/lib/style.css +1 -1
  53. package/package.json +7 -6
  54. package/dist/IconQuickEdit-YVn1ANbm.js.map +0 -1
  55. package/dist/index-C0V2s48o.js.map +0 -1
  56. package/dist/index-DDWds9Jg.js.map +0 -1
  57. package/dist/index-DDef1ojx.js +0 -166
  58. package/dist/index-DDef1ojx.js.map +0 -1
  59. package/dist/index-DTA86mHU.js.map +0 -1
  60. package/dist/index-DlgTb4XY.js.map +0 -1
  61. package/dist/index-DpLwTw4C.js.map +0 -1
  62. package/dist/index-TzKe6Ebm.js.map +0 -1
  63. package/dist/index-VzP81S7B.js.map +0 -1
  64. package/dist/index-loWqosf7.js +0 -331
  65. package/dist/index-loWqosf7.js.map +0 -1
  66. package/dist/services/ModalService/IPEModal.d.ts +0 -235
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-TzKe6Ebm.js","sources":["../src/plugins/quick-move/index.tsx"],"sourcesContent":["import { Inject, InPageEdit } from '@/InPageEdit'\r\n\r\ndeclare module '@/InPageEdit' {\r\n interface InPageEdit {\r\n quickMove: PluginQuickMove['quickMove']\r\n movePage: PluginQuickMove['movePage']\r\n }\r\n}\r\n\r\nexport interface MovePageOptions {\r\n from: string\r\n to: string\r\n reason?: string\r\n movetalk?: boolean\r\n movesubpages?: boolean\r\n noredirect?: boolean\r\n}\r\nexport interface QuickMoveOptions extends Partial<MovePageOptions> {\r\n lockFromField?: boolean\r\n lockToField?: boolean\r\n}\r\n\r\n@Inject(['modal', 'wiki'])\r\nexport class PluginQuickMove extends BasePlugin {\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, {}, 'quick-move')\r\n ctx.set('quickMove', this.quickMove.bind(this))\r\n ctx.set('movePage', this.movePage.bind(this))\r\n }\r\n\r\n protected start(): Promise<void> | void {\r\n this.ctx.inject(['toolbox'], (ctx) => {\r\n this.injectToolbox(ctx)\r\n })\r\n }\r\n\r\n private injectToolbox(ctx: InPageEdit) {\r\n const curPageName = window.mw?.config.get('wgPageName') || ''\r\n const canEdit = window.mw?.config.get('wgIsProbablyEditable')\r\n ctx.toolbox.addButton({\r\n id: 'quick-move',\r\n icon: (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-forms\"\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3\" />\r\n <path d=\"M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3\" />\r\n <path d=\"M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7\" />\r\n <path d=\"M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1\" />\r\n <path d=\"M17 12h.01\" />\r\n <path d=\"M13 12h.01\" />\r\n </svg>\r\n ),\r\n tooltip: 'Quick Move',\r\n group: 'group1',\r\n index: 1,\r\n onClick: () => {\r\n this.quickMove(\r\n canEdit\r\n ? {\r\n lockFromField: true,\r\n from: curPageName,\r\n }\r\n : {}\r\n )\r\n },\r\n })\r\n }\r\n\r\n quickMove(options?: Partial<QuickMoveOptions>) {\r\n const modal = this.ctx.modal\r\n .createObject({\r\n title: 'Quick Move',\r\n content: (<ProgressBar />) as HTMLElement,\r\n className: 'quick-move compact-buttons',\r\n sizeClass: 'smallToMedium',\r\n center: true,\r\n })\r\n .init()\r\n\r\n let formRef: HTMLFormElement | null = null\r\n modal.setContent(\r\n (\r\n <form\r\n ref={(el) => (formRef = el)}\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '1rem',\r\n }}\r\n onSubmit={(e) => {\r\n e.preventDefault()\r\n formRef?.checkValidity()\r\n if (!formRef?.reportValidity()) {\r\n return\r\n }\r\n const formData = new FormData(formRef!)\r\n const options = {\r\n from: formData.get('from')?.toString().trim()!,\r\n to: formData.get('to')?.toString().trim()!,\r\n reason: (formData.get('reason') as string) || '',\r\n movetalk: formData.get('movetalk') === 'on',\r\n movesubpages: formData.get('movesubpages') === 'on',\r\n noredirect: formData.get('noredirect') === 'on',\r\n }\r\n if (!options.from || !options.to) {\r\n this.ctx.modal.notify('error', {\r\n title: 'Failed to move',\r\n content: 'From and to are required.',\r\n })\r\n return\r\n }\r\n modal.setLoadingState(true)\r\n this.movePage(options)\r\n .then(() => {\r\n location.reload()\r\n })\r\n .catch((error) => {\r\n modal.setLoadingState(false)\r\n this.ctx.modal.notify('error', {\r\n title: 'Failed to move',\r\n content: error instanceof Error ? error.message : String(error),\r\n })\r\n })\r\n }}\r\n >\r\n <TwinSwapInput\r\n inputs={[\r\n {\r\n label: 'Move from',\r\n name: 'from',\r\n value: options?.from,\r\n required: true,\r\n },\r\n {\r\n label: 'Move to',\r\n name: 'to',\r\n value: options?.to,\r\n required: true,\r\n },\r\n ]}\r\n />\r\n <div>\r\n <CheckBox name=\"movetalk\" id=\"movetalk\" checked={options?.movetalk}>\r\n Move talk page\r\n </CheckBox>\r\n </div>\r\n <div>\r\n <CheckBox name=\"movesubpages\" id=\"movesubpages\" checked={options?.movesubpages}>\r\n Move subpage(s) (up to 100)\r\n </CheckBox>\r\n </div>\r\n {this.ctx.wiki.hasRight('suppressredirect') && (\r\n <div>\r\n <CheckBox name=\"noredirect\" id=\"noredirect\" checked={options?.noredirect}>\r\n Move without leaving a redirect\r\n </CheckBox>\r\n </div>\r\n )}\r\n <InputBox label=\"Reason\" id=\"reason\" name=\"reason\" value={options?.reason} />\r\n </form>\r\n ) as HTMLElement\r\n )\r\n\r\n modal.setButtons([\r\n {\r\n label: 'Move',\r\n className: 'is-primary is-ghost',\r\n method: () => {\r\n formRef?.dispatchEvent(new Event('submit'))\r\n },\r\n },\r\n ])\r\n\r\n return modal.show()\r\n }\r\n\r\n async movePage(options: MovePageOptions) {\r\n const { from, to, reason = '', ...rest } = options\r\n\r\n if (!from || !to) {\r\n throw new Error('From and to titles are required.')\r\n }\r\n if (from === to) {\r\n throw new Error('From and to titles cannot be the same.')\r\n }\r\n\r\n const wikiPage = await this.ctx.wikiPage.newFromTitle(from)\r\n return wikiPage.moveTo(to, reason, rest)\r\n }\r\n}\r\n"],"names":["_PluginQuickMove_decorators","_init","_a","Inject","PluginQuickMove","BasePlugin","ctx","curPageName","canEdit","jsxs","jsx","options","modal","ProgressBar","formRef","el","e","formData","error","TwinSwapInput","CheckBox","InputBox","from","to","reason","rest","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-VzP81S7B.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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"}
@@ -1,331 +0,0 @@
1
- import { j as i, F as b, P as T } from "./index-CvhkVj_L.js";
2
- import { B as C, W as m, I as M, S as h } from "./index-DpLwTw4C.js";
3
- import { m as A } from "./makeCallable-LDU0xZMJ.js";
4
- import { R as B } from "./Preferences-Bg3J5Ur9.js";
5
- import { M as S } from "./index-lZkYoUca.js";
6
- import { I as F } from "./InputBox-BV4m05Xs.js";
7
- import { R as O } from "./RadioBox-nJqWsxW2.js";
8
- import { C as _ } from "./CheckBox-D3rHnX7I.js";
9
- import { n as E } from "./noop-ClDc6zv4.js";
10
- const j = (t = 0) => new Promise((e) => setTimeout(e, t));
11
- var L = Object.create, x = Object.defineProperty, D = Object.getOwnPropertyDescriptor, y = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), P = (t) => {
12
- throw TypeError(t);
13
- }, R = (t, e, c) => e in t ? x(t, e, { enumerable: !0, configurable: !0, writable: !0, value: c }) : t[e] = c, U = (t, e) => x(t, "name", { value: e, configurable: !0 }), W = (t) => [, , , L(t?.[y("metadata")] ?? null)], z = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], q = (t) => t !== void 0 && typeof t != "function" ? P("Function expected") : t, Q = (t, e, c, l, s) => ({ kind: z[t], name: e, metadata: l, addInitializer: (d) => c._ ? P("Already initialized") : s.push(q(d || null)) }), Y = (t, e) => R(e, y("metadata"), t[3]), K = (t, e, c, l) => {
14
- for (var s = 0, d = t[e >> 1], n = d && d.length; s < n; s++) d[s].call(c);
15
- return l;
16
- }, G = (t, e, c, l, s, d) => {
17
- var n, r, a, u = e & 7, p = !1, g = 0, o = t[g] || (t[g] = []), f = u && (s = s.prototype, u < 5 && (u > 3 || !p) && D(s, c));
18
- U(s, c);
19
- for (var v = l.length - 1; v >= 0; v--)
20
- a = Q(u, c, r = {}, t[3], o), n = (0, l[v])(s, a), r._ = 1, q(n) && (s = n);
21
- return Y(t, s), f && x(s, c, f), p ? u ^ 4 ? d : f : s;
22
- }, I, k, N;
23
- I = [M(["api", "wikiPage", "wikiTitle", "wiki", "modal", "preferences"]), B(
24
- h.object({
25
- "quickEdit.editSummary": h.string().description("Default edit summary for quick edits").default("[IPE-NEXT] Quick edit"),
26
- "quickEdit.editMinor": h.boolean().description("Whether to mark the edit as minor").default(!1),
27
- "quickEdit.outSideClose": h.boolean().description("Whether to close the modal outside").default(!0),
28
- "quickEdit.watchList": h.union([
29
- h.const(m.preferences).description("Follow my preferences"),
30
- h.const(m.nochange).description("Keep the current watchlist status"),
31
- h.const(m.watch).description("Add the page to watchlist"),
32
- h.const(m.unwatch).description("Remove the page from watchlist")
33
- ]).description("Watchlist options").default(m.preferences),
34
- "quickEdit.keyshortcut.save": h.string().default("ctrl-s").description("save button key shortcut (blank to disable)")
35
- }).description("Quick edit options").extra("category", "edit")
36
- )];
37
- class w extends (N = C) {
38
- constructor(e) {
39
- super(e, {}, "quick-edit"), this.ctx = e, this.DEFAULT_OPTIONS = {
40
- title: "",
41
- pageId: 0,
42
- revision: 0,
43
- section: void 0,
44
- editMinor: !1,
45
- editSummary: "",
46
- createOnly: !1,
47
- reloadAfterSave: !0
48
- }, this.ctx.root.set("quickEdit", A(this, "showModal"));
49
- }
50
- start() {
51
- this.ctx.inject(["toolbox"], (e) => {
52
- this.injectToolbox(e), e.on("dispose", () => {
53
- this.removeToolbox(e);
54
- });
55
- });
56
- }
57
- async showModal(e) {
58
- if (typeof e > "u" ? e = {} : typeof e == "string" && (e = {
59
- title: e
60
- }), e?.page && (e.title = e.page, delete e.page), !e.title && !e.pageId && !e.revision) {
61
- this.logger.warn("None of the title, pageId or revision provided. Using defaults.");
62
- const o = new URLSearchParams(window.location.search);
63
- e = {
64
- ...e,
65
- title: this.ctx.wikiTitle.currentTitle.getPrefixedDBKey(),
66
- revision: o.has("oldid") ? Number(o.get("oldid")) : void 0,
67
- pageId: o.has("curid") ? Number(o.get("curid")) : void 0
68
- };
69
- }
70
- const c = await this.ctx.preferences.get("quickEdit.outSideClose"), l = await this.ctx.preferences.get("quickEdit.watchList"), s = 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"), n = {
71
- ...this.DEFAULT_OPTIONS,
72
- editSummary: s,
73
- editMinor: d,
74
- ...e
75
- };
76
- n.editSummary || (n.editSummary = await this.ctx.preferences.get("quickEdit.editSummary") || ""), n || this.ctx.emit("quick-edit/init-options", { ctx: this.ctx, options: n });
77
- const r = this.ctx.modal.createObject({
78
- className: "ipe-quickEdit",
79
- sizeClass: "large",
80
- // backdrop: false,
81
- // draggable: true,
82
- center: !1,
83
- outSideClose: c
84
- }).init();
85
- r.setTitle(
86
- /* @__PURE__ */ i(b, { children: [
87
- "Loading: ",
88
- /* @__PURE__ */ i("u", { children: n.title })
89
- ] })
90
- ), r.setContent(
91
- /* @__PURE__ */ i(
92
- "section",
93
- {
94
- className: "ipe-quickEdit-loading",
95
- style: {
96
- height: "70vh",
97
- display: "flex",
98
- flexDirection: "column",
99
- justifyContent: "center",
100
- alignItems: "center"
101
- },
102
- children: /* @__PURE__ */ i(T, {})
103
- }
104
- )
105
- ), r.addButton({
106
- side: "right",
107
- type: "button",
108
- className: "is-danger is-ghost",
109
- label: "Cancel",
110
- method() {
111
- r.close();
112
- }
113
- }), r.show(), this.ctx.emit("quick-edit/show-modal", { ctx: this.ctx, modal: r, options: n });
114
- let a;
115
- try {
116
- if (a = await this.getWikiPageFromPayload(n), a.pageInfo.special)
117
- throw new Error("Special page is not editable");
118
- } catch (o) {
119
- r.off(r.Event.Close), r.close(), this.ctx.modal.notify("error", {
120
- content: o instanceof Error ? o.message : String(o)
121
- });
122
- return;
123
- }
124
- r.setTitle(
125
- /* @__PURE__ */ i(b, { children: [
126
- "Quick ",
127
- a.pageInfo.pageid === 0 ? "Create" : "Edit",
128
- ":",
129
- " ",
130
- /* @__PURE__ */ i("u", { children: a.pageInfo.title })
131
- ] })
132
- );
133
- const u = [];
134
- a.pageInfo.pageid === 0 && u.push(
135
- /* @__PURE__ */ i(S, { title: "Attention", type: "important", children: /* @__PURE__ */ i("p", { children: "This page does not exist." }) })
136
- ), a.pageInfo.pageid && a.pageInfo.lastrevid !== a.revisions[0]?.revid && u.push(
137
- /* @__PURE__ */ i(S, { title: "Attention", type: "warning", children: /* @__PURE__ */ i("p", { children: [
138
- "You are editing a ",
139
- /* @__PURE__ */ i("em", { children: "historical version" }),
140
- "; the content is not the latest!"
141
- ] }) })
142
- ), this.ctx.emit("quick-edit/edit-notice", {
143
- ctx: this.ctx,
144
- options: n,
145
- modal: r,
146
- wikiPage: a,
147
- editNotices: u
148
- });
149
- const p = /* @__PURE__ */ i("form", { className: "ipe-quickEdit__form", children: [
150
- /* @__PURE__ */ i("div", { className: "ipe-quickEdit__notices", children: u }),
151
- /* @__PURE__ */ i("div", { className: "ipe-quickEdit__content", children: /* @__PURE__ */ i("textarea", { className: "ipe-quickEdit__textarea", name: "text", id: "wpTextbox1", children: a.revisions[0]?.content || "" }) }),
152
- /* @__PURE__ */ i(
153
- "div",
154
- {
155
- class: "ipe-quickEdit__options",
156
- style: {
157
- display: "flex",
158
- flexDirection: "column",
159
- gap: "1rem",
160
- marginTop: "1rem"
161
- },
162
- children: [
163
- /* @__PURE__ */ i(F, { label: "Summary", id: "summary", name: "summary", value: n.editSummary }),
164
- /* @__PURE__ */ i("div", { className: "ipe-input-box", children: [
165
- /* @__PURE__ */ i("label", { htmlFor: "watchlist", style: { display: "block" }, children: "Watchlist" }),
166
- /* @__PURE__ */ i("div", { style: { display: "flex", gap: "1rem" }, children: [
167
- m.preferences,
168
- m.nochange,
169
- m.watch,
170
- m.unwatch
171
- ].map((o) => /* @__PURE__ */ i(
172
- O,
173
- {
174
- name: "watchlist",
175
- value: o,
176
- inputProps: { checked: l === o },
177
- children: o
178
- },
179
- o
180
- )) })
181
- ] }),
182
- /* @__PURE__ */ i("div", { style: { display: "flex", gap: "1rem" }, children: [
183
- /* @__PURE__ */ i(_, { name: "minor", id: "minor", checked: n.editMinor, children: "Minor edit" }),
184
- /* @__PURE__ */ i(_, { name: "reloadAfterSave", id: "reloadAfterSave", checked: n.reloadAfterSave, children: "Reload after save" })
185
- ] })
186
- ]
187
- }
188
- ),
189
- !1
190
- ] });
191
- r.setContent(p), r.addButton(
192
- {
193
- side: "left",
194
- className: "is-primary submit-btn",
195
- label: "Submit",
196
- keyPress: await this.ctx.preferences.get("quickEdit.keyshortcut.save") || void 0,
197
- method: () => {
198
- const o = new FormData(p);
199
- r.setLoadingState(!0), this.handleSubmit({
200
- wikiPage: a,
201
- text: o.get("text"),
202
- summary: o.get("summary"),
203
- minor: o.get("minor") === "on",
204
- section: n.section,
205
- createonly: a.pageid === 0,
206
- watchlist: l
207
- }).then(async () => {
208
- r.setOptions({
209
- beforeClose: E
210
- }), r.close(), this.ctx.modal.notify("success", {
211
- title: "Submission Successful",
212
- content: "Your changes have been saved."
213
- }), o.get("reloadAfterSave") && (await j(500), location.reload());
214
- }).catch((f) => {
215
- this.ctx.modal.notify("error", {
216
- title: "Submission Error",
217
- content: f instanceof Error ? f.message : String(f)
218
- }), r.setLoadingState(!1);
219
- });
220
- }
221
- },
222
- 0
223
- ), r.setOptions({
224
- beforeClose: () => {
225
- const o = a.revisions[0]?.content || "";
226
- return (p.querySelector("textarea")?.value || "") === o ? !0 : (this.ctx.modal.confirm(
227
- {
228
- className: "is-primary",
229
- title: "Unsaved Changes",
230
- content: "All edit contents will be lost after closing the modal. Are you sure you want to close?",
231
- center: !0,
232
- okBtn: {
233
- label: "Give Up",
234
- className: "is-danger is-ghost"
235
- },
236
- cancelBtn: {
237
- label: "Continue Editing",
238
- className: "is-primary is-ghost"
239
- }
240
- },
241
- (v) => (v && (r.setOptions({
242
- beforeClose: E
243
- }), r.close()), !0)
244
- ), !1);
245
- }
246
- }), this.ctx.emit("quick-edit/wiki-page", {
247
- ctx: this.ctx,
248
- options: n,
249
- modal: r,
250
- wikiPage: a
251
- });
252
- const g = (o) => p.querySelector("textarea")?.value === a.revisions[0]?.content ? !0 : (o.preventDefault(), "You have unsaved changes. Are you sure you want to leave?");
253
- window.addEventListener("beforeunload", g), r.on(r.Event.Close, () => {
254
- window.removeEventListener("beforeunload", g);
255
- });
256
- }
257
- async handleSubmit(e) {
258
- const c = e.wikiPage, l = e.summary || "", s = e.text || "", d = e.minor, n = e.createonly, r = e.watchlist, a = e.section;
259
- return c.edit(
260
- {
261
- summary: l,
262
- text: s,
263
- watchlist: r,
264
- section: a
265
- },
266
- {
267
- minor: d,
268
- createonly: n
269
- }
270
- );
271
- }
272
- async getWikiPageFromPayload(e) {
273
- if (e.revision)
274
- return this.ctx.wikiPage.newFromRevision(e.revision, e.section);
275
- if (e.pageId)
276
- return this.ctx.wikiPage.newFromPageId(e.pageId, e.section);
277
- if (e.title)
278
- return this.ctx.wikiPage.newFromTitle(e.title, !1, e.section);
279
- throw new Error("Invalid payload");
280
- }
281
- injectToolbox(e) {
282
- const c = this.ctx.wikiTitle.currentTitle, l = this.ctx.wiki.hasRight("edit") && c.getNamespaceId() >= 0;
283
- e.toolbox.addButton({
284
- id: "quick-edit",
285
- group: "group1",
286
- index: 0,
287
- icon: /* @__PURE__ */ i(
288
- "svg",
289
- {
290
- xmlns: "http://www.w3.org/2000/svg",
291
- width: "24",
292
- height: "24",
293
- viewBox: "0 0 24 24",
294
- fill: "none",
295
- stroke: "currentColor",
296
- "stroke-width": "2",
297
- "stroke-linecap": "round",
298
- "stroke-linejoin": "round",
299
- class: "icon icon-tabler icons-tabler-outline icon-tabler-edit",
300
- children: [
301
- /* @__PURE__ */ i("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
302
- /* @__PURE__ */ i("path", { d: "M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1" }),
303
- /* @__PURE__ */ i("path", { d: "M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z" }),
304
- /* @__PURE__ */ i("path", { d: "M16 5l3 3" })
305
- ]
306
- }
307
- ),
308
- buttonProps: {
309
- disabled: !l
310
- },
311
- tooltip: l ? "Quick Edit" : "Not editable",
312
- onClick: () => {
313
- const s = new URLSearchParams(window.location.search).get("oldid");
314
- this.showModal({
315
- title: c.getPrefixedText(),
316
- revision: s ? Number(s) : void 0
317
- });
318
- }
319
- });
320
- }
321
- removeToolbox(e) {
322
- e.toolbox.removeButton("quick-edit");
323
- }
324
- }
325
- k = W(N);
326
- w = G(k, 0, "PluginQuickEdit", I, w);
327
- K(k, 1, w);
328
- export {
329
- w as PluginQuickEdit
330
- };
331
- //# sourceMappingURL=index-loWqosf7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-loWqosf7.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 '@/services/ModalService/IPEModal'\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', '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 payload = {\n ...payload,\n title: this.ctx.wikiTitle.currentTitle.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 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 if (!options) 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 modal.setTitle(\n (\n <>\n Quick {wikiPage.pageInfo.pageid === 0 ? 'Create' : 'Edit'}:{' '}\n <u>{wikiPage.pageInfo.title}</u>\n </>\n ) as HTMLElement\n )\n\n const editNotices = [] as ReactNode[]\n // Page not exists\n if (wikiPage.pageInfo.pageid === 0) {\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 (wikiPage.pageInfo.pageid && wikiPage.pageInfo.lastrevid !== wikiPage.revisions[0]?.revid) {\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 className=\"ipe-quickEdit__content\">\n <textarea className=\"ipe-quickEdit__textarea\" name=\"text\" id=\"wpTextbox1\">\n {wikiPage.revisions[0]?.content || ''}\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 <InputBox label=\"Summary\" id=\"summary\" name=\"summary\" value={options.editSummary} />\n <div className=\"ipe-input-box\">\n <label htmlFor=\"watchlist\" style={{ display: 'block' }}>\n Watchlist\n </label>\n <div style={{ display: 'flex', gap: '1rem' }}>\n {[\n WatchlistAction.preferences,\n WatchlistAction.nochange,\n WatchlistAction.watch,\n WatchlistAction.unwatch,\n ].map((action) => (\n <RadioBox\n key={action}\n name=\"watchlist\"\n value={action}\n inputProps={{ checked: watchList === action }}\n >\n {action}\n </RadioBox>\n ))}\n </div>\n </div>\n <div style={{ display: 'flex', gap: '1rem' }}>\n <CheckBox name=\"minor\" id=\"minor\" checked={options.editMinor}>\n Minor edit\n </CheckBox>\n <CheckBox name=\"reloadAfterSave\" id=\"reloadAfterSave\" checked={options.reloadAfterSave}>\n Reload after save\n </CheckBox>\n </div>\n </div>\n {/* Debug Info */}\n {import.meta.env.DEV && (\n <div className=\"debug\" style={{ marginTop: '1rem' }}>\n <details>\n <pre>{JSON.stringify(wikiPage.pageInfo, null, 2)}</pre>\n </details>\n </div>\n )}\n </form>\n ) as HTMLFormElement\n modal.setContent(editForm)\n // shamefully fix: make sure the submit button is always the first\n modal.addButton(\n {\n side: 'left',\n className: 'is-primary submit-btn',\n label: 'Submit',\n 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 injectToolbox(ctx: InPageEdit) {\n const title = this.ctx.wikiTitle.currentTitle\n const canEdit = this.ctx.wiki.hasRight('edit') && 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","outSideClose","watchList","editSummary","editMinor","options","modal","jsxs","Fragment","jsx","ProgressBar","wikiPage","e","editNotices","MBox","editForm","InputBox","action","RadioBox","CheckBox","formData","noop","error","oldStr","confirmed","beforeUnload","summary","text","minor","createonly","watchlist","section","title","canEdit","revision","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}