@inpageedit/core 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE +20 -20
  2. package/dist/{ActionButton-BgbTKTg7.js → ActionButton-CRjo_l3y.js} +2 -2
  3. package/dist/{ActionButton-BgbTKTg7.js.map → ActionButton-CRjo_l3y.js.map} +1 -1
  4. package/dist/{CheckBox-D3rHnX7I.js → CheckBox-Bc79KBEB.js} +2 -2
  5. package/dist/{CheckBox-D3rHnX7I.js.map → CheckBox-Bc79KBEB.js.map} +1 -1
  6. package/dist/{IconQuickEdit-CAL1HXIb.js → IconQuickEdit-CMCQncyj.js} +2 -2
  7. package/dist/IconQuickEdit-CMCQncyj.js.map +1 -0
  8. package/dist/InPageEdit.d.ts +5 -1
  9. package/dist/{InputBox-BV4m05Xs.js → InputBox-DZAdyZ4B.js} +2 -2
  10. package/dist/InputBox-DZAdyZ4B.js.map +1 -0
  11. package/dist/PluginPrefSync-BPQkNtX8.js +292 -0
  12. package/dist/PluginPrefSync-BPQkNtX8.js.map +1 -0
  13. package/dist/PluginStoreApp-Cxspe6t8.js +158 -0
  14. package/dist/PluginStoreApp-Cxspe6t8.js.map +1 -0
  15. package/dist/Preferences-DS4-CFWe.js.map +1 -1
  16. package/dist/{RadioBox-nJqWsxW2.js → RadioBox-0UuxlcWZ.js} +2 -2
  17. package/dist/{RadioBox-nJqWsxW2.js.map → RadioBox-0UuxlcWZ.js.map} +1 -1
  18. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +10 -0
  19. package/dist/_plugin-vue_export-helper-CHgC5LLL.js.map +1 -0
  20. package/dist/components/index.js +8 -8
  21. package/dist/components/index.js.map +1 -1
  22. package/dist/constants/endpoints.d.ts +2 -1
  23. package/dist/index-B5DtUqkK.js +180 -0
  24. package/dist/index-B5DtUqkK.js.map +1 -0
  25. package/dist/{index-DFPN4uYd.js → index-BXaiDKnr.js} +2316 -2314
  26. package/dist/index-BXaiDKnr.js.map +1 -0
  27. package/dist/{index-B5vDBMEh.js → index-Bv7Dw5eO.js} +10 -9
  28. package/dist/index-Bv7Dw5eO.js.map +1 -0
  29. package/dist/{index-BVkdBJNf.js → index-CB7TltEb.js} +25 -30
  30. package/dist/index-CB7TltEb.js.map +1 -0
  31. package/dist/{index-lZkYoUca.js → index-CG38LlAh.js} +2 -2
  32. package/dist/index-CG38LlAh.js.map +1 -0
  33. package/dist/{index-BP-e8PeH.js → index-CJFePavo.js} +4 -4
  34. package/dist/index-CJFePavo.js.map +1 -0
  35. package/dist/{index-CvhkVj_L.js → index-CM_6yF2v.js} +3 -3
  36. package/dist/{index-CvhkVj_L.js.map → index-CM_6yF2v.js.map} +1 -1
  37. package/dist/{index-D7NpqwUe.js → index-CPoUaSMw.js} +8 -8
  38. package/dist/index-CPoUaSMw.js.map +1 -0
  39. package/dist/{index-CFb1PSJg.js → index-CYc6LH26.js} +53 -43
  40. package/dist/index-CYc6LH26.js.map +1 -0
  41. package/dist/index-CZXxH2-9.js +173 -0
  42. package/dist/index-CZXxH2-9.js.map +1 -0
  43. package/dist/{index-DkQLtTG0.js → index-Ckozkp6W.js} +5 -7
  44. package/dist/index-Ckozkp6W.js.map +1 -0
  45. package/dist/{index-BjwVNZ_h.js → index-D4uwfUZL.js} +6 -6
  46. package/dist/index-D4uwfUZL.js.map +1 -0
  47. package/dist/{index-Bh70Udzi.js → index-DD5CVCfD.js} +2 -2
  48. package/dist/index-DD5CVCfD.js.map +1 -0
  49. package/dist/index-DEav9Ptt.js +365 -0
  50. package/dist/index-DEav9Ptt.js.map +1 -0
  51. package/dist/index-hSl8LzNb.js +1169 -0
  52. package/dist/index-hSl8LzNb.js.map +1 -0
  53. package/dist/index.js +1 -1
  54. package/dist/makeCallable-LDU0xZMJ.js.map +1 -1
  55. package/dist/models/MemoryStorage.d.ts +10 -0
  56. package/dist/models/WikiPage/index.d.ts +14 -0
  57. package/dist/noop-ClDc6zv4.js.map +1 -1
  58. package/dist/plugins/in-article-links/index.d.ts +5 -0
  59. package/dist/plugins/plugin-store/index.d.ts +59 -0
  60. package/dist/plugins/plugin-store/schema.d.ts +41 -0
  61. package/dist/plugins/preferences-ui/PluginPrefSync.d.ts +1 -0
  62. package/dist/plugins/preferences-ui/index.d.ts +34 -5
  63. package/dist/plugins/quick-delete/index.d.ts +3 -0
  64. package/dist/plugins/quick-diff/index.d.ts +3 -0
  65. package/dist/plugins/quick-edit/index.d.ts +8 -0
  66. package/dist/plugins/quick-move/index.d.ts +5 -3
  67. package/dist/plugins/quick-preview/index.d.ts +4 -0
  68. package/dist/plugins/quick-redirect/index.d.ts +11 -4
  69. package/dist/plugins/toolbox/index.d.ts +3 -0
  70. package/dist/services/PreferencesService.d.ts +53 -11
  71. package/dist/services/ResourceLoaderService.d.ts +3 -0
  72. package/dist/services/WikiMetadataService.d.ts +1 -1
  73. package/dist/services/storage/index.d.ts +18 -8
  74. package/dist/services/storage/{IPEStorageManager.d.ts → managers/IDBStorageManager.d.ts} +9 -6
  75. package/dist/services/storage/managers/LocalStorageManager.d.ts +27 -0
  76. package/dist/style.css +1 -1
  77. package/dist/vueHooks-D0uVqbO-.js +4032 -0
  78. package/dist/vueHooks-D0uVqbO-.js.map +1 -0
  79. package/lib/index.umd.js +11 -115
  80. package/lib/index.umd.js.map +1 -1
  81. package/lib/style.css +1 -1
  82. package/package.json +14 -14
  83. package/dist/IconQuickEdit-CAL1HXIb.js.map +0 -1
  84. package/dist/InputBox-BV4m05Xs.js.map +0 -1
  85. package/dist/PluginPrefSync-PIoKRRu2.js +0 -254
  86. package/dist/PluginPrefSync-PIoKRRu2.js.map +0 -1
  87. package/dist/index-B5vDBMEh.js.map +0 -1
  88. package/dist/index-BP-e8PeH.js.map +0 -1
  89. package/dist/index-BVkdBJNf.js.map +0 -1
  90. package/dist/index-Bh70Udzi.js.map +0 -1
  91. package/dist/index-BjwVNZ_h.js.map +0 -1
  92. package/dist/index-BzCqww16.js +0 -159
  93. package/dist/index-BzCqww16.js.map +0 -1
  94. package/dist/index-CFb1PSJg.js.map +0 -1
  95. package/dist/index-D7NpqwUe.js.map +0 -1
  96. package/dist/index-DFPN4uYd.js.map +0 -1
  97. package/dist/index-DGOY4X1J.js +0 -4912
  98. package/dist/index-DGOY4X1J.js.map +0 -1
  99. package/dist/index-DKDtc9IF.js +0 -167
  100. package/dist/index-DKDtc9IF.js.map +0 -1
  101. package/dist/index-DkQLtTG0.js.map +0 -1
  102. package/dist/index-lZkYoUca.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CPoUaSMw.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 'quick-edit/submit'(payload: QuickEditSubmitPayload & { ctx: InPageEdit }): void\n }\n interface PreferencesMap {\n 'quickEdit.editSummary': string\n 'quickEdit.editMinor': boolean\n 'quickEdit.outSideClose': boolean\n 'quickEdit.watchList': WatchlistAction\n 'quickEdit.keyshortcut.save': string\n 'quickEdit.editFont': string\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('Default to checking \"minor edit\" option')\n .default(false),\n 'quickEdit.outSideClose': Schema.boolean()\n .description('Close editor modal by clicking outside')\n .default(true),\n 'quickEdit.watchList': Schema.union([\n Schema.const(WatchlistAction.preferences).description('Follow MW 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 'quickEdit.editFont': Schema.union([\n Schema.const('preferences').description('Follow MW preferences'),\n Schema.const('monospace').description('Monospace'),\n Schema.const('sans-serif').description('Sans-serif'),\n Schema.const('serif').description('Serif'),\n Schema.string().description('Custom font (same as CSS `font-family` property)').default(''),\n ])\n .description(\"Font to use in quick edit's textarea\")\n .default('preferences'),\n })\n .description('Quick edit options')\n .extra('category', 'editor')\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('quickEdit.outSideClose'))!\n const watchList = (await this.ctx.preferences.get('quickEdit.watchList'))!\n const editSummary =\n typeof payload.editSummary === 'string'\n ? payload.editSummary\n : (await this.ctx.preferences.get('quickEdit.editSummary'))!\n const editMinor =\n typeof payload.editMinor === 'boolean'\n ? payload.editMinor\n : (await this.ctx.preferences.get('quickEdit.editMinor'))!\n const fontOptions = await this.getEditFontOptions()\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('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 edittingContent = options.section === 'new' ? '' : wikiPage.revisions[0]?.content || ''\n const edittingRevId = wikiPage.revisions[0]?.revid\n const isEdittingOld = edittingRevId && edittingRevId !== 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 ${edittingRevId})` : ''}\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\n className={`ipe-quickEdit__textarea ${fontOptions.className}`}\n style={{ fontFamily: fontOptions.fontFamily }}\n name=\"text\"\n id=\"wpTextbox1\"\n >\n {edittingContent}\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: (await this.ctx.preferences.get('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 === edittingContent) {\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 this.ctx.emit('quick-edit/submit', {\n ctx: this.ctx,\n wikiPage,\n summary,\n text,\n minor,\n createonly,\n watchlist,\n })\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 static readonly BUILT_IN_FONT_OPTIONS = ['preferences', 'monospace', 'sans-serif', 'serif']\n async getEditFontOptions() {\n const prefEditFont = (await this.ctx.preferences.get('quickEdit.editFont'))!\n if (PluginQuickEdit.BUILT_IN_FONT_OPTIONS.includes(prefEditFont)) {\n const editfont =\n prefEditFont === 'preferences'\n ? this.ctx.wiki.userOptions?.editfont || 'monospace'\n : prefEditFont\n return {\n className: `mw-editfont-${editfont}`,\n fontFamily: '',\n }\n } else {\n return {\n className: 'mw-editfont-custom',\n fontFamily: prefEditFont,\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","fontOptions","options","modal","jsxs","Fragment","jsx","ProgressBar","wikiPage","e","edittingContent","edittingRevId","isEdittingOld","isCreatingNewSection","isCreatingNewPage","editNotices","MBox","editForm","InputBox","action","RadioBox","CheckBox","formData","noop","error","oldStr","confirmed","beforeUnload","summary","text","minor","createonly","watchlist","section","prefEditFont","canEdit","revision","__decoratorStart","__decorateElement","__runInitializers","PluginQuickEdit"],"mappings":"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"}
@@ -1,19 +1,19 @@
1
- import { j as n } from "./index-CvhkVj_L.js";
2
- import { B as A, S as p, E as v, p as P, a as x, I as U } from "./index-DFPN4uYd.js";
3
- var q = Object.create, f = Object.defineProperty, B = Object.getOwnPropertyDescriptor, b = (i, e) => (e = Symbol[i]) ? e : Symbol.for("Symbol." + i), w = (i) => {
1
+ import { j as n } from "./index-CM_6yF2v.js";
2
+ import { B as I, S as p, E as b, p as x, a as P, I as U } from "./index-BXaiDKnr.js";
3
+ var q = Object.create, _ = Object.defineProperty, B = Object.getOwnPropertyDescriptor, v = (i, e) => (e = Symbol[i]) ? e : Symbol.for("Symbol." + i), w = (i) => {
4
4
  throw TypeError(i);
5
- }, L = (i, e, t) => e in i ? f(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, N = (i, e) => f(i, "name", { value: e, configurable: !0 }), T = (i) => [, , , q(i?.[b("metadata")] ?? null)], D = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], k = (i) => i !== void 0 && typeof i != "function" ? w("Function expected") : i, O = (i, e, t, a, s) => ({ kind: D[i], name: e, metadata: a, addInitializer: (l) => t._ ? w("Already initialized") : s.push(k(l || null)) }), j = (i, e) => L(e, b("metadata"), i[3]), C = (i, e, t, a) => {
6
- for (var s = 0, l = i[e >> 1], c = l && l.length; s < c; s++) l[s].call(t);
5
+ }, L = (i, e, t) => e in i ? _(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, N = (i, e) => _(i, "name", { value: e, configurable: !0 }), T = (i) => [, , , q(i?.[v("metadata")] ?? null)], D = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], k = (i) => i !== void 0 && typeof i != "function" ? w("Function expected") : i, O = (i, e, t, a, s) => ({ kind: D[i], name: e, metadata: a, addInitializer: (r) => t._ ? w("Already initialized") : s.push(k(r || null)) }), j = (i, e) => L(e, v("metadata"), i[3]), C = (i, e, t, a) => {
6
+ for (var s = 0, r = i[e >> 1], c = r && r.length; s < c; s++) r[s].call(t);
7
7
  return a;
8
- }, M = (i, e, t, a, s, l) => {
9
- var c, d, h, o = e & 7, r = !1, y = 0, I = i[y] || (i[y] = []), u = o && (s = s.prototype, o < 5 && (o > 3 || !r) && B(s, t));
8
+ }, M = (i, e, t, a, s, r) => {
9
+ var c, d, h, o = e & 7, l = !1, y = 0, A = i[y] || (i[y] = []), u = o && (s = s.prototype, o < 5 && (o > 3 || !l) && B(s, t));
10
10
  N(s, t);
11
11
  for (var g = a.length - 1; g >= 0; g--)
12
- h = O(o, t, d = {}, i[3], I), c = (0, a[g])(s, h), d._ = 1, k(c) && (s = c);
13
- return j(i, s), u && f(s, t, u), r ? o ^ 4 ? l : u : s;
14
- }, E, _, S;
12
+ h = O(o, t, d = {}, i[3], A), c = (0, a[g])(s, h), d._ = 1, k(c) && (s = c);
13
+ return j(i, s), u && _(s, t, u), l ? o ^ 4 ? r : u : s;
14
+ }, E, f, S;
15
15
  E = [U(["wiki", "preferences"])];
16
- class m extends (S = A) {
16
+ class m extends (S = I) {
17
17
  // 1分钟
18
18
  constructor(e) {
19
19
  super(e, {}, "analytics"), this.ctx = e, this._usages = [], this._timer = null, this.MAX_QUEUE_SIZE = 50, this.INTERVAL_MS = 60 * 1e3, this._setupTimer(), this._registerUnloadHandler(), this._showConfirmNotify(), this._initPluginListeners(), e.set("analytics", this);
@@ -27,15 +27,24 @@ class m extends (S = A) {
27
27
  /* @__PURE__ */ n("h3", { children: "InPageEdit Analytics" }),
28
28
  /* @__PURE__ */ n("p", { children: "InPageEdit Analytics is the companion analytics platform for the InPageEdit NEXT project. By collecting and displaying usage data from around the world, it helps developers and the community better understand how the tool is used, optimize feature design, and enhance user experience." }),
29
29
  /* @__PURE__ */ n("h4", { children: "What data will be collected?" }),
30
- /* @__PURE__ */ n("ul", { style: { listStyle: "auto", paddingLeft: "1.5em" }, children: [
31
- /* @__PURE__ */ n("li", { children: "Usage data: What features you use, what pages you edit, etc." }),
32
- /* @__PURE__ */ n("li", { children: "User information: Your username, user ID." }),
33
- /* @__PURE__ */ n("li", { children: "Site information: The wiki you are editing." })
30
+ /* @__PURE__ */ n("ol", { style: { listStyle: "number", paddingLeft: "1em" }, children: [
31
+ /* @__PURE__ */ n("li", { children: [
32
+ /* @__PURE__ */ n("strong", { children: "Usage data" }),
33
+ ": When and which features you use, what pages you edit, etc."
34
+ ] }),
35
+ /* @__PURE__ */ n("li", { children: [
36
+ /* @__PURE__ */ n("strong", { children: "User information" }),
37
+ ": Your user name and user ID."
38
+ ] }),
39
+ /* @__PURE__ */ n("li", { children: [
40
+ /* @__PURE__ */ n("strong", { children: "Site information" }),
41
+ ": This wiki's url and site name."
42
+ ] })
34
43
  ] }),
35
44
  /* @__PURE__ */ n("p", { children: /* @__PURE__ */ n("strong", { children: "NO sensitive data will be collected." }) }),
36
- /* @__PURE__ */ n("ul", { style: { listStyle: "auto", paddingLeft: "1.5em" }, children: [
37
- /* @__PURE__ */ n("li", { children: /* @__PURE__ */ n("a", { href: this.analyticsDashUrl, target: "_blank", rel: "noopener noreferrer", children: "Analytics Platform" }) }),
38
- /* @__PURE__ */ n("li", { children: /* @__PURE__ */ n(
45
+ /* @__PURE__ */ n("div", { style: { display: "grid", gap: "0.5rem" }, children: [
46
+ /* @__PURE__ */ n("a", { href: this.analyticsDashUrl, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ n("button", { className: "btn", style: { width: "100%" }, children: "Analytics Platform" }) }),
47
+ /* @__PURE__ */ n(
39
48
  "a",
40
49
  {
41
50
  href: `${this.analyticsDashUrl}/_redirect/user?${new URLSearchParams({
@@ -44,9 +53,9 @@ class m extends (S = A) {
44
53
  }).toString()}`,
45
54
  target: "_blank",
46
55
  rel: "noopener noreferrer",
47
- children: "My Data →"
56
+ children: /* @__PURE__ */ n("button", { className: "btn", style: { width: "100%" }, children: "View My Data" })
48
57
  }
49
- ) })
58
+ )
50
59
  ] })
51
60
  ] })
52
61
  ).role("raw-html"),
@@ -56,10 +65,10 @@ class m extends (S = A) {
56
65
  );
57
66
  }
58
67
  get analyticsDashUrl() {
59
- return v.ANALYTICS_DASH_URL;
68
+ return b.ANALYTICS_DASH_URL;
60
69
  }
61
70
  get analyticsApiBase() {
62
- return v.ANALYTICS_API_BASE;
71
+ return b.ANALYTICS_API_BASE;
63
72
  }
64
73
  _setupTimer() {
65
74
  this._timer = setInterval(() => {
@@ -74,9 +83,10 @@ class m extends (S = A) {
74
83
  document.visibilityState === "hidden" && e();
75
84
  }), window.addEventListener("pagehide", e), window.addEventListener("beforeunload", e);
76
85
  }
77
- _showConfirmNotify() {
78
- localStorage.getItem("IPE:analytics/confirm-shown") || this.ctx.inject(["modal"], (t) => {
79
- t.modal.notify(
86
+ async _showConfirmNotify() {
87
+ this.ctx.inject(["modal", "storage"], async (e) => {
88
+ const t = "analytics/confirm-shown", a = await e.storage.simpleKV.get(t), s = await e.preferences.get("analytics.enabled");
89
+ a || s || e.modal.notify(
80
90
  "confirm",
81
91
  {
82
92
  title: "Enable Analytics",
@@ -97,12 +107,12 @@ class m extends (S = A) {
97
107
  label: "Disable"
98
108
  },
99
109
  closeAfter: 0,
100
- onClose() {
101
- localStorage.setItem("IPE:analytics/confirm-shown", "1");
110
+ onClose: () => {
111
+ this.ctx.storage.simpleKV.set(t, 1);
102
112
  }
103
113
  },
104
- (a) => {
105
- t.preferences.set("analytics.enabled", a), a && this.addEvent("analytics", "enabled");
114
+ (r) => {
115
+ e.preferences.set("analytics.enabled", r), r && this.addEvent("analytics", "enabled");
106
116
  }
107
117
  );
108
118
  });
@@ -110,7 +120,7 @@ class m extends (S = A) {
110
120
  _initPluginListeners() {
111
121
  const e = this.ctx;
112
122
  e.on("in-article-links/anchor-clicked", (t) => {
113
- this.addEvent("in-article-links", P(t.action));
123
+ this.addEvent("in-article-links", x(t.action));
114
124
  }), e.on("quick-delete/submit", (t) => {
115
125
  this.addEvent("quick-delete", "submit", t.wikiPage.title);
116
126
  }), e.on("quick-diff/loaded", (t) => {
@@ -150,21 +160,21 @@ class m extends (S = A) {
150
160
  userName: this.ctx.wiki.userInfo.name,
151
161
  version: this.ctx.version.split("-")[0],
152
162
  usages: t
153
- }, s = JSON.stringify(a), l = `${this.analyticsApiBase}/submit`;
154
- if (navigator?.sendBeacon?.(l, s))
163
+ }, s = JSON.stringify(a), r = `${this.analyticsApiBase}/submit`;
164
+ if (navigator?.sendBeacon?.(r, s))
155
165
  return this.logger.debug("Beacon sent successfully", a), !0;
156
166
  {
157
167
  this.logger.debug("Beacon failed, sending via XMLHttpRequest");
158
- const { promise: d, resolve: h, reject: o } = x();
168
+ const { promise: d, resolve: h, reject: o } = P();
159
169
  try {
160
- const r = new XMLHttpRequest();
161
- r.open("POST", l, !0), r.setRequestHeader("Content-Type", "application/json"), r.send(s), r.onload = () => {
162
- this.logger.debug("Beacon sent successfully via XMLHttpRequest", a), h(r.status >= 200 && r.status < 300);
163
- }, r.onerror = () => {
170
+ const l = new XMLHttpRequest();
171
+ l.open("POST", r, !0), l.setRequestHeader("Content-Type", "application/json"), l.send(s), l.onload = () => {
172
+ this.logger.debug("Beacon sent successfully via XMLHttpRequest", a), h(l.status >= 200 && l.status < 300);
173
+ }, l.onerror = () => {
164
174
  o(new Error("Failed to send beacon"));
165
175
  };
166
- } catch (r) {
167
- o(r);
176
+ } catch (l) {
177
+ o(l);
168
178
  }
169
179
  return d;
170
180
  }
@@ -176,10 +186,10 @@ class m extends (S = A) {
176
186
  this._timer !== null && (clearInterval(this._timer), this._timer = null), this._usages.length > 0 && this.sendBeacon();
177
187
  }
178
188
  }
179
- _ = T(S);
180
- m = M(_, 0, "PluginAnalytics", E, m);
181
- C(_, 1, m);
189
+ f = T(S);
190
+ m = M(f, 0, "PluginAnalytics", E, m);
191
+ C(f, 1, m);
182
192
  export {
183
193
  m as PluginAnalytics
184
194
  };
185
- //# sourceMappingURL=index-CFb1PSJg.js.map
195
+ //# sourceMappingURL=index-CYc6LH26.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CYc6LH26.js","sources":["../src/plugins/analytics/index.tsx"],"sourcesContent":["import { Endpoints } from '@/constants/endpoints.js'\nimport { Inject, InPageEdit, Schema } from '@/InPageEdit'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n analytics: PluginAnalytics\n }\n}\n\nexport interface IPEBeaconPayload {\n siteApi: string\n siteName?: string\n userId: number\n userName: string\n version?: string\n usages: IPEBeaconUsage[]\n}\n\nexport interface IPEBeaconUsage {\n ts: number\n feature: string\n subtype?: string\n page?: string\n}\n\n@Inject(['wiki', 'preferences'])\nexport class PluginAnalytics extends BasePlugin {\n private _usages: IPEBeaconUsage[] = []\n private _timer: ReturnType<typeof setInterval> | null = null\n private readonly MAX_QUEUE_SIZE = 50\n private readonly INTERVAL_MS = 60 * 1000 // 1分钟\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'analytics')\n this._setupTimer()\n this._registerUnloadHandler()\n this._showConfirmNotify()\n this._initPluginListeners()\n ctx.set('analytics', this)\n }\n\n protected start(): Promise<void> | void {\n const ctx = this.ctx\n ctx.preferences.registerCustomConfig(\n 'analytics',\n Schema.object({\n 'analytics._intro': Schema.const(\n <section>\n <h3>InPageEdit Analytics</h3>\n <p>\n InPageEdit Analytics is the companion analytics platform for the InPageEdit NEXT\n project. By collecting and displaying usage data from around the world, it helps\n developers and the community better understand how the tool is used, optimize feature\n design, and enhance user experience.\n </p>\n <h4>What data will be collected?</h4>\n <ol style={{ listStyle: 'number', paddingLeft: '1em' }}>\n <li>\n <strong>Usage data</strong>: When and which features you use, what pages you edit,\n etc.\n </li>\n <li>\n <strong>User information</strong>: Your user name and user ID.\n </li>\n <li>\n <strong>Site information</strong>: This wiki's url and site name.\n </li>\n </ol>\n <p>\n <strong>NO sensitive data will be collected.</strong>\n </p>\n <div style={{ display: 'grid', gap: '0.5rem' }}>\n <a href={this.analyticsDashUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <button className=\"btn\" style={{ width: '100%' }}>\n Analytics Platform\n </button>\n </a>\n <a\n href={`${this.analyticsDashUrl}/_redirect/user?${new URLSearchParams({\n siteApi: this.ctx.wiki.getSciprtUrl('api'),\n mwUserId: this.ctx.wiki.userInfo.id.toString(),\n }).toString()}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <button className=\"btn\" style={{ width: '100%' }}>\n View My Data\n </button>\n </a>\n </div>\n </section>\n ).role('raw-html'),\n 'analytics.enabled': Schema.boolean()\n .description('Share my usage data with the community.')\n .default(false),\n }).description('Analytics settings'),\n 'general'\n )\n }\n\n private get analyticsDashUrl() {\n return import.meta.env.PROD ? Endpoints.ANALYTICS_DASH_URL : 'http://localhost:20105'\n }\n private get analyticsApiBase() {\n return import.meta.env.PROD ? Endpoints.ANALYTICS_API_BASE : 'http://localhost:20105/api/v6'\n }\n\n private _setupTimer() {\n this._timer = setInterval(() => {\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }, this.INTERVAL_MS)\n }\n\n private _registerUnloadHandler() {\n const handleUnload = () => {\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n handleUnload()\n }\n })\n\n window.addEventListener('pagehide', handleUnload)\n window.addEventListener('beforeunload', handleUnload)\n }\n\n private async _showConfirmNotify() {\n this.ctx.inject(['modal', 'storage'], async (ctx) => {\n const key = 'analytics/confirm-shown'\n const shown = await ctx.storage.simpleKV.get(key)\n const enabled = await ctx.preferences.get('analytics.enabled')\n if (shown || enabled) {\n return\n }\n ctx.modal.notify(\n 'confirm',\n {\n title: 'Enable Analytics',\n content: (\n <div>\n <p>Help us improve InPageEdit by sharing your usage data with us.</p>\n <p>What data will be collected?</p>\n <ul style={{ listStyle: 'auto', paddingLeft: '1.5em' }}>\n <li>Usage data: What features you use, what pages you edit, etc.</li>\n <li>User information: Your username, user ID.</li>\n <li>Site information: The wiki you are editing.</li>\n </ul>\n <p>\n <strong>NO sensitive data will be collected.</strong>\n </p>\n </div>\n ),\n okBtn: {\n label: 'Enable',\n },\n cancelBtn: {\n label: 'Disable',\n },\n closeAfter: 0,\n onClose: () => {\n this.ctx.storage.simpleKV.set(key, 1)\n },\n },\n (result) => {\n ctx.preferences.set('analytics.enabled', result)\n if (result) {\n this.addEvent('analytics', 'enabled')\n }\n }\n )\n })\n }\n\n private _initPluginListeners() {\n const ctx = this.ctx\n ctx.on('in-article-links/anchor-clicked', (payload) => {\n this.addEvent('in-article-links', paramCase(payload.action))\n })\n ctx.on('quick-delete/submit', (payload) => {\n this.addEvent('quick-delete', 'submit', payload.wikiPage.title)\n })\n ctx.on('quick-diff/loaded', (payload) => {\n this.addEvent('quick-diff', 'loaded', payload.compare.fromtitle)\n })\n ctx.on('quick-redirect/submit', (payload) => {\n this.addEvent('quick-redirect', 'submit', payload.payload.to || undefined)\n })\n ctx.on('quick-preview/loaded', (payload) => {\n this.addEvent('quick-preview', 'loaded', payload.wikiPage.title)\n })\n ctx.on('quick-edit/wiki-page', (payload) => {\n this.addEvent('quick-edit', undefined, payload.wikiPage.title)\n })\n ctx.on('quick-edit/submit', (payload) => {\n this.addEvent('quick-edit', 'submit', payload.wikiPage.title)\n })\n ctx.on('quick-move/submit', (payload) => {\n this.addEvent('quick-move', 'submit')\n })\n ctx.on('toolbox/button-clicked', (payload) => {\n this.addEvent('toolbox', `button-clicked#${payload.id || 'unknown'}`)\n })\n }\n\n public addEvent(feature: string, subtype?: string, page?: string) {\n const usage: IPEBeaconUsage = {\n ts: Date.now(),\n feature,\n subtype,\n page,\n }\n this._usages.push(usage)\n\n // 如果usages数组超过50个,立即发送\n if (this._usages.length >= this.MAX_QUEUE_SIZE) {\n this.sendBeacon()\n }\n\n return this\n }\n\n private async sendBeacon() {\n if (this._usages.length === 0) {\n return true\n }\n\n const enabled = await this.ctx.preferences.get<boolean>('analytics.enabled', false)\n if (!enabled) {\n this.logger.debug('Analytics disabled, skipping')\n return true\n }\n\n const usages = this._usages.splice(0, this._usages.length)\n const payload: IPEBeaconPayload = {\n siteApi: this.ctx.wiki.getSciprtUrl('api'),\n siteName: this.ctx.wiki.siteInfo.general.sitename,\n userId: this.ctx.wiki.userInfo.id,\n userName: this.ctx.wiki.userInfo.name,\n version: this.ctx.version.split('-')[0],\n usages,\n }\n const body = JSON.stringify(payload)\n\n const endpoint = `${this.analyticsApiBase}/submit`\n\n const beaconOK = navigator?.sendBeacon?.(endpoint, body)\n if (beaconOK) {\n this.logger.debug('Beacon sent successfully', payload)\n return true\n } else {\n this.logger.debug('Beacon failed, sending via XMLHttpRequest')\n const { promise, resolve, reject } = promiseWithResolvers<boolean>()\n try {\n const xhr = new XMLHttpRequest()\n xhr.open('POST', endpoint, true)\n xhr.setRequestHeader('Content-Type', 'application/json')\n xhr.send(body)\n xhr.onload = () => {\n this.logger.debug('Beacon sent successfully via XMLHttpRequest', payload)\n resolve(xhr.status >= 200 && xhr.status < 300)\n }\n xhr.onerror = () => {\n reject(new Error('Failed to send beacon'))\n }\n } catch (error) {\n reject(error)\n }\n return promise\n }\n }\n\n /**\n * 清理资源\n */\n protected stop() {\n if (this._timer !== null) {\n clearInterval(this._timer)\n this._timer = null\n }\n // 在销毁前发送剩余的数据\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }\n}\n"],"names":["_PluginAnalytics_decorators","_init","_a","Inject","PluginAnalytics","BasePlugin","ctx","Schema","jsx","jsxs","Endpoints","handleUnload","key","shown","enabled","result","payload","paramCase","feature","subtype","page","usage","usages","body","endpoint","promise","resolve","reject","promiseWithResolvers","xhr","error","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { j as i, P as d } from "./index-CM_6yF2v.js";
2
+ import { B as m, S as l } from "./index-BXaiDKnr.js";
3
+ import { T as u } from "./index-DD5CVCfD.js";
4
+ import { I as h } from "./InputBox-DZAdyZ4B.js";
5
+ import { C as f } from "./CheckBox-Bc79KBEB.js";
6
+ class b extends m {
7
+ constructor(e) {
8
+ super(e, {}, "quick-redirect"), this.ctx = e;
9
+ }
10
+ static {
11
+ this.inject = ["api", "wikiPage", "modal"];
12
+ }
13
+ static {
14
+ this.PreferencesSchema = l.object({
15
+ "quickRedirect.reason": l.string().default("[IPE-NEXT] Quick redirect")
16
+ }).description("Quick redirect options").extra("category", "editor");
17
+ }
18
+ start() {
19
+ this.ctx.set("quickRedirect", this);
20
+ const e = window.mw?.config.get("wgPageName") || "", c = window.mw?.config.get("wgIsProbablyEditable");
21
+ this.ctx.inject(["toolbox"], (t) => {
22
+ this.ctx = t, t.toolbox.addButton({
23
+ id: "quick-redirect",
24
+ icon: /* @__PURE__ */ i(
25
+ "svg",
26
+ {
27
+ xmlns: "http://www.w3.org/2000/svg",
28
+ width: "24",
29
+ height: "24",
30
+ viewBox: "0 0 24 24",
31
+ fill: "none",
32
+ stroke: "currentColor",
33
+ "stroke-width": "2",
34
+ "stroke-linecap": "round",
35
+ "stroke-linejoin": "round",
36
+ class: "icon icon-tabler icons-tabler-outline icon-tabler-file-symlink",
37
+ children: [
38
+ /* @__PURE__ */ i("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
39
+ /* @__PURE__ */ i("path", { d: "M4 21v-4a3 3 0 0 1 3 -3h5" }),
40
+ /* @__PURE__ */ i("path", { d: "M9 17l3 -3l-3 -3" }),
41
+ /* @__PURE__ */ i("path", { d: "M14 3v4a1 1 0 0 0 1 1h4" }),
42
+ /* @__PURE__ */ i("path", { d: "M5 11v-6a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2h-9.5" })
43
+ ]
44
+ }
45
+ ),
46
+ tooltip: "Quick Redirect",
47
+ group: "group1",
48
+ index: 2,
49
+ onClick: () => {
50
+ this.showModal(
51
+ c ? {
52
+ to: e
53
+ } : {}
54
+ );
55
+ }
56
+ }), this.addDisposeHandler((r) => {
57
+ r.toolbox.removeButton("quick-redirect");
58
+ });
59
+ });
60
+ }
61
+ stop() {
62
+ }
63
+ async showModal(e) {
64
+ const c = await this.ctx.preferences.get("quickRedirect.reason");
65
+ e || (e = {}), this.ctx.emit("quick-redirect/init-options", { ctx: this.ctx, options: e });
66
+ const t = this.ctx.modal.createObject({
67
+ title: "Quick Redirect",
68
+ content: /* @__PURE__ */ i(d, {}),
69
+ className: "quick-redirect compact-buttons",
70
+ sizeClass: "smallToMedium",
71
+ center: !0
72
+ }).init();
73
+ let r = null;
74
+ return t.setContent(
75
+ /* @__PURE__ */ i(
76
+ "form",
77
+ {
78
+ ref: (s) => r = s,
79
+ style: {
80
+ display: "flex",
81
+ flexDirection: "column",
82
+ gap: "1rem"
83
+ },
84
+ onSubmit: (s) => {
85
+ if (s.preventDefault(), r?.checkValidity(), !r?.reportValidity())
86
+ return;
87
+ const o = new FormData(r), a = {
88
+ from: o.get("from")?.toString().trim(),
89
+ to: o.get("to")?.toString().trim(),
90
+ reason: o.get("reason") || "",
91
+ overwrite: o.get("overwrite") === "on"
92
+ };
93
+ if (!a.from || !a.to) {
94
+ this.ctx.modal.notify("error", {
95
+ title: "Failed to redirect",
96
+ content: "From and to are required."
97
+ });
98
+ return;
99
+ }
100
+ this.ctx.emit("quick-redirect/submit", { ctx: this.ctx, payload: a }), t.setLoadingState(!0), this.redirectPage(a).then((n) => {
101
+ t.close(), this.ctx.modal.notify("success", {
102
+ title: "Redirect successful",
103
+ content: "The redirect has been created."
104
+ });
105
+ }).catch((n) => {
106
+ t.setLoadingState(!1), this.ctx.modal.notify("error", {
107
+ title: "Failed to redirect",
108
+ content: n instanceof Error ? n.message : String(n)
109
+ });
110
+ });
111
+ },
112
+ children: [
113
+ /* @__PURE__ */ i(
114
+ u,
115
+ {
116
+ inputs: [
117
+ {
118
+ label: "From",
119
+ name: "from",
120
+ value: e?.from,
121
+ required: !0
122
+ },
123
+ {
124
+ label: "To",
125
+ name: "to",
126
+ value: e?.to,
127
+ required: !0
128
+ }
129
+ ]
130
+ }
131
+ ),
132
+ /* @__PURE__ */ i(
133
+ h,
134
+ {
135
+ label: "Reason",
136
+ id: "reason",
137
+ name: "reason",
138
+ value: e?.reason ?? c ?? ""
139
+ }
140
+ ),
141
+ /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(f, { name: "overwrite", id: "overwrite", checked: e?.overwrite, children: "Force create redirect even if the from page already exists" }) })
142
+ ]
143
+ }
144
+ )
145
+ ), t.setButtons([
146
+ {
147
+ label: "Create Redirect",
148
+ className: "is-primary is-ghost",
149
+ method: () => {
150
+ r?.dispatchEvent(new Event("submit"));
151
+ }
152
+ }
153
+ ]), this.ctx.emit("quick-redirect/show-modal", { ctx: this.ctx, modal: t }), t.show();
154
+ }
155
+ async redirectPage(e) {
156
+ const { from: c, to: t, reason: r = "", overwrite: s = !1 } = e, o = await this.ctx.wikiPage.newBlankPage({
157
+ title: c
158
+ }), a = `#REDIRECT [[:${t}]]`;
159
+ return o.edit(
160
+ {
161
+ text: a,
162
+ summary: r
163
+ },
164
+ {
165
+ createonly: !s
166
+ }
167
+ );
168
+ }
169
+ }
170
+ export {
171
+ b as PluginQuickRedirect
172
+ };
173
+ //# sourceMappingURL=index-CZXxH2-9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CZXxH2-9.js","sources":["../src/plugins/quick-redirect/index.tsx"],"sourcesContent":["import { InPageEdit, Schema } from '@/InPageEdit'\nimport { IPEModal } from '@inpageedit/modal'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickRedirect: PluginQuickRedirect\n }\n interface Events {\n 'quick-redirect/init-options'(payload: {\n ctx: InPageEdit\n options: Partial<QuickRedirectOptions>\n }): void\n 'quick-redirect/show-modal'(payload: { ctx: InPageEdit; modal: IPEModal }): void\n 'quick-redirect/submit'(payload: { ctx: InPageEdit; payload: RedirectPageOptions }): void\n }\n interface PreferencesMap {\n 'quickRedirect.reason': string\n }\n}\n\nexport interface RedirectPageOptions {\n from: string\n to: string\n reason?: string\n overwrite?: boolean\n}\nexport interface QuickRedirectOptions extends Partial<RedirectPageOptions> {}\n\nexport class PluginQuickRedirect extends BasePlugin {\n static readonly inject = ['api', 'wikiPage', 'modal']\n static readonly PreferencesSchema = Schema.object({\n 'quickRedirect.reason': Schema.string().default('[IPE-NEXT] Quick redirect'),\n })\n .description('Quick redirect options')\n .extra('category', 'editor')\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-redirect')\n }\n\n protected start(): Promise<void> | void {\n this.ctx.set('quickRedirect', this)\n\n const curPageName = window.mw?.config.get('wgPageName') || ''\n const canEdit = window.mw?.config.get('wgIsProbablyEditable')\n this.ctx.inject(['toolbox'], (ctx) => {\n this.ctx = ctx\n ctx.toolbox.addButton({\n id: 'quick-redirect',\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-file-symlink\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 21v-4a3 3 0 0 1 3 -3h5\" />\n <path d=\"M9 17l3 -3l-3 -3\" />\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\" />\n <path d=\"M5 11v-6a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2h-9.5\" />\n </svg>\n ) as HTMLElement,\n tooltip: 'Quick Redirect',\n group: 'group1',\n index: 2,\n onClick: () => {\n this.showModal(\n canEdit\n ? {\n to: curPageName,\n }\n : {}\n )\n },\n })\n this.addDisposeHandler((ctx) => {\n ctx.toolbox.removeButton('quick-redirect')\n })\n })\n }\n\n protected stop(): Promise<void> | void {}\n\n async showModal(options?: Partial<QuickRedirectOptions>) {\n const reason = await this.ctx.preferences.get('quickRedirect.reason')\n if (!options) {\n options = {}\n }\n this.ctx.emit('quick-redirect/init-options', { ctx: this.ctx, options })\n const modal = this.ctx.modal\n .createObject({\n title: 'Quick Redirect',\n content: (<ProgressBar />) as HTMLElement,\n className: 'quick-redirect compact-buttons',\n sizeClass: 'smallToMedium',\n center: true,\n })\n .init()\n\n let formRef: HTMLFormElement | null = null\n modal.setContent(\n (\n <form\n ref={(el) => (formRef = el)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n }}\n onSubmit={(e) => {\n e.preventDefault()\n formRef?.checkValidity()\n if (!formRef?.reportValidity()) {\n return\n }\n const formData = new FormData(formRef!)\n const options = {\n from: formData.get('from')?.toString().trim()!,\n to: formData.get('to')?.toString().trim()!,\n reason: (formData.get('reason') as string) || '',\n overwrite: formData.get('overwrite') === 'on',\n }\n if (!options.from || !options.to) {\n this.ctx.modal.notify('error', {\n title: 'Failed to redirect',\n content: 'From and to are required.',\n })\n return\n }\n this.ctx.emit('quick-redirect/submit', { ctx: this.ctx, payload: options })\n modal.setLoadingState(true)\n this.redirectPage(options)\n .then((res) => {\n modal.close()\n this.ctx.modal.notify('success', {\n title: 'Redirect successful',\n content: 'The redirect has been created.',\n })\n })\n .catch((error) => {\n modal.setLoadingState(false)\n this.ctx.modal.notify('error', {\n title: 'Failed to redirect',\n content: error instanceof Error ? error.message : String(error),\n })\n })\n }}\n >\n <TwinSwapInput\n inputs={[\n {\n label: 'From',\n name: 'from',\n value: options?.from,\n required: true,\n },\n {\n label: 'To',\n name: 'to',\n value: options?.to,\n required: true,\n },\n ]}\n />\n <InputBox\n label=\"Reason\"\n id=\"reason\"\n name=\"reason\"\n value={options?.reason ?? reason ?? ''}\n />\n <div>\n <CheckBox name=\"overwrite\" id=\"overwrite\" checked={options?.overwrite}>\n Force create redirect even if the from page already exists\n </CheckBox>\n </div>\n </form>\n ) as HTMLFormElement\n )\n modal.setButtons([\n {\n label: 'Create Redirect',\n className: 'is-primary is-ghost',\n method: () => {\n formRef?.dispatchEvent(new Event('submit'))\n },\n },\n ])\n\n this.ctx.emit('quick-redirect/show-modal', { ctx: this.ctx, modal })\n\n return modal.show()\n }\n\n async redirectPage(options: RedirectPageOptions) {\n const { from, to, reason = '', overwrite = false } = options\n const wikiPage = await this.ctx.wikiPage.newBlankPage({\n title: from,\n })\n const content = `#REDIRECT [[:${to}]]`\n return wikiPage.edit(\n {\n text: content,\n summary: reason,\n },\n {\n createonly: !overwrite,\n }\n )\n }\n}\n"],"names":["PluginQuickRedirect","BasePlugin","ctx","Schema","curPageName","canEdit","jsxs","jsx","options","reason","modal","ProgressBar","formRef","el","e","formData","res","error","TwinSwapInput","InputBox","CheckBox","from","to","overwrite","wikiPage","content"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { j as p } from "./index-CvhkVj_L.js";
2
- import { B as D, I as C, S as m } from "./index-DFPN4uYd.js";
1
+ import { j as p } from "./index-CM_6yF2v.js";
2
+ import { B as D, I as C, S as m } from "./index-BXaiDKnr.js";
3
3
  import { R as P } from "./Preferences-DS4-CFWe.js";
4
- import { I as j } from "./IconQuickEdit-CAL1HXIb.js";
4
+ import { I as j } from "./IconQuickEdit-CMCQncyj.js";
5
5
  var N = Object.create, w = Object.defineProperty, T = Object.getOwnPropertyDescriptor, E = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), I = (t) => {
6
6
  throw TypeError(t);
7
7
  }, B = (t, e, n) => e in t ? w(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n, O = (t, e) => w(t, "name", { value: e, configurable: !0 }), W = (t) => [, , , N(t?.[E("metadata")] ?? null)], $ = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], q = (t) => t !== void 0 && typeof t != "function" ? I("Function expected") : t, z = (t, e, n, r, i) => ({ kind: $[t], name: e, metadata: r, addInitializer: (l) => n._ ? I("Already initialized") : i.push(q(l || null)) }), R = (t, e) => B(e, E("metadata"), t[3]), Q = (t, e, n, r) => {
@@ -82,9 +82,7 @@ class g extends (L = D) {
82
82
  }
83
83
  async handleQuickEdit() {
84
84
  let e = !1;
85
- const n = await this.ctx.preferences.get(
86
- "inArticleLinks.quickEdit.redlinks"
87
- );
85
+ const n = await this.ctx.preferences.get("inArticleLinks.quickEdit.redlinks");
88
86
  this.ctx.inject(["quickEdit"], (r) => {
89
87
  e = !0, r.on("dispose", () => {
90
88
  e = !1;
@@ -208,4 +206,4 @@ Q(_, 1, g);
208
206
  export {
209
207
  g as PluginInArticleLinks
210
208
  };
211
- //# sourceMappingURL=index-DkQLtTG0.js.map
209
+ //# sourceMappingURL=index-Ckozkp6W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Ckozkp6W.js","sources":["../src/plugins/in-article-links/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { CompareApiRequestOptions } from '../quick-diff/index.js'\nimport { QuickEditOptions } from '../quick-edit/index.js'\nimport { WikiLinkMetadata } from '@/services/WikiTitleService.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n inArticleLinks: PluginInArticleLinks\n }\n interface Events {\n 'in-article-links/anchor-parsed'(payload: {\n ctx: InPageEdit\n anchor: HTMLAnchorElement\n info: InArticleWikiAnchorMetadata\n }): void\n 'in-article-links/anchor-clicked'(payload: {\n ctx: InPageEdit\n anchor: HTMLAnchorElement\n info: InArticleWikiAnchorMetadata\n event: MouseEvent\n action: 'quickEdit' | 'quickDiff'\n }): void\n }\n interface PreferencesMap {\n 'inArticleLinks.quickEdit.enable': boolean\n 'inArticleLinks.quickDiff.enable': boolean\n 'inArticleLinks.quickEdit.redlinks': boolean\n }\n}\n\nexport interface InArticleWikiAnchorMetadata extends WikiLinkMetadata {\n $el: HTMLAnchorElement\n kind: 'normal' | 'mw:File'\n external: boolean\n redlink: boolean\n}\n\n@Inject(['wiki', 'wikiTitle', 'preferences'])\n@RegisterPreferences(\n Schema.object({\n 'inArticleLinks.enable': Schema.boolean()\n .description('Whether to enable in-article links')\n .default(true),\n 'inArticleLinks.quickDiff.enable': Schema.boolean()\n .description('Whether to enable in-article links for quick diff')\n .default(true),\n 'inArticleLinks.quickEdit.enable': Schema.boolean()\n .description('Whether to enable in-article links for quick edit')\n .default(true),\n 'inArticleLinks.quickEdit.redlinks': Schema.boolean()\n .description('Whether to show quick edit button for redlinks')\n .default(true),\n })\n .description('In-article links preferences')\n .extra('category', 'in-article-links')\n)\nexport class PluginInArticleLinks extends BasePlugin<{\n linkClassName: string\n}> {\n constructor(ctx: InPageEdit) {\n super(\n ctx,\n {\n linkClassName: 'ipe__in-article-link',\n },\n 'InArticleLinks'\n )\n this.ctx.set('inArticleLinks', this)\n\n this.ctx.preferences.defineCategory({\n label: 'In Article Links',\n name: 'in-article-links',\n description: 'In-article links preferences',\n index: 9,\n })\n }\n\n protected async start() {\n // TODO: 这些都不应该硬编码,暂时先这样\n if (await this.ctx.preferences.get('inArticleLinks.quickEdit.enable')) {\n this.handleQuickEdit()\n }\n if (await this.ctx.preferences.get('inArticleLinks.quickDiff.enable')) {\n this.handleQuickDiff()\n }\n }\n\n protected async stop() {\n Array.from(\n document.getElementsByClassName(this.config.linkClassName) as HTMLCollectionOf<HTMLElement>\n ).forEach((el) => {\n el.remove()\n })\n document.querySelectorAll<HTMLElement>('[data-ipe-edit-mounted]').forEach((el) => {\n el.dataset.ipeEditMounted = undefined\n })\n }\n\n private _cachedAnchorInfo = new WeakMap<HTMLAnchorElement, InArticleWikiAnchorMetadata>()\n parseAnchor(anchor: HTMLAnchorElement): InArticleWikiAnchorMetadata | null {\n // 不是链接元素\n if (!(anchor instanceof HTMLAnchorElement)) {\n return null\n }\n\n const cached = this._cachedAnchorInfo.get(anchor)\n if (cached) {\n return cached\n }\n\n const attrHref = anchor.getAttribute('href') || ''\n if (!this.ctx.wikiTitle.validateHrefAttr(attrHref)) {\n return null\n }\n const href = anchor.href || ''\n const linkInfo = this.ctx.wikiTitle.parseWikiLink(href)\n if (!linkInfo) {\n return null\n }\n\n const info: InArticleWikiAnchorMetadata = {\n $el: anchor,\n kind: anchor.closest('[typeof^=\"mw:File\"]') ? 'mw:File' : 'normal',\n external: anchor.classList.contains('external') || !!attrHref.startsWith('http'),\n redlink: anchor.classList.contains('new') || linkInfo.params.has('redlink'),\n ...linkInfo,\n }\n this._cachedAnchorInfo.set(anchor, info)\n this.ctx.emit('in-article-links/anchor-parsed', {\n ctx: this.ctx,\n anchor,\n info,\n })\n return info\n }\n\n scanAnchors(\n parent: HTMLElement,\n filter?: (info: InArticleWikiAnchorMetadata) => boolean\n ): InArticleWikiAnchorMetadata[] {\n const anchors = parent.querySelectorAll<HTMLAnchorElement>('a[href]')\n return Array.from(anchors)\n .map((anchor) => this.parseAnchor(anchor))\n .filter(\n (anchor) => anchor !== null && (!filter || filter(anchor))\n ) as InArticleWikiAnchorMetadata[]\n }\n\n async handleQuickEdit() {\n let enable = false\n const showButtonOnRedlinks = await this.ctx.preferences.get('inArticleLinks.quickEdit.redlinks')\n\n this.ctx.inject(['quickEdit'], (ctx) => {\n enable = true\n ctx.on('dispose', () => {\n enable = false\n })\n\n window?.mw?.hook?.('wikipage.content').add(($content) => {\n if (!enable) {\n return\n }\n const anchors = this.scanAnchors($content.get(0)!, ({ action, title, redlink }) => {\n const enabled = showButtonOnRedlinks || !redlink\n if (!enabled) {\n return false\n }\n const isActionEdit = ['edit', 'create'].includes(action)\n if (isActionEdit) {\n return true\n }\n const isSpecialEdit = title?.isSpecial('edit') || title?.isSpecial('newsection')\n if (isSpecialEdit) {\n return title!.getMainText().split('/').length >= 2\n }\n return false\n })\n anchors.forEach((info) => {\n const { $el, title, pageId, params } = info\n if ($el.dataset.ipeEditMounted) {\n return\n }\n $el.dataset.ipeEditMounted = '1'\n\n const notCompatible = params.has('preload') || params.has('redo')\n if (notCompatible) {\n return this.ctx.logger.debug($el, `Not compatible with quick edit`)\n }\n\n const titleText = title?.getPrefixedDBKey() || ''\n const sectionRaw = params.get('section')?.replace(/^T-/, '') || undefined\n const revisionRaw = params.get('oldid')\n const createOnly = params.has('redlink')\n\n let section: 'new' | number | undefined = undefined\n if (sectionRaw === 'new' || title?.isSpecial('newsection')) {\n section = 'new'\n } else if (sectionRaw && /^\\d+$/.test(sectionRaw)) {\n section = parseInt(sectionRaw, 10)\n }\n\n const revision = revisionRaw ? parseInt(revisionRaw, 10) : undefined\n\n const payload: Partial<QuickEditOptions> = {\n title: titleText,\n pageId: pageId || undefined,\n section,\n revision,\n createOnly,\n }\n\n const link = (\n <a\n href={`#ipe://quick-edit/`}\n dataset={payload as any}\n className={`${this.config.linkClassName} ipe-quick-edit ${createOnly ? 'ipe-quick-edit--create-only' : ''}`}\n style={{\n userSelect: 'none',\n marginLeft: '0.2em',\n }}\n onClick={(e) => {\n e.preventDefault()\n this.ctx.emit('in-article-links/anchor-clicked', {\n ctx: this.ctx,\n anchor: $el,\n info,\n event: e,\n action: 'quickEdit',\n })\n ctx.quickEdit.showModal(payload)\n }}\n >\n <IconQuickEdit className=\"ipe-icon\" />\n </a>\n )\n\n $el.insertAdjacentElement('afterend', link)\n })\n })\n })\n }\n\n handleQuickDiff() {\n let enable = false\n const isRelative = (str: string): str is 'prev' | 'next' | 'cur' =>\n ['prev', 'next', 'cur'].includes(str)\n\n this.ctx.inject(['quickDiff'], (ctx) => {\n enable = true\n ctx.on('dispose', () => {\n enable = false\n })\n\n window?.mw?.hook?.('wikipage.content').add(($content) => {\n if (!enable) {\n return\n }\n const anchors = this.scanAnchors($content.get(0)!, ({ params, title }) => {\n return !!(params.has('diff') || title?.isSpecial('diff'))\n })\n anchors.forEach((info) => {\n const { $el, title, params } = info\n if ($el.dataset.ipeDiffMounted) {\n return\n }\n $el.dataset.ipeDiffMounted = '1'\n\n let diff: string | null\n let oldid: string | null\n if (title?.getNamespaceId() === -1) {\n // prettier-ignore\n ;[/** special page name */, oldid, diff] = title.getMainDBKey().split('/')\n if (!diff) {\n diff = 'prev'\n }\n } else {\n diff = params.get('diff')\n oldid = params.get('oldid')\n }\n if (!diff || !oldid) {\n return\n }\n\n const compare: Partial<CompareApiRequestOptions> = {}\n if (isRelative(diff)) {\n compare.fromrev = parseInt(oldid)\n compare.torelative = diff\n } else {\n compare.fromrev = parseInt(oldid)\n compare.torev = parseInt(diff)\n }\n\n const link = (\n <a\n href={`#ipe://quick-diff/`}\n dataset={compare as any}\n className={`${this.config.linkClassName} ipe-quick-diff`}\n style={{\n userSelect: 'none',\n marginLeft: '0.2em',\n }}\n onClick={(e) => {\n e.preventDefault()\n this.ctx.emit('in-article-links/anchor-clicked', {\n ctx: this.ctx,\n anchor: $el,\n info,\n event: e,\n action: 'quickDiff',\n })\n ctx.quickDiff.comparePages(compare)\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-file-diff ipe-icon\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M14 3v4a1 1 0 0 0 1 1h4\" />\n <path d=\"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z\" />\n <path d=\"M12 10l0 4\" />\n <path d=\"M10 12l4 0\" />\n <path d=\"M10 17l4 0\" />\n </svg>\n </a>\n )\n\n $el.insertAdjacentElement('afterend', link)\n })\n })\n })\n }\n}\n"],"names":["_PluginInArticleLinks_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginInArticleLinks","BasePlugin","ctx","el","anchor","cached","attrHref","href","linkInfo","info","parent","filter","anchors","enable","showButtonOnRedlinks","$content","action","title","redlink","$el","pageId","params","titleText","sectionRaw","revisionRaw","createOnly","section","revision","payload","link","jsx","e","IconQuickEdit","isRelative","str","diff","oldid","compare","jsxs","__decoratorStart","__decorateElement","__runInitializers"],"mappings":";;;;;;;;;;;;;;;GAAAA,GAAAC,GAAAC;AAqCAF,IAAA,CAACG,EAAO,CAAC,QAAQ,aAAa,aAAa,CAAC,GAC3CC;AAAA,EACCC,EAAO,OAAO;AAAA,IACZ,yBAAyBA,EAAO,QAAA,EAC7B,YAAY,oCAAoC,EAChD,QAAQ,EAAI;AAAA,IACf,mCAAmCA,EAAO,QAAA,EACvC,YAAY,mDAAmD,EAC/D,QAAQ,EAAI;AAAA,IACf,mCAAmCA,EAAO,QAAA,EACvC,YAAY,mDAAmD,EAC/D,QAAQ,EAAI;AAAA,IACf,qCAAqCA,EAAO,QAAA,EACzC,YAAY,gDAAgD,EAC5D,QAAQ,EAAI;AAAA,EAAA,CAChB,EACE,YAAY,8BAA8B,EAC1C,MAAM,YAAY,kBAAkB;AACzC,CAAA;AACO,MAAMC,WAA6BJ,IAAAK,GAEvC;AAAA,EACD,YAAYC,GAAiB;AAC3B;AAAA,MACEA;AAAA,MACA;AAAA,QACE,eAAe;AAAA,MAAA;AAAA,MAEjB;AAAA,IAAA,GAiCJ,KAAQ,wCAAwB,QAAA,GA/B9B,KAAK,IAAI,IAAI,kBAAkB,IAAI,GAEnC,KAAK,IAAI,YAAY,eAAe;AAAA,MAClC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,IAAA,CACR;AAAA,EACH;AAAA,EAEA,MAAgB,QAAQ;AAEtB,IAAI,MAAM,KAAK,IAAI,YAAY,IAAI,iCAAiC,KAClE,KAAK,gBAAA,GAEH,MAAM,KAAK,IAAI,YAAY,IAAI,iCAAiC,KAClE,KAAK,gBAAA;AAAA,EAET;AAAA,EAEA,MAAgB,OAAO;AACrB,UAAM;AAAA,MACJ,SAAS,uBAAuB,KAAK,OAAO,aAAa;AAAA,IAAA,EACzD,QAAQ,CAACC,MAAO;AAChB,MAAAA,EAAG,OAAA;AAAA,IACL,CAAC,GACD,SAAS,iBAA8B,yBAAyB,EAAE,QAAQ,CAACA,MAAO;AAChF,MAAAA,EAAG,QAAQ,iBAAiB;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EAGA,YAAYC,GAA+D;AAEzE,QAAI,EAAEA,aAAkB;AACtB,aAAO;AAGT,UAAMC,IAAS,KAAK,kBAAkB,IAAID,CAAM;AAChD,QAAIC;AACF,aAAOA;AAGT,UAAMC,IAAWF,EAAO,aAAa,MAAM,KAAK;AAChD,QAAI,CAAC,KAAK,IAAI,UAAU,iBAAiBE,CAAQ;AAC/C,aAAO;AAET,UAAMC,IAAOH,EAAO,QAAQ,IACtBI,IAAW,KAAK,IAAI,UAAU,cAAcD,CAAI;AACtD,QAAI,CAACC;AACH,aAAO;AAGT,UAAMC,IAAoC;AAAA,MACxC,KAAKL;AAAA,MACL,MAAMA,EAAO,QAAQ,qBAAqB,IAAI,YAAY;AAAA,MAC1D,UAAUA,EAAO,UAAU,SAAS,UAAU,KAAK,CAAC,CAACE,EAAS,WAAW,MAAM;AAAA,MAC/E,SAASF,EAAO,UAAU,SAAS,KAAK,KAAKI,EAAS,OAAO,IAAI,SAAS;AAAA,MAC1E,GAAGA;AAAA,IAAA;AAEL,gBAAK,kBAAkB,IAAIJ,GAAQK,CAAI,GACvC,KAAK,IAAI,KAAK,kCAAkC;AAAA,MAC9C,KAAK,KAAK;AAAA,MACV,QAAAL;AAAA,MACA,MAAAK;AAAA,IAAA,CACD,GACMA;AAAA,EACT;AAAA,EAEA,YACEC,GACAC,GAC+B;AAC/B,UAAMC,IAAUF,EAAO,iBAAoC,SAAS;AACpE,WAAO,MAAM,KAAKE,CAAO,EACtB,IAAI,CAACR,MAAW,KAAK,YAAYA,CAAM,CAAC,EACxC;AAAA,MACC,CAACA,MAAWA,MAAW,SAAS,CAACO,KAAUA,EAAOP,CAAM;AAAA,IAAA;AAAA,EAE9D;AAAA,EAEA,MAAM,kBAAkB;AACtB,QAAIS,IAAS;AACb,UAAMC,IAAuB,MAAM,KAAK,IAAI,YAAY,IAAI,mCAAmC;AAE/F,SAAK,IAAI,OAAO,CAAC,WAAW,GAAG,CAACZ,MAAQ;AACtC,MAAAW,IAAS,IACTX,EAAI,GAAG,WAAW,MAAM;AACtB,QAAAW,IAAS;AAAA,MACX,CAAC,GAED,QAAQ,IAAI,OAAO,kBAAkB,EAAE,IAAI,CAACE,MAAa;AACvD,YAAI,CAACF;AACH;AAiBF,QAfgB,KAAK,YAAYE,EAAS,IAAI,CAAC,GAAI,CAAC,EAAE,QAAAC,GAAQ,OAAAC,GAAO,SAAAC,EAAA,MACnDJ,KAAwB,CAACI,IAIpB,CAAC,QAAQ,QAAQ,EAAE,SAASF,CAAM,IAE9C,KAEaC,GAAO,UAAU,MAAM,KAAKA,GAAO,UAAU,YAAY,IAEtEA,EAAO,YAAA,EAAc,MAAM,GAAG,EAAE,UAAU,IAE5C,KAVE,EAWV,EACO,QAAQ,CAACR,MAAS;AACxB,gBAAM,EAAE,KAAAU,GAAK,OAAAF,GAAO,QAAAG,GAAQ,QAAAC,MAAWZ;AACvC,cAAIU,EAAI,QAAQ;AACd;AAKF,cAHAA,EAAI,QAAQ,iBAAiB,KAEPE,EAAO,IAAI,SAAS,KAAKA,EAAO,IAAI,MAAM;AAE9D,mBAAO,KAAK,IAAI,OAAO,MAAMF,GAAK,gCAAgC;AAGpE,gBAAMG,IAAYL,GAAO,iBAAA,KAAsB,IACzCM,IAAaF,EAAO,IAAI,SAAS,GAAG,QAAQ,OAAO,EAAE,KAAK,QAC1DG,IAAcH,EAAO,IAAI,OAAO,GAChCI,IAAaJ,EAAO,IAAI,SAAS;AAEvC,cAAIK;AACJ,UAAIH,MAAe,SAASN,GAAO,UAAU,YAAY,IACvDS,IAAU,QACDH,KAAc,QAAQ,KAAKA,CAAU,MAC9CG,IAAU,SAASH,GAAY,EAAE;AAGnC,gBAAMI,IAAWH,IAAc,SAASA,GAAa,EAAE,IAAI,QAErDI,IAAqC;AAAA,YACzC,OAAON;AAAA,YACP,QAAQF,KAAU;AAAA,YAClB,SAAAM;AAAA,YACA,UAAAC;AAAA,YACA,YAAAF;AAAA,UAAA,GAGII,IACJ,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,SAASF;AAAA,cACT,WAAW,GAAG,KAAK,OAAO,aAAa,mBAAmBH,IAAa,gCAAgC,EAAE;AAAA,cACzG,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,YAAY;AAAA,cAAA;AAAA,cAEd,SAAS,CAACM,MAAM;AACd,gBAAAA,EAAE,eAAA,GACF,KAAK,IAAI,KAAK,mCAAmC;AAAA,kBAC/C,KAAK,KAAK;AAAA,kBACV,QAAQZ;AAAA,kBACR,MAAAV;AAAA,kBACA,OAAOsB;AAAA,kBACP,QAAQ;AAAA,gBAAA,CACT,GACD7B,EAAI,UAAU,UAAU0B,CAAO;AAAA,cACjC;AAAA,cAEA,UAAA,gBAAAE,EAACE,GAAA,EAAc,WAAU,WAAA,CAAW;AAAA,YAAA;AAAA,UAAA;AAIxC,UAAAb,EAAI,sBAAsB,YAAYU,CAAI;AAAA,QAC5C,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB;AAChB,QAAIhB,IAAS;AACb,UAAMoB,IAAa,CAACC,MAClB,CAAC,QAAQ,QAAQ,KAAK,EAAE,SAASA,CAAG;AAEtC,SAAK,IAAI,OAAO,CAAC,WAAW,GAAG,CAAChC,MAAQ;AACtC,MAAAW,IAAS,IACTX,EAAI,GAAG,WAAW,MAAM;AACtB,QAAAW,IAAS;AAAA,MACX,CAAC,GAED,QAAQ,IAAI,OAAO,kBAAkB,EAAE,IAAI,CAACE,MAAa;AACvD,YAAI,CAACF;AACH;AAKF,QAHgB,KAAK,YAAYE,EAAS,IAAI,CAAC,GAAI,CAAC,EAAE,QAAAM,GAAQ,OAAAJ,QACrD,CAAC,EAAEI,EAAO,IAAI,MAAM,KAAKJ,GAAO,UAAU,MAAM,EACxD,EACO,QAAQ,CAACR,MAAS;AACxB,gBAAM,EAAE,KAAAU,GAAK,OAAAF,GAAO,QAAAI,EAAA,IAAWZ;AAC/B,cAAIU,EAAI,QAAQ;AACd;AAEF,UAAAA,EAAI,QAAQ,iBAAiB;AAE7B,cAAIgB,GACAC;AAWJ,cAVInB,GAAO,eAAA,MAAqB,MAE7B,CAAA,EAA2BmB,GAAOD,CAAI,IAAIlB,EAAM,aAAA,EAAe,MAAM,GAAG,GACpEkB,MACHA,IAAO,YAGTA,IAAOd,EAAO,IAAI,MAAM,GACxBe,IAAQf,EAAO,IAAI,OAAO,IAExB,CAACc,KAAQ,CAACC;AACZ;AAGF,gBAAMC,IAA6C,CAAA;AACnD,UAAIJ,EAAWE,CAAI,KACjBE,EAAQ,UAAU,SAASD,CAAK,GAChCC,EAAQ,aAAaF,MAErBE,EAAQ,UAAU,SAASD,CAAK,GAChCC,EAAQ,QAAQ,SAASF,CAAI;AAG/B,gBAAMN,IACJ,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,SAASO;AAAA,cACT,WAAW,GAAG,KAAK,OAAO,aAAa;AAAA,cACvC,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,YAAY;AAAA,cAAA;AAAA,cAEd,SAAS,CAACN,MAAM;AACd,gBAAAA,EAAE,eAAA,GACF,KAAK,IAAI,KAAK,mCAAmC;AAAA,kBAC/C,KAAK,KAAK;AAAA,kBACV,QAAQZ;AAAA,kBACR,MAAAV;AAAA,kBACA,OAAOsB;AAAA,kBACP,QAAQ;AAAA,gBAAA,CACT,GACD7B,EAAI,UAAU,aAAamC,CAAO;AAAA,cACpC;AAAA,cAEA,UAAAC,gBAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,gBAAa;AAAA,kBACb,kBAAe;AAAA,kBACf,mBAAgB;AAAA,kBAChB,OAAM;AAAA,kBAEN,UAAA;AAAA,oBAAA,gBAAAR,EAAC,UAAK,QAAO,QAAO,GAAE,iBAAgB,MAAK,QAAO;AAAA,oBAClD,gBAAAA,EAAC,QAAA,EAAK,GAAE,0BAAA,CAA0B;AAAA,oBAClC,gBAAAA,EAAC,QAAA,EAAK,GAAE,yEAAA,CAAyE;AAAA,oBACjF,gBAAAA,EAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,oBACrB,gBAAAA,EAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,oBACrB,gBAAAA,EAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACvB;AAAA,UAAA;AAIJ,UAAAX,EAAI,sBAAsB,YAAYU,CAAI;AAAA,QAC5C,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AA5ROlC,IAAA4C,EAAA3C,CAAA;AAAMI,IAANwC,gCAnBP9C,GAmBaM,CAAA;AAANyC,EAAA9C,GAAA,GAAMK,CAAA;"}
@@ -1,8 +1,8 @@
1
- import { j as i, F as P, P as E } from "./index-CvhkVj_L.js";
2
- import { B as C, I as q, S as x } from "./index-DFPN4uYd.js";
3
- import { I as z } from "./IconQuickEdit-CAL1HXIb.js";
1
+ import { j as i, F as P, P as E } from "./index-CM_6yF2v.js";
2
+ import { B as C, I as q, S as x } from "./index-BXaiDKnr.js";
3
+ import { I as z } from "./IconQuickEdit-CMCQncyj.js";
4
4
  import { R as j } from "./Preferences-DS4-CFWe.js";
5
- import { M as I } from "./index-lZkYoUca.js";
5
+ import { M as I } from "./index-CG38LlAh.js";
6
6
  const T = (t) => {
7
7
  let { user: e, target: r, ctx: o } = t;
8
8
  const n = o.getUrl.bind(o);
@@ -185,7 +185,7 @@ var F = Object.create, v = Object.defineProperty, M = Object.getOwnPropertyDescr
185
185
  N = [q(["wiki", "getUrl", "preferences"]), j(
186
186
  x.object({
187
187
  "quickDiff.keyshortcut": x.string().default("ctrl-d").description("Key shortcut to open quick diff in quick edit modal")
188
- }).description("Quick diff options").extra("category", "edit")
188
+ }).description("Quick diff options").extra("category", "editor")
189
189
  )];
190
190
  class h extends (D = C) {
191
191
  constructor(e) {
@@ -365,4 +365,4 @@ G(p, 1, h);
365
365
  export {
366
366
  h as PluginQuickDiff
367
367
  };
368
- //# sourceMappingURL=index-BjwVNZ_h.js.map
368
+ //# sourceMappingURL=index-D4uwfUZL.js.map