%% date:: [[2022-09-22]] %% # [[Dataviewjs]] [[Obsidian Dataview|Dataview]] also has a [[JavaScript]] API for creating queries called Dataviewjs, and it is significantly more extensible than using the Dataview Query Language. ### Return based on custom fields >```dataviewjs >dv.table(["NPC", "Date"], dv.pages('"ForgottenRealms"') > .where(b => b.location == "Neverwinter") > .where(b => b.type == "NPC") > .sort(b => b.file.link) > .map(b => [b.file.link, b.file.cday])) >``` ### Return table of meetings and summaries >```dataviewjs >dv.table(["private/meeting", "Summary"], dv.pages('"private/meeting"') > .where(b => JSON.stringify(b.file.link).includes("k6 Tech Talk ")) > .sort(b => b.file.link) > .map(b => [b.file.link, b.summary])) >``` ### Display all pending tasks from pages with tag #test_task - [ ] Test - [x] Completed Here's the task list: >```dataviewjs >dv.taskList(dv.pages("#test_task").file.tasks > .where(t => !t.completed)) >``` ### Display all tasks with a tag from all pages >```dataviewjs >dv.taskList(dv.pages("").file.tasks > .where(t => t.text.includes("#next")), false) >``` ### Display game sessions that need processing Grouped by campaign (folder) and sorted by `sessionNum`: >```dataviewjs > for (let group of dv.pages('"ttrpgs"').where(p => p.tags === "TVZ").groupBy(c => c.campaign)) { > dv.header(3,group.key); > dv.table(["Session","Date"], > group.rows > .where(p => p.type === "session") > .where(p => p.tags === "TVZ") > .sort(p => p.sessionNum) > .map(p => [p.file.link,p.date])) > } > ``` When rendered: ![[dataviewjs-grouped.png]] ### Display campaigns The following query: - Parses an overall folder called `TTRPGs` and its subfolders - Counts the number of a certain type of notes (`session`) within a campaign - Replaces the *link* text of pages named `World` in a folder with the name of the campaign - Looks for the frontmatter values of the parameters `system`, `role`, and `status` within the `World` page of each folder, and - Displays all of the above in a table. > ```dataviewjs > function getNumOfGames(campaign) { > let numOfGames = app.plugins.plugins.dataview.api > .pages(`"ttrpgs/${campaign}"`) > .where(page => { > if (page.type === 'session') { > if (page.campaign === campaign) { > return true; > } > } > }).length > return numOfGames > } > > dv.table(["Campaign","System","Sessions", "Role","Status"],dv.pages('"ttrpgs"') > .where(b => b.type === "world") > .sort(b => b.status) > .map(b => [dv.fileLink(b.file.path,false,[b.campaign]),b.system,getNumOfGames(b.campaign),b.role,b.status])) > ``` When rendered: ![[dataview-display-campaigns.png]] ### Display tasks due today > ```dataviewjs > dv.taskList(dv.pages().file.tasks > .where(t => !t.completed) > .where(t => t.text.includes("{{date:YYYY-MM-DD}}"))) >``` ### Count number of results returned This returns notes of `type: session` whose filenames start with `2022`: > ```dataview > table length(rows) as Number from "ttrpgs" > where contains(type,"session") and contains(file.name,"2022") > group by type > ```