@inpageedit/core 0.16.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/InPageEdit.js +2 -2
  2. package/dist/{PluginImagesUsed-BVyvFA1_.js → PluginImagesUsed-DnPDXczO.js} +2 -2
  3. package/dist/{PluginImagesUsed-BVyvFA1_.js.map → PluginImagesUsed-DnPDXczO.js.map} +1 -1
  4. package/dist/{PluginPrefSync-CUKkx4Qk.js → PluginPrefSync-CDTFyM8g.js} +2 -2
  5. package/dist/{PluginPrefSync-CUKkx4Qk.js.map → PluginPrefSync-CDTFyM8g.js.map} +1 -1
  6. package/dist/{PluginStoreApp-CoOAw1fr.js → PluginStoreApp-Bng4DFBZ.js} +2 -2
  7. package/dist/{PluginStoreApp-CoOAw1fr.js.map → PluginStoreApp-Bng4DFBZ.js.map} +1 -1
  8. package/dist/{PluginTemplatesUsed-CdjT1wR4.js → PluginTemplatesUsed-oM_VzfbH.js} +2 -2
  9. package/dist/{PluginTemplatesUsed-CdjT1wR4.js.map → PluginTemplatesUsed-oM_VzfbH.js.map} +1 -1
  10. package/dist/core.js +2 -2
  11. package/dist/{index-BPTMltVf.js → index-1sZXko-X.js} +2 -2
  12. package/dist/{index-BPTMltVf.js.map → index-1sZXko-X.js.map} +1 -1
  13. package/dist/{index-Dm2vgYkZ.js → index-42B3CrSO.js} +2 -2
  14. package/dist/{index-Dm2vgYkZ.js.map → index-42B3CrSO.js.map} +1 -1
  15. package/dist/{index-1tsXE6ax.js → index-BBUv7Lv6.js} +2 -2
  16. package/dist/{index-1tsXE6ax.js.map → index-BBUv7Lv6.js.map} +1 -1
  17. package/dist/{index-BYlcHc-O.js → index-BcTomMXW.js} +3 -3
  18. package/dist/{index-BYlcHc-O.js.map → index-BcTomMXW.js.map} +1 -1
  19. package/dist/{index-bQ0CVu3l.js → index-BllIuJSJ.js} +3 -3
  20. package/dist/{index-bQ0CVu3l.js.map → index-BllIuJSJ.js.map} +1 -1
  21. package/dist/{index-CAtPo7xJ.js → index-Bn6y0Eln.js} +2 -2
  22. package/dist/{index-CAtPo7xJ.js.map → index-Bn6y0Eln.js.map} +1 -1
  23. package/dist/index-C0spLL-i.js +1661 -0
  24. package/dist/index-C0spLL-i.js.map +1 -0
  25. package/dist/{index-DZa9mxN4.js → index-CMmEZcB1.js} +2 -2
  26. package/dist/{index-DZa9mxN4.js.map → index-CMmEZcB1.js.map} +1 -1
  27. package/dist/{index-B32tFyLB.js → index-CN7r2e0P.js} +3 -3
  28. package/dist/{index-B32tFyLB.js.map → index-CN7r2e0P.js.map} +1 -1
  29. package/dist/{index-CVCy0wPP.js → index-CkSHCMRN.js} +2 -2
  30. package/dist/{index-CVCy0wPP.js.map → index-CkSHCMRN.js.map} +1 -1
  31. package/dist/{index-QnWieXQc.js → index-D7rUF8vA.js} +584 -569
  32. package/dist/index-D7rUF8vA.js.map +1 -0
  33. package/dist/{index-ygc4AMy4.js → index-DlCbsA25.js} +3 -3
  34. package/dist/{index-ygc4AMy4.js.map → index-DlCbsA25.js.map} +1 -1
  35. package/dist/{index-C4qm_X_A.js → index-TG_MTC9y.js} +2 -2
  36. package/dist/{index-C4qm_X_A.js.map → index-TG_MTC9y.js.map} +1 -1
  37. package/dist/{index-NWWeW3tX.js → index-mf_pX14E.js} +2 -2
  38. package/dist/{index-NWWeW3tX.js.map → index-mf_pX14E.js.map} +1 -1
  39. package/dist/index.d.ts +37383 -1361
  40. package/dist/index.js +2 -2
  41. package/dist/models/index.js +1 -1
  42. package/dist/plugins/index.js +12 -12
  43. package/dist/services/index.js +1 -1
  44. package/lib/index.umd.js +20 -20
  45. package/lib/index.umd.js.map +1 -1
  46. package/package.json +14 -14
  47. package/dist/index-CYfkwXRf.js +0 -1631
  48. package/dist/index-CYfkwXRf.js.map +0 -1
  49. package/dist/index-QnWieXQc.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-bQ0CVu3l.js","sources":["../src/plugins/plugin-store/schema.ts","../src/plugins/plugin-store/index.tsx"],"sourcesContent":["import Schema from 'schemastery'\n\nexport const PLUGIN_STORE_REGISTRY_MANIFEST_VERSION = 1\n\nexport interface PluginStoreRegistry {\n manifest_version: number\n name: string\n base_url: string\n homepage?: string\n maintainers?: PluginStoreRegistryMaintainer[]\n repository?: PluginStoreRegistryRepository\n packages: PluginStorePackage[]\n}\n\nexport interface PluginStoreRegistryMaintainer {\n name: string\n email?: string\n}\n\nexport interface PluginStoreRegistryRepository {\n type: string\n url: string\n}\n\nexport interface PluginStorePackage {\n id: string\n name: string\n version: string\n description?: string\n author?: string\n license?: string\n loader: PluginStorePackageLoader\n}\n\nexport interface PluginStorePackageLoader {\n kind: 'autoload' | 'module' | 'umd' | 'styles'\n entry?: string\n styles?: string[]\n main_export?: string\n}\n\nexport namespace PluginStoreSchemas {\n export const PackageLoader = new Schema<PluginStorePackageLoader>(\n Schema.object({\n kind: Schema.union(['autoload', 'module', 'umd', 'styles']).required().default('autoload'),\n entry: Schema.string(),\n styles: Schema.array(Schema.string()),\n main_export: Schema.string(),\n })\n )\n\n export const Package = new Schema<PluginStorePackage>(\n Schema.object({\n id: Schema.string().required(),\n name: Schema.string().required(),\n version: Schema.string().required(),\n description: Schema.string(),\n author: Schema.string(),\n license: Schema.string(),\n loader: PackageLoader.required(),\n })\n )\n\n export const RegistryMaintainer = new Schema<PluginStoreRegistryMaintainer>(\n Schema.object({\n name: Schema.string().required(),\n email: Schema.string(),\n })\n )\n\n export const RegistryRepository = new Schema<PluginStoreRegistryRepository>(\n Schema.object({\n type: Schema.string().required(),\n url: Schema.string().required(),\n })\n )\n\n export const Registry = new Schema<PluginStoreRegistry>(\n Schema.object({\n manifest_version: Schema.number().min(PLUGIN_STORE_REGISTRY_MANIFEST_VERSION).required(),\n name: Schema.string().required(),\n base_url: Schema.string().required(),\n homepage: Schema.string(),\n maintainers: Schema.array(RegistryMaintainer),\n repository: RegistryRepository,\n packages: Schema.array(Package).required(),\n })\n )\n}\n","import { InPageEdit, Schema } from '@/InPageEdit'\nimport { ForkScope, Inject } from '@cordisjs/core'\nimport { defineAsyncComponent, type App as VueApp } from 'vue'\nimport { PluginStoreRegistry, PluginStoreSchemas } from './schema'\nimport { AbstractIPEStorageManager } from '@/services/storage/index.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n store: PluginPluginStore\n }\n interface PreferencesMap {\n 'pluginStore.registries': string[]\n 'pluginStore.plugins': { source?: 'online_manifest' | 'npm'; registry: string; id: string }[]\n 'pluginStore.cdnForNpm': string\n }\n interface Events {\n 'plugin-store/registry-fetched'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n }): void\n 'plugin-store/registry-not-found'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/registry-removed'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/plugin-installed'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n // 新安装 or 通过用户配置加载\n by: 'new-added' | 'user-preference'\n }): void\n 'plugin-store/plugin-uninstalled'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n }): void\n }\n}\n\nexport type PluginStoreRegistrySource = 'online_manifest' | 'npm'\n\nconst tryGetGlobalPlugin = (main_export: string) => {\n if (!main_export) return null\n try {\n return main_export\n .split('.')\n .reduce<any>((acc, key) => (acc == null ? acc : acc[key]), globalThis as any)\n } catch {\n return null\n }\n}\n\n/**\n * 解析资源URL\n * @param resourcePath - entry或style路径,可能是相对路径或完整URL\n * @param baseUrl - registry中的base_url,可能是完整URL或相对路径\n * @param registryUrl - registry的URL(必须是绝对URL,作为相对baseUrl时的基准)\n * @returns 解析后的完整URL\n */\nconst resolveResourceUrl = (resourcePath: string, baseUrl: string, registryUrl: string): string => {\n // 完整URL:直接返回\n if (/^https?:\\/\\//i.test(resourcePath)) return resourcePath\n\n // 兜底:规范化一个“带尾斜杠”的 helper\n const ensureSlash = (s: string) => (s.endsWith('/') ? s : s + '/')\n\n // 如果 baseUrl 是完整URL:直接用它当基准(并确保目录语义)\n if (/^https?:\\/\\//i.test(baseUrl)) {\n const normalizedBase = ensureSlash(baseUrl)\n return new URL(resourcePath, normalizedBase).href\n }\n\n // baseUrl 是相对路径(如 './' 或 '/plugins')\n // 先把 baseUrl 相对于 registryUrl 解析成绝对URL\n // 注意:当 baseUrl 是 '/plugins' 这种根相对路径时,new URL 会以 registryUrl 的 origin 作为根。\n const registryAbs = (() => {\n try {\n return new URL(registryUrl).href\n } catch {\n // 极端情况(开发环境传了相对 registry),用页面 origin 兜底\n return new URL(registryUrl, location.origin).href\n }\n })()\n\n const resolvedBaseUrl = new URL(ensureSlash(baseUrl), registryAbs).href\n return new URL(resourcePath, resolvedBaseUrl).href\n}\n\n@Inject(['storage', 'preferences', 'resourceLoader', '$'])\nexport class PluginPluginStore extends BasePlugin {\n // re-export for external usage\n static readonly PluginStoreSchemas = PluginStoreSchemas\n static REGISTRY_INFO_CACHE_TTL = 1000 * 60 * 60 * 24 // 1 day\n static REGISTRY_INFO_STORAGE_NAME = 'plugin-store-registry'\n static REGISTRY_ETAG_STORAGE_NAME = 'psreg-etag'\n private regInfoDB: AbstractIPEStorageManager<PluginStoreRegistry>\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'plugin-store')\n ctx.set('store', this)\n this.regInfoDB = ctx.storage.createDatabase<PluginStoreRegistry>(\n PluginPluginStore.REGISTRY_INFO_STORAGE_NAME,\n PluginPluginStore.REGISTRY_INFO_CACHE_TTL,\n 1,\n 'indexedDB'\n )\n }\n\n protected async start() {\n this._installUserPlugins()\n this._injectPreferenceUI()\n }\n\n private async _installUserPlugins() {\n const prefs = await this.ctx.preferences.get('pluginStore.plugins', [])\n if (!prefs?.length) {\n return\n }\n for (const pref of prefs) {\n this.install(pref.registry, pref.id, pref.source, 'user-preference')\n }\n }\n\n private async _createManagementApp() {\n const ctx = await this.ctx.withInject(['store'])\n const PluginStoreApp = defineAsyncComponent(() => import('./components/PluginStoreApp.vue'))\n const app = createVueAppWithIPE(ctx, PluginStoreApp)\n return app\n }\n\n private async _injectPreferenceUI() {\n const ctx = this.ctx\n const $ = ctx.$\n\n ctx.preferences.defineCategory({\n name: 'plugin-store',\n label: $`Plugin Store`,\n description: $`Plugin Store`,\n index: 90,\n autoGenerateForm: false,\n customRenderer: async ({ onUnmount }) => {\n const container = <div id=\"ipe-plugin-store-preferences-vue\"></div>\n const app = await this._createManagementApp()\n app.mount(container)\n\n onUnmount(() => {\n app.unmount()\n this.ctx.logger.debug('Plugin Store preferences app unmounted')\n })\n\n return (\n <section>\n {container}\n {/* <div className=\"theme-ipe-prose\">\n <hr />\n <div style={{ textAlign: 'center', marginBottom: '1em', fontSize: '0.8em' }}>\n 🚫 DO NOT edit fields below manually 🚫\n </div>\n </div> */}\n </section>\n )\n },\n })\n\n ctx.preferences.registerCustomConfig(\n 'plugin-store',\n Schema.object({\n 'pluginStore.registries': Schema.array(Schema.string())\n .default([\n import.meta.env.PROD\n ? Endpoints.PLUGIN_REGISTRY_URL\n : import.meta.resolve('/src/__mock__/plugin-registry/index.json'),\n ])\n .description($`Registry URLs`)\n .hidden(),\n 'pluginStore.cdnForNpm': Schema.string()\n .description($`CDN to install packages from npm`)\n .default('https://cdn.jsdelivr.net/npm/{{ package }}{{ version ? \"@\" + version : \"\" }}')\n .hidden(),\n 'pluginStore.plugins': Schema.array(\n Schema.object({\n source: Schema.union(['online_manifest', 'npm']).default('online_manifest'),\n registry: Schema.string().required(),\n id: Schema.string().required(),\n })\n )\n .description($`Installed plugins`)\n .default([])\n .hidden(),\n }),\n 'plugin-store'\n )\n }\n\n async showModal() {\n const modal = this.ctx.modal.show({\n title: $`Plugin Store`,\n sizeClass: 'small',\n })\n const container = <section id=\"ipe-plugin-store-vue\"></section>\n modal.setContent(container)\n const app = await this._createManagementApp()\n app.mount(container)\n modal.on(modal.Event.Close, () => {\n app.unmount()\n })\n return modal\n }\n\n private _installedPlugins = new Map<string, Promise<ForkScope<InPageEdit> | null>>()\n async install(\n registry: string,\n id: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n _by: 'new-added' | 'user-preference' = 'new-added'\n ): Promise<ForkScope<InPageEdit> | null> {\n const registryInfo = await this.getRegistryInfo(registry, source)\n if (!registryInfo) {\n this.ctx.logger.warn(`Registry ${registry} not found`)\n return null\n }\n const key = `${registry}#${id}`\n if (this._installedPlugins.has(key)) {\n return (await this._installedPlugins.get(key)) ?? null\n }\n // 2) 把 registry 原始 URL 传进去,供 URL 解析使用\n const scope = this._installOneByRegistryInfo(registry, registryInfo, id)\n this._installedPlugins.set(key, scope)\n const fork = await scope\n if (fork) {\n this.ctx.emit('plugin-store/plugin-installed', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n by: _by,\n })\n }\n return fork\n }\n async uninstall(registry: string, id: string): Promise<boolean> {\n const promise = this._installedPlugins.get(`${registry}#${id}`)\n if (promise === void 0) {\n return true // not installed or already uninstalled\n }\n this._installedPlugins.delete(`${registry}#${id}`)\n const scope = await promise\n if (scope) {\n const disposed = scope.dispose?.() ?? true // disposed successfully\n try {\n const registryInfo =\n (await this.getRegistryCache(registry)) ||\n (await this.getRegistryInfo(registry).catch(() => null))\n if (registryInfo) {\n this.ctx.emit('plugin-store/plugin-uninstalled', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n })\n }\n } catch {}\n return disposed\n }\n return true // not a plugin, just removed from the list\n }\n\n async addToPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n const existed = prefs.some((p) => p.registry === registry && p.id === id)\n if (existed) {\n return true\n }\n prefs.push({ registry, id })\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n async removeFromPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n prefs = prefs.filter((p) => p.registry !== registry || p.id !== id)\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n\n async installAndSetPreference(registry: string, id: string) {\n await this.addToPreferences(registry, id)\n return this.install(registry, id, 'online_manifest', 'new-added')\n }\n async uninstallAndRemovePreference(registry: string, id: string) {\n await this.removeFromPreferences(registry, id)\n return this.uninstall(registry, id)\n }\n\n // 3) 增加 registryUrl 参数\n private async _installOneByRegistryInfo(\n registryUrl: string,\n registryInfo: PluginStoreRegistry,\n id: string\n ): Promise<ForkScope<InPageEdit> | null> {\n const baseUrl = registryInfo.base_url\n const pkg = registryInfo.packages.find((p) => p.id === id)\n if (!pkg) {\n this.ctx.logger.warn(`Package ${id} not found in registry ${registryUrl}`)\n return null\n }\n\n const loader = pkg.loader\n const { kind, entry = 'index.js', styles = [], main_export = null } = loader\n\n // 4) 统一用 resolveResourceUrl 解析入口\n let entryUrl: string | null = null\n if (kind !== 'styles') {\n if (!entry) {\n this.ctx.logger.warn(`Entry url missing for ${id}`, loader)\n return null\n }\n try {\n entryUrl = resolveResourceUrl(entry, baseUrl, registryUrl)\n } catch (e) {\n this.ctx.logger.warn(\n `Failed to resolve entry \"${entry}\" with base \"${baseUrl}\" and registry \"${registryUrl}\"`,\n e\n )\n return null\n }\n }\n\n const datasets = {\n 'data-plugin-registry': registryUrl,\n 'data-plugin-id': id,\n }\n\n let fork: ForkScope<InPageEdit> | null = null\n\n switch (kind) {\n case 'autoload': {\n fork = this.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}`,\n apply: (ctx) => {\n if (!entryUrl) return\n ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n },\n })\n break\n }\n case 'module': {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for module kind, package ${id}`)\n return null\n }\n const apply = await import(/* @vite-ignore */ entryUrl).then(\n (m) => (main_export ? m[main_export] : m.default) ?? m\n )\n if (!apply) {\n this.ctx.logger.warn(`Main export ${main_export} not found in module ${entryUrl}`)\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'umd': {\n let apply = tryGetGlobalPlugin(main_export!)\n if (!apply) {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for umd kind, package ${id}`)\n return null\n }\n await this.ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n apply = tryGetGlobalPlugin(main_export!)\n }\n if (!apply) {\n this.ctx.logger.warn(\n `Main export ${main_export} not found on globalThis after loading ${entryUrl}`\n )\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'styles': {\n // 没有脚本,仅样式。下面统一样式注入逻辑会覆盖\n break\n }\n }\n\n // 5) 统一解析并注入样式(兼容绝对URL与相对 + base_url 的组合)\n if (styles && styles.length > 0) {\n let urls: string[] = []\n try {\n urls = styles.map((u) => resolveResourceUrl(u, baseUrl, registryUrl)).filter(Boolean)\n } catch (e) {\n this.ctx.logger.warn(`Failed to resolve styles for ${id}`, styles, e)\n }\n\n // 确保存在父 fork\n fork ||= this.ctx.plugin({ name: `plugin-store-${registryUrl}-${id}`, apply() {} })\n\n // 在子插件里加载样式,并在卸载时清理\n fork.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}-styles`,\n apply: (ctx) => {\n urls.forEach((u) => ctx.resourceLoader.loadStyle(u, { ...datasets }))\n ctx.on('dispose', () => {\n try {\n urls.forEach((u) => ctx.resourceLoader.removeStyle(u))\n } catch (e) {\n console.info('styles cleanup failed', e)\n }\n })\n },\n })\n }\n\n return fork\n }\n\n validateRegistry(data: any): PluginStoreRegistry {\n return PluginStoreSchemas.Registry(data)\n }\n\n async getRegistryInfo(\n registry: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n noCache = false\n ): Promise<PluginStoreRegistry> {\n try {\n let info: PluginStoreRegistry\n switch (source) {\n case 'online_manifest': {\n info = await this._fetchOnlineRegistryInfo(registry, noCache)\n this.logger.debug('Fetched registry info from online manifest', info)\n this.setRegistryCache(registry, info)\n break\n }\n default: {\n throw new Error(`Unsupported registry source: ${source}`)\n }\n }\n\n return info\n } catch (e) {\n this.ctx.logger.warn('Failed to fetch registry info', e)\n }\n\n const info = await this.getRegistryCache(registry)\n if (!info) {\n this.ctx.emit('plugin-store/registry-not-found', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n throw new Error(`Failed to fetch registry info: ${registry}`)\n }\n return info\n }\n\n private _onlineRegistryQueries = new Map<string, Promise<PluginStoreRegistry>>()\n private async _fetchOnlineRegistryInfo(\n registry: string,\n noCache = false\n ): Promise<PluginStoreRegistry> {\n if (!noCache && this._onlineRegistryQueries.has(registry)) {\n return await this._onlineRegistryQueries.get(registry)!\n }\n const task = async () => {\n const payload: RequestInit = {\n method: 'GET',\n }\n if (noCache) {\n payload.cache = 'no-store'\n }\n const response = await fetch(registry, payload)\n const data = await response.json()\n const validated = this.validateRegistry(data)\n // 成功在线获取并校验后触发事件\n this.ctx.emit('plugin-store/registry-fetched', {\n ctx: this.ctx,\n registry: validated,\n })\n return validated\n }\n const promise = task()\n this._onlineRegistryQueries.set(registry, promise)\n return await promise\n }\n\n private async getRegistryCache(registry: string) {\n const data = await this.regInfoDB.get(registry)\n if (data) {\n try {\n const validated = this.validateRegistry(data)\n return validated\n } catch (e) {\n this.ctx.logger.warn('Invalid cached registry', e, data)\n this.regInfoDB.delete(registry)\n }\n }\n return null\n }\n private async setRegistryCache(registry: string, data: PluginStoreRegistry) {\n return this.regInfoDB.set(registry, data)\n }\n private async deleteRegistryCache(registry: string) {\n await this.regInfoDB.delete(registry)\n this.ctx.emit('plugin-store/registry-removed', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n }\n async clearAllRegistryCaches() {\n await this.regInfoDB.clear()\n this.ctx.logger.debug('All registry caches cleared')\n }\n\n /**\n * 刷新指定 registry 的缓存(重新从网络获取)\n */\n async refreshRegistryCache(registry: string): Promise<PluginStoreRegistry> {\n const data = await this.getRegistryInfo(registry, 'online_manifest', true)\n if (!data) {\n throw new Error(`Failed to refresh registry cache: ${registry}`)\n }\n this.ctx.logger.debug('Registry cache refreshed:', registry)\n return data\n }\n\n /**\n * 刷新所有已配置的 registry 缓存\n */\n async refreshAllRegistryCaches(): Promise<Record<string, PluginStoreRegistry | null>> {\n const registryUrls = (await this.ctx.preferences.get('pluginStore.registries')) || []\n const responses = await Promise.allSettled(\n registryUrls.map((url) => this.refreshRegistryCache(url))\n )\n const results: Record<string, PluginStoreRegistry | null> = {}\n for (const [index, response] of responses.entries()) {\n if (response.status === 'fulfilled') {\n results[registryUrls[index]] = response.value\n } else {\n results[registryUrls[index]] = null\n }\n }\n return results\n }\n}\n"],"names":["PLUGIN_STORE_REGISTRY_MANIFEST_VERSION","PluginStoreSchemas","Schema","_PluginPluginStore_decorators","_init","_a","tryGetGlobalPlugin","main_export","acc","key","resolveResourceUrl","resourcePath","baseUrl","registryUrl","ensureSlash","s","normalizedBase","registryAbs","resolvedBaseUrl","Inject","_PluginPluginStore","BasePlugin","ctx","prefs","pref","PluginStoreApp","defineAsyncComponent","createVueAppWithIPE","$","onUnmount","container","jsx","app","Endpoints","modal","registry","id","source","_by","registryInfo","scope","fork","promise","disposed","p","pkg","loader","kind","entry","styles","entryUrl","e","datasets","apply","m","urls","u","data","noCache","info","payload","validated","registryUrls","responses","url","results","index","response","__decoratorStart","__decorateElement","__runInitializers","PluginPluginStore"],"mappings":"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"}
1
+ {"version":3,"file":"index-BllIuJSJ.js","sources":["../src/plugins/plugin-store/schema.ts","../src/plugins/plugin-store/index.tsx"],"sourcesContent":["import Schema from 'schemastery'\n\nexport const PLUGIN_STORE_REGISTRY_MANIFEST_VERSION = 1\n\nexport interface PluginStoreRegistry {\n manifest_version: number\n name: string\n base_url: string\n homepage?: string\n maintainers?: PluginStoreRegistryMaintainer[]\n repository?: PluginStoreRegistryRepository\n packages: PluginStorePackage[]\n}\n\nexport interface PluginStoreRegistryMaintainer {\n name: string\n email?: string\n}\n\nexport interface PluginStoreRegistryRepository {\n type: string\n url: string\n}\n\nexport interface PluginStorePackage {\n id: string\n name: string\n version: string\n description?: string\n author?: string\n license?: string\n loader: PluginStorePackageLoader\n}\n\nexport interface PluginStorePackageLoader {\n kind: 'autoload' | 'module' | 'umd' | 'styles'\n entry?: string\n styles?: string[]\n main_export?: string\n}\n\nexport namespace PluginStoreSchemas {\n export const PackageLoader = new Schema<PluginStorePackageLoader>(\n Schema.object({\n kind: Schema.union(['autoload', 'module', 'umd', 'styles']).required().default('autoload'),\n entry: Schema.string(),\n styles: Schema.array(Schema.string()),\n main_export: Schema.string(),\n })\n )\n\n export const Package = new Schema<PluginStorePackage>(\n Schema.object({\n id: Schema.string().required(),\n name: Schema.string().required(),\n version: Schema.string().required(),\n description: Schema.string(),\n author: Schema.string(),\n license: Schema.string(),\n loader: PackageLoader.required(),\n })\n )\n\n export const RegistryMaintainer = new Schema<PluginStoreRegistryMaintainer>(\n Schema.object({\n name: Schema.string().required(),\n email: Schema.string(),\n })\n )\n\n export const RegistryRepository = new Schema<PluginStoreRegistryRepository>(\n Schema.object({\n type: Schema.string().required(),\n url: Schema.string().required(),\n })\n )\n\n export const Registry = new Schema<PluginStoreRegistry>(\n Schema.object({\n manifest_version: Schema.number().min(PLUGIN_STORE_REGISTRY_MANIFEST_VERSION).required(),\n name: Schema.string().required(),\n base_url: Schema.string().required(),\n homepage: Schema.string(),\n maintainers: Schema.array(RegistryMaintainer),\n repository: RegistryRepository,\n packages: Schema.array(Package).required(),\n })\n )\n}\n","import { InPageEdit, Schema } from '@/InPageEdit'\nimport { ForkScope, Inject } from '@cordisjs/core'\nimport { defineAsyncComponent, type App as VueApp } from 'vue'\nimport { PluginStoreRegistry, PluginStoreSchemas } from './schema'\nimport { AbstractIPEStorageManager } from '@/services/storage/index.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n store: PluginPluginStore\n }\n interface PreferencesMap {\n 'pluginStore.registries': string[]\n 'pluginStore.plugins': { source?: 'online_manifest' | 'npm'; registry: string; id: string }[]\n 'pluginStore.cdnForNpm': string\n }\n interface Events {\n 'plugin-store/registry-fetched'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n }): void\n 'plugin-store/registry-not-found'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/registry-removed'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/plugin-installed'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n // 新安装 or 通过用户配置加载\n by: 'new-added' | 'user-preference'\n }): void\n 'plugin-store/plugin-uninstalled'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n }): void\n }\n}\n\nexport type PluginStoreRegistrySource = 'online_manifest' | 'npm'\n\nconst tryGetGlobalPlugin = (main_export: string) => {\n if (!main_export) return null\n try {\n return main_export\n .split('.')\n .reduce<any>((acc, key) => (acc == null ? acc : acc[key]), globalThis as any)\n } catch {\n return null\n }\n}\n\n/**\n * 解析资源URL\n * @param resourcePath - entry或style路径,可能是相对路径或完整URL\n * @param baseUrl - registry中的base_url,可能是完整URL或相对路径\n * @param registryUrl - registry的URL(必须是绝对URL,作为相对baseUrl时的基准)\n * @returns 解析后的完整URL\n */\nconst resolveResourceUrl = (resourcePath: string, baseUrl: string, registryUrl: string): string => {\n // 完整URL:直接返回\n if (/^https?:\\/\\//i.test(resourcePath)) return resourcePath\n\n // 兜底:规范化一个“带尾斜杠”的 helper\n const ensureSlash = (s: string) => (s.endsWith('/') ? s : s + '/')\n\n // 如果 baseUrl 是完整URL:直接用它当基准(并确保目录语义)\n if (/^https?:\\/\\//i.test(baseUrl)) {\n const normalizedBase = ensureSlash(baseUrl)\n return new URL(resourcePath, normalizedBase).href\n }\n\n // baseUrl 是相对路径(如 './' 或 '/plugins')\n // 先把 baseUrl 相对于 registryUrl 解析成绝对URL\n // 注意:当 baseUrl 是 '/plugins' 这种根相对路径时,new URL 会以 registryUrl 的 origin 作为根。\n const registryAbs = (() => {\n try {\n return new URL(registryUrl).href\n } catch {\n // 极端情况(开发环境传了相对 registry),用页面 origin 兜底\n return new URL(registryUrl, location.origin).href\n }\n })()\n\n const resolvedBaseUrl = new URL(ensureSlash(baseUrl), registryAbs).href\n return new URL(resourcePath, resolvedBaseUrl).href\n}\n\n@Inject(['storage', 'preferences', 'resourceLoader', '$'])\nexport class PluginPluginStore extends BasePlugin {\n // re-export for external usage\n static readonly PluginStoreSchemas = PluginStoreSchemas\n static REGISTRY_INFO_CACHE_TTL = 1000 * 60 * 60 * 24 // 1 day\n static REGISTRY_INFO_STORAGE_NAME = 'plugin-store-registry'\n static REGISTRY_ETAG_STORAGE_NAME = 'psreg-etag'\n private regInfoDB: AbstractIPEStorageManager<PluginStoreRegistry>\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'plugin-store')\n ctx.set('store', this)\n this.regInfoDB = ctx.storage.createDatabase<PluginStoreRegistry>(\n PluginPluginStore.REGISTRY_INFO_STORAGE_NAME,\n PluginPluginStore.REGISTRY_INFO_CACHE_TTL,\n 1,\n 'indexedDB'\n )\n }\n\n protected async start() {\n this._installUserPlugins()\n this._injectPreferenceUI()\n }\n\n private async _installUserPlugins() {\n const prefs = await this.ctx.preferences.get('pluginStore.plugins', [])\n if (!prefs?.length) {\n return\n }\n for (const pref of prefs) {\n this.install(pref.registry, pref.id, pref.source, 'user-preference')\n }\n }\n\n private async _createManagementApp() {\n const ctx = await this.ctx.withInject(['store'])\n const PluginStoreApp = defineAsyncComponent(() => import('./components/PluginStoreApp.vue'))\n const app = createVueAppWithIPE(ctx, PluginStoreApp)\n return app\n }\n\n private async _injectPreferenceUI() {\n const ctx = this.ctx\n const $ = ctx.$\n\n ctx.preferences.defineCategory({\n name: 'plugin-store',\n label: $`Plugin Store`,\n description: $`Plugin Store`,\n index: 90,\n autoGenerateForm: false,\n customRenderer: async ({ onUnmount }) => {\n const container = <div id=\"ipe-plugin-store-preferences-vue\"></div>\n const app = await this._createManagementApp()\n app.mount(container)\n\n onUnmount(() => {\n app.unmount()\n this.ctx.logger.debug('Plugin Store preferences app unmounted')\n })\n\n return (\n <section>\n {container}\n {/* <div className=\"theme-ipe-prose\">\n <hr />\n <div style={{ textAlign: 'center', marginBottom: '1em', fontSize: '0.8em' }}>\n 🚫 DO NOT edit fields below manually 🚫\n </div>\n </div> */}\n </section>\n )\n },\n })\n\n ctx.preferences.registerCustomConfig(\n 'plugin-store',\n Schema.object({\n 'pluginStore.registries': Schema.array(Schema.string())\n .default([\n import.meta.env.PROD\n ? Endpoints.PLUGIN_REGISTRY_URL\n : import.meta.resolve('/src/__mock__/plugin-registry/index.json'),\n ])\n .description($`Registry URLs`)\n .hidden(),\n 'pluginStore.cdnForNpm': Schema.string()\n .description($`CDN to install packages from npm`)\n .default('https://cdn.jsdelivr.net/npm/{{ package }}{{ version ? \"@\" + version : \"\" }}')\n .hidden(),\n 'pluginStore.plugins': Schema.array(\n Schema.object({\n source: Schema.union(['online_manifest', 'npm']).default('online_manifest'),\n registry: Schema.string().required(),\n id: Schema.string().required(),\n })\n )\n .description($`Installed plugins`)\n .default([])\n .hidden(),\n }),\n 'plugin-store'\n )\n }\n\n async showModal() {\n const modal = this.ctx.modal.show({\n title: $`Plugin Store`,\n sizeClass: 'small',\n })\n const container = <section id=\"ipe-plugin-store-vue\"></section>\n modal.setContent(container)\n const app = await this._createManagementApp()\n app.mount(container)\n modal.on(modal.Event.Close, () => {\n app.unmount()\n })\n return modal\n }\n\n private _installedPlugins = new Map<string, Promise<ForkScope<InPageEdit> | null>>()\n async install(\n registry: string,\n id: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n _by: 'new-added' | 'user-preference' = 'new-added'\n ): Promise<ForkScope<InPageEdit> | null> {\n const registryInfo = await this.getRegistryInfo(registry, source)\n if (!registryInfo) {\n this.ctx.logger.warn(`Registry ${registry} not found`)\n return null\n }\n const key = `${registry}#${id}`\n if (this._installedPlugins.has(key)) {\n return (await this._installedPlugins.get(key)) ?? null\n }\n // 2) 把 registry 原始 URL 传进去,供 URL 解析使用\n const scope = this._installOneByRegistryInfo(registry, registryInfo, id)\n this._installedPlugins.set(key, scope)\n const fork = await scope\n if (fork) {\n this.ctx.emit('plugin-store/plugin-installed', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n by: _by,\n })\n }\n return fork\n }\n async uninstall(registry: string, id: string): Promise<boolean> {\n const promise = this._installedPlugins.get(`${registry}#${id}`)\n if (promise === void 0) {\n return true // not installed or already uninstalled\n }\n this._installedPlugins.delete(`${registry}#${id}`)\n const scope = await promise\n if (scope) {\n const disposed = scope.dispose?.() ?? true // disposed successfully\n try {\n const registryInfo =\n (await this.getRegistryCache(registry)) ||\n (await this.getRegistryInfo(registry).catch(() => null))\n if (registryInfo) {\n this.ctx.emit('plugin-store/plugin-uninstalled', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n })\n }\n } catch {}\n return disposed\n }\n return true // not a plugin, just removed from the list\n }\n\n async addToPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n const existed = prefs.some((p) => p.registry === registry && p.id === id)\n if (existed) {\n return true\n }\n prefs.push({ registry, id })\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n async removeFromPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n prefs = prefs.filter((p) => p.registry !== registry || p.id !== id)\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n\n async installAndSetPreference(registry: string, id: string) {\n await this.addToPreferences(registry, id)\n return this.install(registry, id, 'online_manifest', 'new-added')\n }\n async uninstallAndRemovePreference(registry: string, id: string) {\n await this.removeFromPreferences(registry, id)\n return this.uninstall(registry, id)\n }\n\n // 3) 增加 registryUrl 参数\n private async _installOneByRegistryInfo(\n registryUrl: string,\n registryInfo: PluginStoreRegistry,\n id: string\n ): Promise<ForkScope<InPageEdit> | null> {\n const baseUrl = registryInfo.base_url\n const pkg = registryInfo.packages.find((p) => p.id === id)\n if (!pkg) {\n this.ctx.logger.warn(`Package ${id} not found in registry ${registryUrl}`)\n return null\n }\n\n const loader = pkg.loader\n const { kind, entry = 'index.js', styles = [], main_export = null } = loader\n\n // 4) 统一用 resolveResourceUrl 解析入口\n let entryUrl: string | null = null\n if (kind !== 'styles') {\n if (!entry) {\n this.ctx.logger.warn(`Entry url missing for ${id}`, loader)\n return null\n }\n try {\n entryUrl = resolveResourceUrl(entry, baseUrl, registryUrl)\n } catch (e) {\n this.ctx.logger.warn(\n `Failed to resolve entry \"${entry}\" with base \"${baseUrl}\" and registry \"${registryUrl}\"`,\n e\n )\n return null\n }\n }\n\n const datasets = {\n 'data-plugin-registry': registryUrl,\n 'data-plugin-id': id,\n }\n\n let fork: ForkScope<InPageEdit> | null = null\n\n switch (kind) {\n case 'autoload': {\n fork = this.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}`,\n apply: (ctx) => {\n if (!entryUrl) return\n ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n },\n })\n break\n }\n case 'module': {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for module kind, package ${id}`)\n return null\n }\n const apply = await import(/* @vite-ignore */ entryUrl).then(\n (m) => (main_export ? m[main_export] : m.default) ?? m\n )\n if (!apply) {\n this.ctx.logger.warn(`Main export ${main_export} not found in module ${entryUrl}`)\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'umd': {\n let apply = tryGetGlobalPlugin(main_export!)\n if (!apply) {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for umd kind, package ${id}`)\n return null\n }\n await this.ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n apply = tryGetGlobalPlugin(main_export!)\n }\n if (!apply) {\n this.ctx.logger.warn(\n `Main export ${main_export} not found on globalThis after loading ${entryUrl}`\n )\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'styles': {\n // 没有脚本,仅样式。下面统一样式注入逻辑会覆盖\n break\n }\n }\n\n // 5) 统一解析并注入样式(兼容绝对URL与相对 + base_url 的组合)\n if (styles && styles.length > 0) {\n let urls: string[] = []\n try {\n urls = styles.map((u) => resolveResourceUrl(u, baseUrl, registryUrl)).filter(Boolean)\n } catch (e) {\n this.ctx.logger.warn(`Failed to resolve styles for ${id}`, styles, e)\n }\n\n // 确保存在父 fork\n fork ||= this.ctx.plugin({ name: `plugin-store-${registryUrl}-${id}`, apply() {} })\n\n // 在子插件里加载样式,并在卸载时清理\n fork.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}-styles`,\n apply: (ctx) => {\n urls.forEach((u) => ctx.resourceLoader.loadStyle(u, { ...datasets }))\n ctx.on('dispose', () => {\n try {\n urls.forEach((u) => ctx.resourceLoader.removeStyle(u))\n } catch (e) {\n console.info('styles cleanup failed', e)\n }\n })\n },\n })\n }\n\n return fork\n }\n\n validateRegistry(data: any): PluginStoreRegistry {\n return PluginStoreSchemas.Registry(data)\n }\n\n async getRegistryInfo(\n registry: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n noCache = false\n ): Promise<PluginStoreRegistry> {\n try {\n let info: PluginStoreRegistry\n switch (source) {\n case 'online_manifest': {\n info = await this._fetchOnlineRegistryInfo(registry, noCache)\n this.logger.debug('Fetched registry info from online manifest', info)\n this.setRegistryCache(registry, info)\n break\n }\n default: {\n throw new Error(`Unsupported registry source: ${source}`)\n }\n }\n\n return info\n } catch (e) {\n this.ctx.logger.warn('Failed to fetch registry info', e)\n }\n\n const info = await this.getRegistryCache(registry)\n if (!info) {\n this.ctx.emit('plugin-store/registry-not-found', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n throw new Error(`Failed to fetch registry info: ${registry}`)\n }\n return info\n }\n\n private _onlineRegistryQueries = new Map<string, Promise<PluginStoreRegistry>>()\n private async _fetchOnlineRegistryInfo(\n registry: string,\n noCache = false\n ): Promise<PluginStoreRegistry> {\n if (!noCache && this._onlineRegistryQueries.has(registry)) {\n return await this._onlineRegistryQueries.get(registry)!\n }\n const task = async () => {\n const payload: RequestInit = {\n method: 'GET',\n }\n if (noCache) {\n payload.cache = 'no-store'\n }\n const response = await fetch(registry, payload)\n const data = await response.json()\n const validated = this.validateRegistry(data)\n // 成功在线获取并校验后触发事件\n this.ctx.emit('plugin-store/registry-fetched', {\n ctx: this.ctx,\n registry: validated,\n })\n return validated\n }\n const promise = task()\n this._onlineRegistryQueries.set(registry, promise)\n return await promise\n }\n\n private async getRegistryCache(registry: string) {\n const data = await this.regInfoDB.get(registry)\n if (data) {\n try {\n const validated = this.validateRegistry(data)\n return validated\n } catch (e) {\n this.ctx.logger.warn('Invalid cached registry', e, data)\n this.regInfoDB.delete(registry)\n }\n }\n return null\n }\n private async setRegistryCache(registry: string, data: PluginStoreRegistry) {\n return this.regInfoDB.set(registry, data)\n }\n private async deleteRegistryCache(registry: string) {\n await this.regInfoDB.delete(registry)\n this.ctx.emit('plugin-store/registry-removed', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n }\n async clearAllRegistryCaches() {\n await this.regInfoDB.clear()\n this.ctx.logger.debug('All registry caches cleared')\n }\n\n /**\n * 刷新指定 registry 的缓存(重新从网络获取)\n */\n async refreshRegistryCache(registry: string): Promise<PluginStoreRegistry> {\n const data = await this.getRegistryInfo(registry, 'online_manifest', true)\n if (!data) {\n throw new Error(`Failed to refresh registry cache: ${registry}`)\n }\n this.ctx.logger.debug('Registry cache refreshed:', registry)\n return data\n }\n\n /**\n * 刷新所有已配置的 registry 缓存\n */\n async refreshAllRegistryCaches(): Promise<Record<string, PluginStoreRegistry | null>> {\n const registryUrls = (await this.ctx.preferences.get('pluginStore.registries')) || []\n const responses = await Promise.allSettled(\n registryUrls.map((url) => this.refreshRegistryCache(url))\n )\n const results: Record<string, PluginStoreRegistry | null> = {}\n for (const [index, response] of responses.entries()) {\n if (response.status === 'fulfilled') {\n results[registryUrls[index]] = response.value\n } else {\n results[registryUrls[index]] = null\n }\n }\n return results\n }\n}\n"],"names":["PLUGIN_STORE_REGISTRY_MANIFEST_VERSION","PluginStoreSchemas","Schema","_PluginPluginStore_decorators","_init","_a","tryGetGlobalPlugin","main_export","acc","key","resolveResourceUrl","resourcePath","baseUrl","registryUrl","ensureSlash","s","normalizedBase","registryAbs","resolvedBaseUrl","Inject","_PluginPluginStore","BasePlugin","ctx","prefs","pref","PluginStoreApp","defineAsyncComponent","createVueAppWithIPE","$","onUnmount","container","jsx","app","Endpoints","modal","registry","id","source","_by","registryInfo","scope","fork","promise","disposed","p","pkg","loader","kind","entry","styles","entryUrl","e","datasets","apply","m","urls","u","data","noCache","info","payload","validated","registryUrls","responses","url","results","index","response","__decoratorStart","__decorateElement","__runInitializers","PluginPluginStore"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { j as t } from "./Promise.withResolvers-C4chhLB1.js";
2
- import { R as de, a as ce, S as z } from "./index-QnWieXQc.js";
2
+ import { R as de, a as ce, S as z } from "./index-D7rUF8vA.js";
3
3
  import { BasePlugin as pe } from "./core.js";
4
4
  import { C as ue } from "./CheckBox-Dx3r3LQz.js";
5
5
  import { I as M } from "./IconUpload-Bz4BW_nc.js";
@@ -790,4 +790,4 @@ be(B, 1, W);
790
790
  export {
791
791
  W as PluginQuickUpload
792
792
  };
793
- //# sourceMappingURL=index-CAtPo7xJ.js.map
793
+ //# sourceMappingURL=index-Bn6y0Eln.js.map
@@ -1 +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
+ {"version":3,"file":"index-Bn6y0Eln.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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"}