(asset: AssetMeta)
| 88 | } |
| 89 | |
| 90 | const renameAsset = async (asset: AssetMeta): Promise<void> => { |
| 91 | if (typeof window.zen.renameAsset !== 'function') return |
| 92 | const ext = asset.name.includes('.') ? asset.name.slice(asset.name.lastIndexOf('.')) : '' |
| 93 | const base = ext ? asset.name.slice(0, -ext.length) : asset.name |
| 94 | const next = await promptApp({ |
| 95 | title: 'Rename asset', |
| 96 | initialValue: base, |
| 97 | okLabel: 'Rename', |
| 98 | validate: (v) => (v.includes('/') ? 'Use only a name' : null) |
| 99 | }) |
| 100 | if (!next) return |
| 101 | const clean = next.trim() |
| 102 | if (!clean || `${clean}${ext}` === asset.name) return |
| 103 | try { |
| 104 | await window.zen.renameAsset(asset.path, `${clean}${ext}`) |
| 105 | await refreshAssets() |
| 106 | } catch (err) { |
| 107 | window.alert(err instanceof Error ? err.message : String(err)) |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | const menuItems = (asset: AssetMeta): ContextMenuItem[] => [ |
| 112 | { label: 'Open', onSelect: () => void openNoteInTab(assetTabPath(asset.path)) }, |
no test coverage detected