Skip to content

Commit bbc88b5

Browse files
When creating a file node, you can now create a new file
1 parent 5d765bb commit bbc88b5

File tree

4 files changed

+59
-14
lines changed

4 files changed

+59
-14
lines changed

src/canvas-extensions/better-default-settings-canvas-extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export default class BetterDefaultSettingsCanvasExtension {
5050

5151
switch (this.plugin.settings.getSetting('nodeTypeOnDoubleClick')) {
5252
case 'file':
53-
const file = await new FileSelectModal(this.plugin.app, '.*').awaitInput()
53+
const file = await new FileSelectModal(this.plugin.app, undefined, true).awaitInput()
5454

5555
canvas.createFileNode({
5656
pos: pos,

src/canvas-extensions/commands-canvas-extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export default class CommandsCanvasExtension {
8989
private async createFileNode(canvas: Canvas) {
9090
const size = canvas.config.defaultFileNodeDimensions
9191
const pos = CanvasHelper.getCenterCoordinates(canvas, size)
92-
const file = await new FileSelectModal(this.plugin.app, '.*').awaitInput()
92+
const file = await new FileSelectModal(this.plugin.app, undefined, true).awaitInput()
9393

9494
canvas.createFileNode({ pos: pos, size: size, file: file })
9595
}

src/utils/modal-helper.ts

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import App, { SuggestModal, TFile } from "obsidian"
1+
import App, { SuggestModal, TFile } from 'obsidian'
2+
import * as PathHelper from 'src/utils/path-helper'
23

34
export class FileNameModal extends SuggestModal<string> {
45
parentPath: string
@@ -37,29 +38,70 @@ export class FileNameModal extends SuggestModal<string> {
3738
}
3839
}
3940

40-
export class FileSelectModal extends SuggestModal<TFile> {
41-
files: TFile[]
41+
export class FileSelectModal extends SuggestModal<string> {
42+
files: string[]
43+
suggestNewFile: boolean
4244

43-
constructor(app: App, extensionsRegex: string) {
45+
constructor(app: App, extensionsRegex?: RegExp, suggestNewFile: boolean = false) {
4446
super(app)
4547

46-
this.files = this.app.vault.getFiles().filter(f => f.path.match(new RegExp(extensionsRegex)))
48+
this.files = this.app.vault.getFiles()
49+
.map(file => file.path)
50+
.filter(path => PathHelper.extension(path)?.match(extensionsRegex ?? /.*/))
51+
this.suggestNewFile = suggestNewFile
52+
53+
this.setPlaceholder('Type to search...')
54+
this.setInstructions([{
55+
command: '↑↓',
56+
purpose: 'to navigate'
57+
}, {
58+
command: '↵',
59+
purpose: 'to open'
60+
}, {
61+
command: 'shift ↵',
62+
purpose: 'to create'
63+
}, {
64+
command: 'esc',
65+
purpose: 'to dismiss'
66+
}])
67+
68+
this.scope.register(['Shift'], 'Enter', ((e) => {
69+
this.onChooseSuggestion(this.inputEl.value, e)
70+
this.close()
71+
}))
4772
}
4873

49-
getSuggestions(query: string): TFile[] {
50-
return this.files
51-
.filter(f => f.name.toLowerCase().includes(query.toLowerCase()))
74+
getSuggestions(query: string): string[] {
75+
const suggestions = this.files.filter(path => path.toLowerCase().includes(query.toLowerCase()))
76+
if (suggestions.length === 0 && this.suggestNewFile) suggestions.push(query)
77+
78+
return suggestions
5279
}
5380

54-
renderSuggestion(file: TFile, el: HTMLElement) {
55-
el.setText(file.extension === 'md' ? file.basename : file.name)
81+
renderSuggestion(path: string, el: HTMLElement) {
82+
const simplifiedPath = path.replace(/\.md$/, '')
83+
el.setText(simplifiedPath)
5684
}
5785

58-
onChooseSuggestion(_file: TFile, _evt: MouseEvent | KeyboardEvent) {}
86+
onChooseSuggestion(_path: string, _evt: MouseEvent | KeyboardEvent) {}
5987

6088
awaitInput(): Promise<TFile> {
6189
return new Promise((resolve, _reject) => {
62-
this.onChooseSuggestion = (file: TFile) => { resolve(file) }
90+
this.onChooseSuggestion = (path: string, _evt: MouseEvent | KeyboardEvent) => {
91+
const file = this.app.vault.getAbstractFileByPath(path)
92+
93+
if (file instanceof TFile) {
94+
resolve(file)
95+
return
96+
}
97+
98+
if (!this.suggestNewFile) return
99+
100+
if (PathHelper.extension(path) === undefined) path += '.md'
101+
const newFile = this.app.vault.create(path, '')
102+
resolve(newFile)
103+
}
104+
63105
this.open()
64106
})
65107
}

src/utils/path-helper.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function extension(path: string): string | undefined {
2+
return path.includes('.') ? path.split('.').pop() : undefined
3+
}

0 commit comments

Comments
 (0)