%%
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
> ```