@inpageedit/core 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ActionButton-CRjo_l3y.js → ActionButton-B6OUgtHx.js} +2 -2
- package/dist/{ActionButton-CRjo_l3y.js.map → ActionButton-B6OUgtHx.js.map} +1 -1
- package/dist/CheckBox-Dx3r3LQz.js +13 -0
- package/dist/CheckBox-Dx3r3LQz.js.map +1 -0
- package/dist/IconQuickDiff-BkbxyY-d.js +29 -0
- package/dist/IconQuickDiff-BkbxyY-d.js.map +1 -0
- package/dist/IconQuickEdit-BiRYADU_.js +68 -0
- package/dist/IconQuickEdit-BiRYADU_.js.map +1 -0
- package/dist/IconUpload-Bz4BW_nc.js +27 -0
- package/dist/IconUpload-Bz4BW_nc.js.map +1 -0
- package/dist/InPageEdit.js +20 -0
- package/dist/InPageEdit.js.map +1 -0
- package/dist/InputBox-D2ZRTMFP.js +42 -0
- package/dist/InputBox-D2ZRTMFP.js.map +1 -0
- package/dist/{PluginImagesUsed-Bq_C_rgg.js → PluginImagesUsed-BVyvFA1_.js} +7 -7
- package/dist/{PluginImagesUsed-Bq_C_rgg.js.map → PluginImagesUsed-BVyvFA1_.js.map} +1 -1
- package/dist/{PluginPrefSync-DP5NyPnI.js → PluginPrefSync-CUKkx4Qk.js} +10 -10
- package/dist/{PluginPrefSync-DP5NyPnI.js.map → PluginPrefSync-CUKkx4Qk.js.map} +1 -1
- package/dist/{PluginStoreApp-_YWpLgfs.js → PluginStoreApp-CoOAw1fr.js} +4 -4
- package/dist/{PluginStoreApp-_YWpLgfs.js.map → PluginStoreApp-CoOAw1fr.js.map} +1 -1
- package/dist/{PluginTemplatesUsed-DS_rHctR.js → PluginTemplatesUsed-CdjT1wR4.js} +12 -12
- package/dist/{PluginTemplatesUsed-DS_rHctR.js.map → PluginTemplatesUsed-CdjT1wR4.js.map} +1 -1
- package/dist/{index-CM_6yF2v.js → Promise.withResolvers-C4chhLB1.js} +17 -11
- package/dist/Promise.withResolvers-C4chhLB1.js.map +1 -0
- package/dist/{RadioBox-0UuxlcWZ.js → RadioBox-B0z9YHQg.js} +2 -2
- package/dist/{RadioBox-0UuxlcWZ.js.map → RadioBox-B0z9YHQg.js.map} +1 -1
- package/dist/components/index.js +75 -46
- package/dist/components/index.js.map +1 -1
- package/dist/{BasePlugin-BCVSn9QJ.js → core.js} +28 -10
- package/dist/core.js.map +1 -0
- package/dist/{index-n5KKWE9v.js → index-1tsXE6ax.js} +9 -8
- package/dist/{index-n5KKWE9v.js.map → index-1tsXE6ax.js.map} +1 -1
- package/dist/{index-CS1kidKF.js → index-B32tFyLB.js} +57 -57
- package/dist/{index-CS1kidKF.js.map → index-B32tFyLB.js.map} +1 -1
- package/dist/{index-Cq8xPcEY.js → index-BPTMltVf.js} +35 -35
- package/dist/index-BPTMltVf.js.map +1 -0
- package/dist/{index-rKL4D_7I.js → index-BYlcHc-O.js} +22 -24
- package/dist/index-BYlcHc-O.js.map +1 -0
- package/dist/{index-DjyjqpeO.js → index-C4qm_X_A.js} +11 -11
- package/dist/{index-DjyjqpeO.js.map → index-C4qm_X_A.js.map} +1 -1
- package/dist/index-CAtPo7xJ.js +793 -0
- package/dist/index-CAtPo7xJ.js.map +1 -0
- package/dist/{index-DPA1ptYq.js → index-CVCy0wPP.js} +8 -7
- package/dist/{index-DPA1ptYq.js.map → index-CVCy0wPP.js.map} +1 -1
- package/dist/index-CYfkwXRf.js +1631 -0
- package/dist/index-CYfkwXRf.js.map +1 -0
- package/dist/{index-mFwJhDwE.js → index-DZa9mxN4.js} +11 -11
- package/dist/{index-mFwJhDwE.js.map → index-DZa9mxN4.js.map} +1 -1
- package/dist/{index-B9VO3swL.js → index-Dm2vgYkZ.js} +58 -81
- package/dist/index-Dm2vgYkZ.js.map +1 -0
- package/dist/{index-C3t-Xj3e.js → index-NWWeW3tX.js} +10 -10
- package/dist/{index-C3t-Xj3e.js.map → index-NWWeW3tX.js.map} +1 -1
- package/dist/index-QnWieXQc.js +4932 -0
- package/dist/index-QnWieXQc.js.map +1 -0
- package/dist/{index-CbdkXGs7.js → index-bQ0CVu3l.js} +13 -17
- package/dist/{index-CbdkXGs7.js.map → index-bQ0CVu3l.js.map} +1 -1
- package/dist/{index-Cb2_vqBl.js → index-ygc4AMy4.js} +10 -10
- package/dist/{index-Cb2_vqBl.js.map → index-ygc4AMy4.js.map} +1 -1
- package/dist/{index-DD5CVCfD.js → index-z_qDGCMT.js} +2 -2
- package/dist/{index-DD5CVCfD.js.map → index-z_qDGCMT.js.map} +1 -1
- package/dist/index.d.ts +98 -36
- package/dist/index.js +24 -26
- package/dist/index.js.map +1 -1
- package/dist/{makeCallable-LDU0xZMJ.js → makeCallable-Cg4zUG4c.js} +2 -2
- package/dist/{makeCallable-LDU0xZMJ.js.map → makeCallable-Cg4zUG4c.js.map} +1 -1
- package/dist/models/index.js +7 -7
- package/dist/models/index.js.map +1 -1
- package/dist/plugins/index.js +12 -12
- package/dist/services/index.js +5 -4
- package/dist/style.css +1 -1
- package/dist/{vueHooks-l04s8cIl.js → vueHooks-Bs93iP61.js} +1519 -1492
- package/dist/vueHooks-Bs93iP61.js.map +1 -0
- package/lib/index.umd.js +19 -15
- package/lib/index.umd.js.map +1 -1
- package/lib/style.css +1 -1
- package/package.json +36 -27
- package/dist/BasePlugin-BCVSn9QJ.js.map +0 -1
- package/dist/IconQuickEdit-CMCQncyj.js +0 -27
- package/dist/IconQuickEdit-CMCQncyj.js.map +0 -1
- package/dist/InputBox-CZ1v4_l3.js +0 -50
- package/dist/InputBox-CZ1v4_l3.js.map +0 -1
- package/dist/Preferences-DqtjY7XU.js +0 -1541
- package/dist/Preferences-DqtjY7XU.js.map +0 -1
- package/dist/WatchlistAction-BbNAyryN.js +0 -5
- package/dist/WatchlistAction-BbNAyryN.js.map +0 -1
- package/dist/browser-DR-yCqVg.js +0 -1160
- package/dist/browser-DR-yCqVg.js.map +0 -1
- package/dist/index-B9VO3swL.js.map +0 -1
- package/dist/index-CG38LlAh.js +0 -46
- package/dist/index-CG38LlAh.js.map +0 -1
- package/dist/index-CM_6yF2v.js.map +0 -1
- package/dist/index-CcAmmXbb.js +0 -3290
- package/dist/index-CcAmmXbb.js.map +0 -1
- package/dist/index-Cq8xPcEY.js.map +0 -1
- package/dist/index-DVvsTsLI.js +0 -505
- package/dist/index-DVvsTsLI.js.map +0 -1
- package/dist/index-FvMu0Ka0.js +0 -342
- package/dist/index-FvMu0Ka0.js.map +0 -1
- package/dist/index-rKL4D_7I.js.map +0 -1
- package/dist/vueHooks-l04s8cIl.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CAtPo7xJ.js","sources":["../src/plugins/quick-upload/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\n\nimport './style.scss'\n\nimport BasePlugin from '@/plugins/BasePlugin'\nimport { RegisterPreferences } from '@/decorators/Preferences'\nimport { IconUpload } from '@/components/Icon'\nimport { CheckBox } from '@/components'\nimport type { UploadFileResult } from '@/services/WikiFileService'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickUpload: PluginQuickUpload\n }\n interface Preferences {\n 'quickUpload.summary': string\n }\n}\n\ntype UploadItem = {\n id: string\n file: File\n filename: string\n text: string\n status: 'queued' | 'uploading' | 'success' | 'warning' | 'error' | 'paused'\n message?: string\n retryable?: boolean\n fileUrl?: string\n result?: UploadFileResult\n}\n\nconst PreviewPlaceholderNA = ({ $ }: { $: (strings: TemplateStringsArray) => string }) => (\n <div className=\"ipe-quickUpload__preview-placeholder is-na\">\n <span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"icon icon-tabler icons-tabler-filled icon-tabler-file-unknown\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 2l.117 .007a1 1 0 0 1 .876 .876l.007 .117v4l.005 .15a2 2 0 0 0 1.838 1.844l.157 .006h4l.117 .007a1 1 0 0 1 .876 .876l.007 .117v9a3 3 0 0 1 -2.824 2.995l-.176 .005h-10a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-14a3 3 0 0 1 2.824 -2.995l.176 -.005zm0 15a1 1 0 0 0 -.993 .883l-.007 .127a1 1 0 0 0 1.993 .117l.007 -.127a1 1 0 0 0 -1 -1m1.136 -5.727a2.5 2.5 0 0 0 -3.037 .604a1 1 0 0 0 1.434 1.389l.088 -.09a.5 .5 0 1 1 .379 .824a1 1 0 0 0 -.002 2a2.5 2.5 0 0 0 1.137 -4.727\" />\n <path d=\"M19 7h-4l-.001 -4.001z\" />\n </svg>\n <p>{$`No preview available`}</p>\n </span>\n </div>\n)\n\n@RegisterPreferences(\n Schema.object({\n 'quickUpload.summary': Schema.string()\n .description('Default summary of the quick upload')\n .default('[IPE-NEXT] Quick upload'),\n })\n)\n@Inject(['modal', '$', 'wikiTitle', 'wikiFile', 'quickPreview', 'preferences'])\nexport class PluginQuickUpload extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-upload')\n }\n\n protected async start() {\n this.injectToolbox()\n this.ctx.set('quickUpload', this)\n }\n\n protected async stop() {}\n\n private injectToolbox() {\n const { $ } = this.ctx\n this.ctx.inject(['toolbox'], (ctx) => {\n ctx.toolbox.addButton({\n id: 'quick-upload',\n group: 'group2',\n index: 2,\n icon: <IconUpload />,\n tooltip: () => $`Quick Upload`,\n onClick: (e) => {\n e.preventDefault()\n this.showModal()\n },\n })\n ctx.on('dispose', () => {\n ctx.toolbox.removeButton('quick-upload')\n })\n })\n }\n\n private formatFileSize(size: number = 0) {\n size = Number(size)\n if (!Number.isFinite(size) || size < 0) return '0 B'\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let index = 0\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n // 使用 Intl 来格式化数字(自动处理千分位、小数等)\n const formatter = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 })\n return `${formatter.format(size)} ${units[index]}`\n }\n\n private isFileAccepted(file: File, accept: string): boolean {\n if (!accept) return true\n const rules = accept\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n if (!rules.length) return true\n const fileType = file.type || ''\n const fileName = file.name || ''\n return rules.some((rule) => {\n // extension: .png .pdf\n if (rule.startsWith('.')) {\n return fileName.toLowerCase().endsWith(rule.toLowerCase())\n }\n // image/*, video/* ...\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1) // keep the trailing slash\n return fileType.startsWith(prefix)\n }\n // exact mime\n return fileType === rule\n })\n }\n\n private getDefaultPreviewPlaceholder() {\n const { $ } = this.ctx\n return (\n <div className=\"ipe-quickUpload__preview-placeholder\">\n <span>\n <IconUpload />\n <p>{$`You can drag & drop files to this modal`}</p>\n </span>\n </div>\n )\n }\n\n private safeId() {\n return `mu_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`\n }\n\n async showModal() {\n const { $ } = this.ctx\n\n let isUploading = false\n let pauseRequested = false\n\n const showMessage = (type: 'success' | 'warning' | 'error', title: string, content: any) => {\n this.ctx.modal.notify(type, {\n title,\n content,\n closeAfter: type === 'success' ? 3000 : 8000,\n })\n }\n\n const modal = this.ctx.modal.show({\n className: 'ipe-quickUpload compact-buttons',\n sizeClass: 'mediumToLarge',\n center: false,\n title: $`Quick Upload`,\n content: $`Quick Upload`,\n outSideClose: false,\n beforeClose: () => {\n if (isUploading) {\n showMessage('warning', $`Upload in progress`, $`Please pause or wait for it to finish.`)\n return false\n }\n return true\n },\n })\n\n const defaultSummary = (await this.ctx.preferences.get('quickUpload.summary')) || ''\n const accept = 'image/*,video/*,audio/*,application/pdf'\n const confirmThreshold = 20\n\n let items: UploadItem[] = []\n let selectedId: string | null = null\n\n const ui = {\n fileInput: null as HTMLInputElement | null,\n listEl: null as HTMLElement | null,\n previewWrapper: null as HTMLElement | null,\n progressEl: null as HTMLElement | null,\n progressTextEl: null as HTMLElement | null,\n summaryInput: null as HTMLTextAreaElement | null,\n ignoreWarnings: null as HTMLInputElement | null,\n selectedCountEl: null as HTMLElement | null,\n readyCountEl: null as HTMLElement | null,\n }\n\n const updateItem = (id: string, patch: Partial<UploadItem>) => {\n items = items.map((x) => (x.id === id ? { ...x, ...patch } : x))\n }\n\n const removeItem = (id: string) => {\n items = items.filter((x) => x.id !== id)\n if (selectedId === id) {\n selectedId = items[0]?.id ?? null\n }\n }\n\n const updateMany = (ids: Set<string>, fn: (it: UploadItem) => UploadItem) => {\n items = items.map((x) => (ids.has(x.id) ? fn(x) : x))\n }\n\n const summarizeApiErrors = (e: any) => {\n const out: string[] = []\n const s = (v: any) => (v == null ? '' : String(v))\n if (e instanceof Error) {\n out.push(e.message)\n let cur: any = e\n while (cur?.cause) {\n cur = cur.cause\n if (cur instanceof Error) out.push(cur.message)\n else break\n }\n } else if (e?.data?.error?.info) {\n out.push(s(e.data.error.info))\n } else if (e?.error?.info) {\n out.push(s(e.error.info))\n } else if (e?.message) {\n out.push(s(e.message))\n }\n return out.filter(Boolean)\n }\n\n const formatUploadError = (e: any): { message: string; retryable: boolean } => {\n let reasons = summarizeApiErrors(e)\n if (reasons.length === 0) reasons = ['Upload failed with unknown error.']\n\n const combined = reasons.join('\\n')\n const lower = combined.toLowerCase()\n\n if (\n lower.includes('file is larger') ||\n lower.includes('files larger than') ||\n lower.includes('maximum upload size')\n ) {\n return { message: `File too large\\n${combined}`, retryable: false }\n }\n\n if (lower.includes('network') || lower.includes('timeout') || lower.includes('timed out')) {\n return { message: `Network issue\\n${combined}`, retryable: true }\n }\n\n return { message: combined, retryable: true }\n }\n\n const shouldRetryItem = (it: UploadItem) => {\n if (it.status === 'warning') return true\n if (it.status === 'error') return it.retryable !== false\n return false\n }\n\n type UploadMode = 'all' | 'resume' | 'retry'\n\n const getUploadCandidates = (mode: UploadMode, list: UploadItem[]) => {\n if (mode === 'retry') return list.filter((it) => shouldRetryItem(it))\n if (mode === 'resume') {\n return list.filter(\n (it) => (it.status === 'queued' || it.status === 'paused') && it.retryable !== false\n )\n }\n return list.filter((it) => it.status === 'queued' || it.status === 'paused')\n }\n\n const prepareRetryState = (candidates: UploadItem[]) => {\n const idset = new Set(candidates.map((c) => c.id))\n updateMany(idset, (x) =>\n x.retryable === false ? x : { ...x, status: 'queued', message: undefined }\n )\n }\n\n const getSelected = () => {\n return items.find((x) => x.id === selectedId) || null\n }\n\n const setSelected = (id: string | null) => {\n selectedId = id\n renderList()\n void renderPreview()\n }\n\n const countByStatus = () => {\n const out = { ok: 0, warn: 0, err: 0, paused: 0 }\n for (const it of items) {\n if (it.status === 'success') out.ok++\n else if (it.status === 'warning') out.warn++\n else if (it.status === 'error') out.err++\n else if (it.status === 'paused') out.paused++\n }\n return out\n }\n\n const setProgress = (done: number, total: number) => {\n const pct = total > 0 ? Math.floor((done / total) * 100) : 0\n if (ui.progressTextEl) ui.progressTextEl.textContent = `${done}/${total} (${pct}%)`\n if (ui.progressEl) ui.progressEl.style.width = `${Math.max(0, Math.min(100, pct))}%`\n }\n\n const sanitizeFilename = (name: string) => {\n return (name || '').replace(/\\s+/g, ' ').trim()\n }\n\n const resetAll = () => {\n items = []\n selectedId = null\n setProgress(0, 0)\n if (ui.summaryInput) ui.summaryInput.value = String(defaultSummary || '')\n if (ui.ignoreWarnings) ui.ignoreWarnings.checked = false\n renderList()\n void renderPreview()\n }\n\n const addFiles = (files: File[]) => {\n const accepted = files.filter((f) => this.isFileAccepted(f, String(accept || '')))\n if (!accepted.length) return\n\n const newItems: UploadItem[] = accepted.map((file) => ({\n id: this.safeId(),\n file,\n filename: file.name,\n text: '',\n status: 'queued',\n retryable: true,\n }))\n\n items = [...items, ...newItems]\n if (!selectedId && items.length) {\n selectedId = items[0].id\n }\n renderList()\n void renderPreview()\n }\n\n const buildUploadBody = (item: UploadItem) => {\n const body: Record<string, any> = {}\n\n body.filename = sanitizeFilename(item.filename || item.file.name)\n body.file = item.file\n\n const summary = (ui.summaryInput?.value || '').trim() || ''\n body.comment = summary\n\n body.text = item.text || ''\n\n if (ui.ignoreWarnings?.checked) {\n body.ignorewarnings = '1'\n }\n\n return body\n }\n\n const getStatusLabel = (status: UploadItem['status']) => {\n switch (status) {\n case 'queued':\n return 'Queued'\n case 'uploading':\n return 'Uploading'\n case 'success':\n return 'Uploaded'\n case 'warning':\n return 'Warning'\n case 'error':\n return 'Failed'\n case 'paused':\n return 'Paused'\n default:\n return status\n }\n }\n\n const renderList = () => {\n if (!ui.listEl) return\n ui.listEl.innerHTML = ''\n\n if (!isUploading) {\n setProgress(0, items.length)\n }\n\n if (!items.length) {\n ui.listEl.appendChild(\n <div style={{ opacity: 0.75, padding: '8px 0' }}>\n <p>No files selected.</p>\n </div>\n )\n updateFooter()\n return\n } else {\n const list = (\n <ul\n style={{\n listStyle: 'none',\n padding: 0,\n margin: 0,\n display: 'grid',\n gap: '6px',\n }}\n />\n ) as HTMLUListElement\n\n items.forEach((item) => {\n const isActive = item.id === selectedId\n const row = (\n <li\n style={{\n border: '1px solid var(--ipe-border-color, rgba(0,0,0,.12))',\n borderRadius: '8px',\n padding: '8px',\n cursor: 'pointer',\n background: isActive ? 'rgba(59,130,246,.08)' : 'transparent',\n minWidth: 0,\n }}\n onClick={() => setSelected(item.id)}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <div style={{ flex: 1, minWidth: 0, overflow: 'hidden' }}>\n <div\n style={{\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n wordBreak: 'break-word',\n fontSize: '13px',\n }}\n >\n <strong style={{ fontWeight: 600 }}>{item.filename}</strong>\n </div>\n <div style={{ fontSize: '12px', opacity: 0.75 }}>\n {getStatusLabel(item.status)}\n </div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <button\n type=\"button\"\n className=\"ipe-btn is-text\"\n title={'Remove'}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n removeItem(item.id)\n renderList()\n void renderPreview()\n }}\n >\n ×\n </button>\n </div>\n </div>\n\n {item.message ? (\n <div\n style={{\n fontSize: '12px',\n opacity: 0.8,\n marginTop: '4px',\n whiteSpace: 'pre-wrap',\n }}\n >\n {item.message}\n </div>\n ) : null}\n </li>\n ) as HTMLLIElement\n\n list.appendChild(row)\n })\n\n ui.listEl.appendChild(list)\n }\n\n updateFooter()\n }\n\n const renderPreview = async () => {\n if (!ui.previewWrapper) return\n ui.previewWrapper.innerHTML = ''\n\n const item = getSelected()\n if (!item) {\n ui.previewWrapper.appendChild(this.getDefaultPreviewPlaceholder())\n return\n }\n\n const file = item.file\n\n const header = (\n <section style={{ display: 'grid', gap: '6px' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: '12px',\n }}\n >\n <strong style={{ wordBreak: 'break-word' }}>{file.name}</strong>\n <span style={{ fontSize: '12px', opacity: 0.8 }}>{this.formatFileSize(file.size)}</span>\n </div>\n <div style={{ display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap' }}>\n <span style={{ fontSize: '12px', opacity: 0.8 }}>{file.type || $`Unknown type`}</span>\n {item.fileUrl ? (\n <a\n href={item.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: '12px' }}\n >\n {$`Open file page`}\n </a>\n ) : null}\n </div>\n </section>\n ) as HTMLElement\n\n const previewEl = (await this.ctx.quickPreview.getPreviewElement(file)) || (\n <PreviewPlaceholderNA $={$} />\n )\n\n const previewBox = (\n <div className=\"ipe-quickUpload__preview-content\" style={{ marginTop: '10px' }}>\n {previewEl}\n </div>\n ) as HTMLElement\n\n const isLocked = item.status === 'success'\n const filenameEditor = (\n <div\n className=\"ipe-input-box\"\n style={{\n marginTop: '8px',\n opacity: isLocked ? 0.55 : 1,\n filter: isLocked ? 'grayscale(1)' : undefined,\n pointerEvents: isLocked ? 'none' : undefined,\n }}\n >\n <label htmlFor=\"mu_filename\">{$`Target filename`}</label>\n <input\n id=\"mu_filename\"\n name=\"mu_filename\"\n type=\"text\"\n value={item.filename}\n disabled={isUploading || isLocked}\n onInput={(e: Event) => {\n const v = (e.target as HTMLInputElement).value\n updateItem(item.id, { filename: v })\n renderList()\n }}\n />\n </div>\n ) as HTMLElement\n\n const descEditor = (\n <div\n className=\"ipe-input-box\"\n style={{\n marginTop: '8px',\n opacity: isLocked ? 0.55 : 1,\n filter: isLocked ? 'grayscale(1)' : undefined,\n pointerEvents: isLocked ? 'none' : undefined,\n }}\n >\n <label htmlFor=\"mu_text\">File description</label>\n <textarea\n id=\"mu_text\"\n placeholder={'This file is for...\\n[[Category:XXX]]'}\n disabled={isUploading || isLocked}\n value={item.text || ''}\n onInput={(e: Event) => {\n const v = (e.target as HTMLTextAreaElement).value\n updateItem(item.id, { text: v })\n renderList()\n }}\n ></textarea>\n </div>\n ) as HTMLElement\n\n ui.previewWrapper.appendChild(header)\n ui.previewWrapper.appendChild(previewBox)\n ui.previewWrapper.appendChild(filenameEditor)\n ui.previewWrapper.appendChild(descEditor)\n }\n\n const uploadOne = async (item: UploadItem) => {\n updateItem(item.id, { status: 'uploading', message: undefined })\n renderList()\n await renderPreview()\n\n const body = buildUploadBody(item)\n\n this.ctx.emit('analytics/event', {\n feature: 'quick-upload',\n page: body.filename?.toString() || undefined,\n })\n\n try {\n const result = await this.ctx.wikiFile.upload(body)\n\n if (result.data?.upload?.result === 'Success') {\n const fileUrl = this.ctx.wikiFile.getFileUrl(`File:${result.data.upload.filename}`)\n updateItem(item.id, {\n status: 'success',\n fileUrl,\n result: result.data.upload as any,\n retryable: true,\n })\n renderList()\n await renderPreview()\n return\n }\n\n throw result\n } catch (e) {\n let reasons: string[] = []\n\n if ((e as any)?.data?.upload) {\n const uploadResult = (e as any).data.upload as UploadFileResult\n\n if (uploadResult.result === 'Success') {\n const fname = (uploadResult as any).filename || body.filename\n const fileUrl = this.ctx.wikiFile.getFileUrl(`File:${fname}`)\n updateItem(item.id, {\n status: 'success',\n fileUrl,\n result: uploadResult,\n retryable: true,\n })\n renderList()\n await renderPreview()\n return\n }\n\n if (\n Array.isArray(uploadResult.warnings?.duplicate) &&\n uploadResult.warnings.duplicate.length > 0\n ) {\n reasons.push(`Duplicate of: ${uploadResult.warnings.duplicate.join(', ')}`)\n updateItem(item.id, {\n status: 'warning',\n message: reasons.join('\\n'),\n result: uploadResult,\n retryable: true,\n })\n renderList()\n await renderPreview()\n return\n }\n\n if (uploadResult.warnings?.exists) {\n reasons.push('A file with the same name already exists.')\n updateItem(item.id, {\n status: 'warning',\n message: reasons.join('\\n'),\n result: uploadResult,\n retryable: true,\n })\n renderList()\n await renderPreview()\n return\n }\n\n const { message, retryable } = formatUploadError(e)\n updateItem(item.id, { status: 'error', message, retryable })\n renderList()\n await renderPreview()\n return\n }\n\n const { message, retryable } = formatUploadError(e)\n updateItem(item.id, { status: 'error', message, retryable })\n renderList()\n await renderPreview()\n }\n }\n\n const uploadAll = async (mode: UploadMode = 'all') => {\n if (isUploading) return\n\n let candidates = getUploadCandidates(mode, items)\n\n if (mode === 'retry') {\n if (candidates.length === 0) {\n showMessage(\n 'warning',\n 'Nothing to retry',\n <div>There are no retryable failed/warning items.</div>\n )\n return\n }\n } else if (mode === 'resume') {\n if (candidates.length === 0) {\n showMessage(\n 'warning',\n 'Nothing to resume',\n <div>There are no queued paused items to continue.</div>\n )\n return\n }\n } else {\n if (items.length === 0) {\n showMessage(\n 'warning',\n $`No files selected`,\n <div>{$`Please select one or more files.`}</div>\n )\n return\n }\n if (items.length > confirmThreshold) {\n this.ctx.modal.confirm(\n {\n title: $`Confirm bulk upload`,\n content: (\n <div>\n {$`You are about to upload`} <strong>{items.length}</strong>{' '}\n {$`files at once. Are you sure?`}\n </div>\n ),\n center: true,\n okBtn: { label: $`Upload`, className: 'is-primary is-ghost' },\n cancelBtn: { label: $`Cancel`, className: 'is-danger is-ghost' },\n },\n (confirmed) => {\n if (confirmed) {\n void uploadAll('all')\n }\n return true\n }\n )\n return\n }\n }\n\n if (mode === 'retry') {\n prepareRetryState(candidates)\n renderList()\n await renderPreview()\n candidates = getUploadCandidates('retry', items)\n }\n\n isUploading = true\n pauseRequested = false\n updateFooter()\n\n try {\n const total = candidates.length\n let done = 0\n setProgress(0, total)\n\n for (const item of candidates) {\n if (pauseRequested) {\n const remainingIds = new Set(candidates.slice(done).map((x) => x.id))\n updateMany(remainingIds, (x) =>\n x.status === 'queued' || x.status === 'uploading'\n ? { ...x, status: 'paused', message: 'Paused by user', retryable: true }\n : x\n )\n renderList()\n await renderPreview()\n break\n }\n\n const current = items.find((x) => x.id === item.id)\n if (!current) {\n done++\n setProgress(done, total)\n continue\n }\n\n await uploadOne(current)\n done++\n setProgress(done, total)\n }\n\n const { ok, warn, err, paused } = countByStatus()\n if (paused > 0) {\n showMessage(\n 'warning',\n 'Upload paused',\n <div>\n <div>\n Uploaded: <strong>{ok}</strong>\n </div>\n <div>\n Warnings: <strong>{warn}</strong>\n </div>\n <div>\n Errors: <strong>{err}</strong>\n </div>\n <div>\n Paused: <strong>{paused}</strong>\n </div>\n </div>\n )\n } else if (err === 0 && warn === 0) {\n showMessage(\n 'success',\n 'Upload completed',\n <div>\n <strong>All files uploaded successfully.</strong>\n <div>\n Uploaded: <strong>{ok}</strong>\n </div>\n </div>\n )\n } else {\n showMessage(\n 'warning',\n 'Upload completed with issues',\n <div>\n <div>\n Uploaded: <strong>{ok}</strong>\n </div>\n {warn ? (\n <div>\n Warnings: <strong>{warn}</strong>\n </div>\n ) : null}\n {err ? (\n <div>\n Errors: <strong>{err}</strong>\n </div>\n ) : null}\n </div>\n )\n }\n } finally {\n isUploading = false\n updateFooter()\n }\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const container = e.currentTarget as HTMLElement\n container?.classList.remove('is-dragover')\n\n const files = Array.from(e.dataTransfer?.files || [])\n if (!files.length) return\n addFiles(files)\n }\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const container = e.currentTarget as HTMLElement\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'\n container?.classList.add('is-dragover')\n }\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const container = e.currentTarget as HTMLElement\n container?.classList.remove('is-dragover')\n }\n\n const progressBar = (\n <div style={{ marginBottom: '10px' }}>\n <div\n style={{\n height: '8px',\n borderRadius: '999px',\n background: 'rgba(0,0,0,.08)',\n overflow: 'hidden',\n }}\n >\n <div\n ref={(el: any) => {\n ui.progressEl = el\n }}\n style={{\n height: '100%',\n width: '0%',\n background: 'var(--ipe-primary, #3b82f6)',\n transition: 'width .2s ease',\n }}\n />\n </div>\n <div\n style={{\n marginTop: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '10px',\n }}\n >\n <div\n ref={(el: any) => {\n ui.progressTextEl = el\n }}\n style={{ fontSize: '12px', opacity: 0.8 }}\n >\n 0/0 (0%)\n </div>\n </div>\n </div>\n ) as HTMLElement\n\n const leftPanel = (\n <section style={{ display: 'grid', gap: '10px', minWidth: 0 }}>\n <div className=\"ipe-input-box\">\n <label htmlFor=\"mu_files\">\n Files{' '}\n {items.length > 0 ? (\n <span style={{ opacity: 0.85 }}>({items.length} selected)</span>\n ) : null}\n </label>\n <input\n id=\"mu_files\"\n type=\"file\"\n multiple\n accept={String(accept || '')}\n disabled={isUploading}\n ref={(el: any) => {\n ui.fileInput = el\n }}\n onChange={(e: Event) => {\n const files = Array.from((e.target as HTMLInputElement).files || [])\n addFiles(files)\n ;(e.target as HTMLInputElement).value = ''\n }}\n />\n </div>\n\n <div\n ref={(el: any) => {\n ui.listEl = el\n }}\n />\n </section>\n ) as HTMLElement\n\n const rightPanel = (\n <section style={{ display: 'grid', gap: '10px' }}>\n <div\n className=\"ipe-quickUpload__preview\"\n ref={(el: any) => {\n ui.previewWrapper = el\n }}\n onClick={(e) => {\n const target = e.target\n if (\n target &&\n (target as HTMLElement).closest('img, .ipe-quickUpload__preview-placeholder')\n ) {\n e.preventDefault()\n ui.fileInput?.click()\n }\n }}\n style={{\n border: '1px solid var(--ipe-border-color, rgba(0,0,0,.12))',\n borderRadius: '8px',\n padding: '10px',\n minWidth: 0,\n }}\n />\n </section>\n ) as HTMLElement\n\n const containerEl = (\n <section\n className=\"ipe-quickUpload__container\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n style={{ display: 'grid', gap: '12px' }}\n >\n {progressBar}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 40%) minmax(0, 1fr)',\n gap: '12px',\n alignItems: 'start',\n minWidth: 0,\n }}\n >\n {leftPanel}\n {rightPanel}\n </div>\n\n <div\n style={{\n borderTop: '1px solid var(--ipe-border-color, rgba(0,0,0,.12))',\n paddingTop: '10px',\n display: 'grid',\n gap: '10px',\n }}\n >\n <div className=\"ipe-input-box\">\n <label htmlFor=\"mu_summary\">Summary (applies to all files)</label>\n <textarea\n id=\"mu_summary\"\n disabled={isUploading}\n ref={(el: any) => {\n ui.summaryInput = el\n }}\n onInput={() => {}}\n />\n </div>\n\n <CheckBox\n name=\"ignorewarnings\"\n label={$`Ignore warnings and upload anyway`}\n inputProps={{\n disabled: isUploading,\n ref: (el: any) => {\n ui.ignoreWarnings = el\n },\n }}\n />\n </div>\n </section>\n ) as HTMLElement\n\n modal.setContent(containerEl)\n\n if (ui.summaryInput) ui.summaryInput.value = String(defaultSummary || '')\n\n const updateFooter = () => {\n const { warn, err, paused } = countByStatus()\n const hasFailed = err > 0 || warn > 0\n const hasPaused = paused > 0\n\n let label = $`Upload`\n let action = () => void uploadAll('all')\n let className = 'is-primary is-text'\n\n if (isUploading) {\n label = pauseRequested ? 'Pausing...' : 'Pause after current'\n action = () => {\n pauseRequested = true\n updateFooter()\n }\n } else if (hasPaused) {\n label = 'Resume'\n action = () => void uploadAll('resume')\n } else if (hasFailed) {\n label = 'Retry failed/warnings'\n action = () => void uploadAll('retry')\n }\n\n modal.setButtons([\n {\n label: $`Cancel`,\n className: 'is-danger is-text',\n method: () => modal.close(),\n },\n {\n label: 'Reset',\n className: 'is-text',\n method: () => {\n if (isUploading) return\n resetAll()\n },\n },\n {\n label,\n className,\n method: action,\n },\n ])\n }\n\n renderList()\n await renderPreview()\n\n return modal\n }\n}\n"],"names":["_PluginQuickUpload_decorators","_init","_a","PreviewPlaceholderNA","$","jsxs","jsx","RegisterPreferences","Schema","Inject","PluginQuickUpload","BasePlugin","ctx","IconUpload","e","size","units","index","file","accept","rules","s","fileType","fileName","rule","prefix","isUploading","pauseRequested","showMessage","type","title","content","modal","defaultSummary","confirmThreshold","items","selectedId","ui","updateItem","id","patch","x","removeItem","updateMany","ids","fn","summarizeApiErrors","out","v","cur","formatUploadError","reasons","combined","lower","shouldRetryItem","it","getUploadCandidates","mode","list","prepareRetryState","candidates","idset","c","getSelected","setSelected","renderList","renderPreview","countByStatus","setProgress","done","total","pct","sanitizeFilename","name","resetAll","addFiles","files","accepted","f","newItems","buildUploadBody","item","body","summary","getStatusLabel","status","isActive","row","updateFooter","header","previewEl","previewBox","isLocked","filenameEditor","descEditor","uploadOne","result","fileUrl","uploadResult","fname","message","retryable","uploadAll","confirmed","remainingIds","current","ok","warn","err","paused","handleDrop","handleDragOver","container","handleDragLeave","progressBar","el","leftPanel","containerEl","target","CheckBox","hasFailed","hasPaused","label","action","className","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { j as a, P as S } from "./
|
|
2
|
-
import { R as E,
|
|
3
|
-
import {
|
|
4
|
-
import { T as F } from "./index-
|
|
5
|
-
import { C as v
|
|
6
|
-
|
|
1
|
+
import { j as a, P as S } from "./Promise.withResolvers-C4chhLB1.js";
|
|
2
|
+
import { R as E, a as j, S as k } from "./index-QnWieXQc.js";
|
|
3
|
+
import { BasePlugin as q } from "./core.js";
|
|
4
|
+
import { T as F } from "./index-z_qDGCMT.js";
|
|
5
|
+
import { C as v } from "./CheckBox-Dx3r3LQz.js";
|
|
6
|
+
import { I } from "./InputBox-D2ZRTMFP.js";
|
|
7
|
+
var T = Object.create, p = Object.defineProperty, B = Object.getOwnPropertyDescriptor, b = (t, e) => (e = Symbol[t]) ? e : /* @__PURE__ */ Symbol.for("Symbol." + t), _ = (t) => {
|
|
7
8
|
throw TypeError(t);
|
|
8
9
|
}, C = (t, e, o) => e in t ? p(t, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : t[e] = o, Q = (t, e) => p(t, "name", { value: e, configurable: !0 }), z = (t) => [, , , T(t?.[b("metadata")] ?? null)], D = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], x = (t) => t !== void 0 && typeof t != "function" ? _("Function expected") : t, N = (t, e, o, n, r) => ({ kind: D[t], name: e, metadata: n, addInitializer: (i) => o._ ? _("Already initialized") : r.push(x(i || null)) }), O = (t, e) => C(e, b("metadata"), t[3]), R = (t, e, o, n) => {
|
|
9
10
|
for (var r = 0, i = t[e >> 1], s = i && i.length; r < s; r++) i[r].call(o);
|
|
@@ -176,4 +177,4 @@ R(g, 1, h);
|
|
|
176
177
|
export {
|
|
177
178
|
h as PluginQuickMove
|
|
178
179
|
};
|
|
179
|
-
//# sourceMappingURL=index-
|
|
180
|
+
//# sourceMappingURL=index-CVCy0wPP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DPA1ptYq.js","sources":["../src/plugins/quick-move/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { IPEModal } from '@inpageedit/modal'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickMove: PluginQuickMove\n }\n interface Events {\n 'quick-move/init-options'(payload: {\n ctx: InPageEdit\n options: Partial<QuickMoveOptions>\n }): void\n 'quick-move/show-modal'(payload: { ctx: InPageEdit; modal: IPEModal }): void\n 'quick-move/submit'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n payload: MovePageOptions\n }): void\n }\n interface PreferencesMap {\n 'quickMove.reason': string\n }\n}\n\nexport interface MovePageOptions {\n from: string\n to: string\n reason?: string\n movetalk?: boolean\n movesubpages?: boolean\n noredirect?: boolean\n}\nexport interface QuickMoveOptions extends Partial<MovePageOptions> {\n lockFromField?: boolean\n lockToField?: boolean\n}\n\n@RegisterPreferences(\n Schema.object({\n 'quickMove.reason': Schema.string().default('[IPE-NEXT] Quick move'),\n })\n .description('Quick move options')\n .extra('category', 'editor')\n)\n@Inject(['modal', 'wiki', '$'])\nexport class PluginQuickMove extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-move')\n ctx.set('quickMove', this)\n }\n\n protected start(): Promise<void> | void {\n this.ctx.inject(['toolbox'], (ctx) => {\n this.injectToolbox(ctx)\n })\n }\n\n private injectToolbox(ctx: InPageEdit) {\n const $ = ctx.$\n const curPageName = window.mw?.config.get('wgPageName') || ''\n const canEdit = window.mw?.config.get('wgIsProbablyEditable')\n ctx.toolbox.addButton({\n id: 'quick-move',\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-forms\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3\" />\n <path d=\"M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3\" />\n <path d=\"M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7\" />\n <path d=\"M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1\" />\n <path d=\"M17 12h.01\" />\n <path d=\"M13 12h.01\" />\n </svg>\n ),\n tooltip: () => $`Quick Move`,\n group: 'group1',\n index: 1,\n onClick: () => {\n this.showModal(\n canEdit\n ? {\n lockFromField: true,\n from: curPageName,\n }\n : {}\n )\n },\n })\n }\n\n async showModal(options?: Partial<QuickMoveOptions>) {\n const { $ } = this.ctx\n const reason = await this.ctx.preferences.get('quickMove.reason')\n const modal = this.ctx.modal\n .createObject({\n title: $`Quick Move`,\n content: (<ProgressBar />) as HTMLElement,\n className: 'quick-move 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 movetalk: formData.get('movetalk') === 'on',\n movesubpages: formData.get('movesubpages') === 'on',\n noredirect: formData.get('noredirect') === 'on',\n }\n if (!options.from || !options.to) {\n this.ctx.modal.notify('error', {\n title: $`Failed to move`,\n content: 'From and to are required.',\n })\n return\n }\n this.ctx.emit('quick-move/submit', { ctx: this.ctx, modal, payload: options })\n modal.setLoadingState(true)\n this.movePage(options)\n .then(() => {\n location.reload()\n })\n .catch((error) => {\n modal.setLoadingState(false)\n this.ctx.modal.notify('error', {\n title: $`Failed to move`,\n content: error instanceof Error ? error.message : String(error),\n })\n })\n }}\n >\n <TwinSwapInput\n inputs={[\n {\n label: $`Move from`,\n name: 'from',\n value: options?.from,\n required: true,\n },\n {\n label: $`Move to`,\n name: 'to',\n value: options?.to,\n required: true,\n },\n ]}\n />\n <div>\n <CheckBox name=\"movetalk\" id=\"movetalk\" checked={options?.movetalk}>\n {$`Move talk page`}\n </CheckBox>\n </div>\n <div>\n <CheckBox name=\"movesubpages\" id=\"movesubpages\" checked={options?.movesubpages}>\n {$`Move subpages (up to 100)`}\n </CheckBox>\n </div>\n {this.ctx.wiki.hasRight('suppressredirect') && (\n <div>\n <CheckBox name=\"noredirect\" id=\"noredirect\" checked={options?.noredirect}>\n {$`Move without leaving a redirect`}\n </CheckBox>\n </div>\n )}\n <InputBox\n label={$`Reason`}\n id=\"reason\"\n name=\"reason\"\n value={options?.reason ?? reason ?? ''}\n />\n </form>\n ) as HTMLElement\n )\n\n modal.setButtons([\n {\n label: $`Move`,\n className: 'is-primary is-ghost',\n method: () => {\n formRef?.dispatchEvent(new Event('submit'))\n },\n },\n ])\n\n return modal.show()\n }\n\n async movePage(options: MovePageOptions) {\n const { from, to, reason = '', ...rest } = options\n\n if (!from || !to) {\n throw new Error('From and to titles are required.')\n }\n if (from === to) {\n throw new Error('From and to titles cannot be the same.')\n }\n\n const wikiPage = await this.ctx.wikiPage.newFromTitle(from)\n return wikiPage.moveTo(to, reason, rest)\n }\n}\n"],"names":["_PluginQuickMove_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginQuickMove","BasePlugin","ctx","$","curPageName","canEdit","jsxs","jsx","options","reason","modal","ProgressBar","formRef","el","e","formData","error","TwinSwapInput","CheckBox","InputBox","from","to","rest","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-CVCy0wPP.js","sources":["../src/plugins/quick-move/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { IPEModal } from '@inpageedit/modal'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickMove: PluginQuickMove\n }\n interface Events {\n 'quick-move/init-options'(payload: {\n ctx: InPageEdit\n options: Partial<QuickMoveOptions>\n }): void\n 'quick-move/show-modal'(payload: { ctx: InPageEdit; modal: IPEModal }): void\n 'quick-move/submit'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n payload: MovePageOptions\n }): void\n }\n interface PreferencesMap {\n 'quickMove.reason': string\n }\n}\n\nexport interface MovePageOptions {\n from: string\n to: string\n reason?: string\n movetalk?: boolean\n movesubpages?: boolean\n noredirect?: boolean\n}\nexport interface QuickMoveOptions extends Partial<MovePageOptions> {\n lockFromField?: boolean\n lockToField?: boolean\n}\n\n@RegisterPreferences(\n Schema.object({\n 'quickMove.reason': Schema.string().default('[IPE-NEXT] Quick move'),\n })\n .description('Quick move options')\n .extra('category', 'editor')\n)\n@Inject(['modal', 'wiki', '$'])\nexport class PluginQuickMove extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-move')\n ctx.set('quickMove', this)\n }\n\n protected start(): Promise<void> | void {\n this.ctx.inject(['toolbox'], (ctx) => {\n this.injectToolbox(ctx)\n })\n }\n\n private injectToolbox(ctx: InPageEdit) {\n const $ = ctx.$\n const curPageName = window.mw?.config.get('wgPageName') || ''\n const canEdit = window.mw?.config.get('wgIsProbablyEditable')\n ctx.toolbox.addButton({\n id: 'quick-move',\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-forms\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3\" />\n <path d=\"M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3\" />\n <path d=\"M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7\" />\n <path d=\"M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1\" />\n <path d=\"M17 12h.01\" />\n <path d=\"M13 12h.01\" />\n </svg>\n ),\n tooltip: () => $`Quick Move`,\n group: 'group1',\n index: 1,\n onClick: () => {\n this.showModal(\n canEdit\n ? {\n lockFromField: true,\n from: curPageName,\n }\n : {}\n )\n },\n })\n }\n\n async showModal(options?: Partial<QuickMoveOptions>) {\n const { $ } = this.ctx\n const reason = await this.ctx.preferences.get('quickMove.reason')\n const modal = this.ctx.modal\n .createObject({\n title: $`Quick Move`,\n content: (<ProgressBar />) as HTMLElement,\n className: 'quick-move 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 movetalk: formData.get('movetalk') === 'on',\n movesubpages: formData.get('movesubpages') === 'on',\n noredirect: formData.get('noredirect') === 'on',\n }\n if (!options.from || !options.to) {\n this.ctx.modal.notify('error', {\n title: $`Failed to move`,\n content: 'From and to are required.',\n })\n return\n }\n this.ctx.emit('quick-move/submit', { ctx: this.ctx, modal, payload: options })\n modal.setLoadingState(true)\n this.movePage(options)\n .then(() => {\n location.reload()\n })\n .catch((error) => {\n modal.setLoadingState(false)\n this.ctx.modal.notify('error', {\n title: $`Failed to move`,\n content: error instanceof Error ? error.message : String(error),\n })\n })\n }}\n >\n <TwinSwapInput\n inputs={[\n {\n label: $`Move from`,\n name: 'from',\n value: options?.from,\n required: true,\n },\n {\n label: $`Move to`,\n name: 'to',\n value: options?.to,\n required: true,\n },\n ]}\n />\n <div>\n <CheckBox name=\"movetalk\" id=\"movetalk\" checked={options?.movetalk}>\n {$`Move talk page`}\n </CheckBox>\n </div>\n <div>\n <CheckBox name=\"movesubpages\" id=\"movesubpages\" checked={options?.movesubpages}>\n {$`Move subpages (up to 100)`}\n </CheckBox>\n </div>\n {this.ctx.wiki.hasRight('suppressredirect') && (\n <div>\n <CheckBox name=\"noredirect\" id=\"noredirect\" checked={options?.noredirect}>\n {$`Move without leaving a redirect`}\n </CheckBox>\n </div>\n )}\n <InputBox\n label={$`Reason`}\n id=\"reason\"\n name=\"reason\"\n value={options?.reason ?? reason ?? ''}\n />\n </form>\n ) as HTMLElement\n )\n\n modal.setButtons([\n {\n label: $`Move`,\n className: 'is-primary is-ghost',\n method: () => {\n formRef?.dispatchEvent(new Event('submit'))\n },\n },\n ])\n\n return modal.show()\n }\n\n async movePage(options: MovePageOptions) {\n const { from, to, reason = '', ...rest } = options\n\n if (!from || !to) {\n throw new Error('From and to titles are required.')\n }\n if (from === to) {\n throw new Error('From and to titles cannot be the same.')\n }\n\n const wikiPage = await this.ctx.wikiPage.newFromTitle(from)\n return wikiPage.moveTo(to, reason, rest)\n }\n}\n"],"names":["_PluginQuickMove_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginQuickMove","BasePlugin","ctx","$","curPageName","canEdit","jsxs","jsx","options","reason","modal","ProgressBar","formRef","el","e","formData","error","TwinSwapInput","CheckBox","InputBox","from","to","rest","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|