lunule
February 11, 2024, 5:24am
1
Hi Fellow Obsidian Friends,
Nothing really special, just a snippet that might help other folks working on their own custom folder structures, project homepages, and Dataview queries.
I found a similar topic (list all canvas files), but what I needed was specifically listing all canvas files from a specific folder .
It took me an hour to make Dataview’s dataviewjs query type do what I asked:
```dataviewjs
const moodFolderFiles = app.vault.getFiles()
.filter( (file) => {
return (
file.path.includes('MOODBOARDS') &&
file.path.includes('.canvas')
)
})
.map( (file) => {
const matches = file.name.match(/([^/]+)\.canvas$/)
return dv.fileLink(file.name, false, (matches ? matches[1] : file.name))
});
dv.list(dv.array(moodFolderFiles).sort(l => l.display, 'desc'));
```
If you have some ideas, suggestions on improving the snippet, I welcome all shares.
5 Likes
Thank you. Bewen bugging me for a while. Worked a treat.
1 Like
nil
February 23, 2024, 12:57pm
3
const canvas = (app.vault.getFiles().filter(file => file.extension === 'canvas')).sort((a, b) => a.name.localeCompare(b.name));;
dv.list(canvas.map(file => dv.fileLink(file.path)))
here’s an alternative
2 Likes
Trel567
December 11, 2024, 1:18pm
4
one more way to do this, it will organize it by folder
const canvas = app.vault.getFiles()
.filter(file => file.extension === 'canvas')
.sort((a, b) => a.name.localeCompare(b.name));
// Group files by folders
const groupedByFolder = {};
canvas.forEach(file => {
const folder = file.path.split('/').slice(0, -1).join('/') || 'Root directory';
if (!groupedByFolder[folder]) {
groupedByFolder[folder] = [];
}
groupedByFolder[folder].push(file);
});
// Display folders and links to canvases
for (const folder in groupedByFolder) {
dv.header(3, folder); // Folder name as a level 3 header
dv.list(groupedByFolder[folder].map(file => dv.fileLink(file.path)));
}