### Return pending tasks except those in a folder
The query below returns all tasks that are not checked, except those in the folder `templates`.
> ```dataviewjs
> dv.taskList(dv.pages('-"templates"').file.tasks
> .where(t => !t.completed))
> ```
### 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(["Meeting", "Summary"], dv.pages('"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-return-grouped-campaigns.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:
![[dataviewjs-return-list-of-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}}")))
>```
### Parse monster stablocks
To query monsters with statblocks using the [[TTRPG Statblocks plugin]], use this query:
> ```dataviewjs
> dv.table(["Name", "HP", "AC", "CR"], [...window.bestiary].map(([name, monster]) => [dv.fileLink(name), monster.hp, monster.ac, monster.cr]))
> ```
This returns:
![[dataviewjs-statblocks.png]]
### Return a random element from Dataview results
To randomly return one element from a list of Dataview results, you can use a function to select one element from the `dv.pages` array. This can be useful when you want to, for example, return a single NPC from a list of notes with `type: NPC`. This is similar to how the [[Dice roller plugin 1]] can return a random element, but Dice Roller can't parse frontmatter, only tags.
```js
function randomElements(arr, n) {
var result = new Array(n);
var len = arr.length;
if (n > len) throw new RangeError("randomElements: more elements taken than available");
for (var i = len - 1; i >= len - n; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = arr[i];
result[len - i - 1] = arr[j];
arr[i] = arr[j];
arr[j] = temp;
}
return result;
}
dv.list(randomElements(dv.pages('"TTRPGs/Temporary White Circle"')
.where(b => b.type == "NPC")
.where(b => !b.deceased)
.sort(b => b.file.link)
.map(b => b.file.link),1)
);
```
The code above returns this:
![[dataviewjs-random-npc.png]]