this is my weekly statistic graph
Iām trying to build the DataviewJS query. That is extracting the vault path and building the full path for image by combining YAML Header where I have only name of the image with extension as string
YAML Header
name: Original
number: 1
image: "image12.jpg"
sphere: Earth
DataviewJS query
dataviewjs
//@ts-ignore
let adapter = app.vault.adapter;
// VAULT PATH
const vault = adapter.getBasePath();
// PATH WHERE I HAVE IMAGES
const vault_images = vault + "/Resources/Images/"
const pages =
dv.pages()
.where(b => b.file.frontmatter.sphere === 'Earth')
.sort(b => b.file.frontmatter.number)
.array()
.map(({file}) => {
// PROBLEMATIC LINE
return ["",file.name, file.frontmatter.number]
})
dv.table(["Image", "Name", "Number"], pages)
Result
It gives me the table of all items, but there is just one image propery for all records. It looks like it is giving me all images as object.
I will really appreciate somebody who can help me to adjust the code
Love it
SHOW IMAGE BASED ON YAML PARAMETER
IMAGE FILE: base_color.jpg
Note
---
date:
image: color
tags:
---
dataviewjs
const prefix = "base" /// image prefix
const ext = ".jpg" /// image extension
const size = "200" /// image size
const cover = "![[" + prefix + "_" + dv.current().image + ext + "|" + size + "]]"
dv.paragraph(cover)
I am using $=dv.pages().length
in a vault info bar to show the total number of files in the vault but I want to also have a inline snipped that shows the number of files modified today, what code would I use?
- You could use the following Inline DataviewJS Query.
### inDVJS10
QTY_modified_today=`$=dv
.pages()
.where((page) => page.file.mday.toFormat("yyyy-MM-dd") === dv.func.date("today").toFormat("yyyy-MM-dd")).length;`
Topic
Summary
- How to filter the data by the filename of a link from the Markdown files with the
case_YAML_Y-YYY
structure?
Structures: case_YAML_Y-YYY
Summary
TIP:
1.AoH in the topic means an Array of Hashes.
2.Hashes in the topic means JavaScript Objects.
Definitions:
Structure Code: case_YAML_Y-YYY
Definitions: Use nested YAML fields, where a single root YAML field which is an Array of Hashes consists of
at least one Hash, which is represented by sub YAML fields ā-YYYā.YAML: Use YAML.
Y: a single root YAML field which is an Array of Hashes
-YYY: at least one Hash, which is represented by sub YAML fields ā-YYYāThe first sub YYY, an element of the root Y, consists of multiple key/value pairs, as known as a Hash.
The second sub YYY, an element of the root Y, consists of multiple key/value pairs, as known as a Hash.Data Structure: an AoH
Original Structure Code expressed in regular expressions: case_YAML_Y(-YYY){1,}
Basic Example: The AoH drinks
consists of two elements with the data type of a Hash.
NOTE:
Take the following filedb_20220110
as an example.
Y: drinks, which is an AoH
-YYY: The first sub YYY, an element of the root Y, contains multiple key/value pairs, as known as a Hash.
-YYY: The second sub YYY, an element of the root Y, contains multiple key/value pairs, as known as a Hash.
```yaml
---
Date: 2022-01-10
drinks:
# The first sub YYY
- item_name: "Black Coffee"
unit_price: 120
caffeine_content: 300
item_no: "IT001"
# The second sub YYY
- item_name: "Green Tea"
unit_price: 100
caffeine_content: 200
item_no: "IT002"
---
```
Basic Example: The AoH drinks
consists of one element with the data type of a Hash.
NOTE:
Take the following filedb_20220111
as an example.
Y: drinks, which is an AoH
-YYY: The first sub YYY, an element of the root Y, contains multiple key/value pairs, as known as a Hash.
```yaml
---
Date: 2022-01-11
drinks:
# The first sub YYY
- item_name: "Apple Juice"
unit_price: 110
caffeine_content: 0
item_no: "IT003"
---
```
Notes:
Summary
Q1: What is the data structure of the file dic_19920301
?
Summary_Q1
Original Example: Q1 (To be explained)
NOTE:
Take the following filedic_19920301
as an example.
```yaml
---
date: 1992-03-01
purchases:
- store: "[[some store]]"
item: some item
comments: comments
- store: "[[another store]]"
item: another item
comments: other comments
---
```
A1:
Another Example: A1_11 (Before using FLATTEN)
NOTE:
Before runningFLATTEN purchases AS OnePurchase
, the fieldpurchases
in the page, is an AoH as shown below.
- Here is a slice of the
page
hash, where thepage.file.name
isdic_19920301
.
```JSON
{
date: "1992-03-01T00:00:00.000Z",
purchases: [
{
store: "[[some store]]",
item: "some item",
comments: "comments",
},
{
store: "[[another store]]",
item: "another item",
comments: "other comments",
},
],
}
```
Another Example: A1_12 (After using FLATTEN)
NOTE:
After runningFLATTEN purchases AS OnePurchase
, theOnePurchase
in the page is a Hash as shown below.
- Here is a slice of the
page
hash, where thepage.file.name
isdic_19920301
.
```JSON
[
{
date: "1992-03-01T00:00:00.000Z",
OnePurchase: {
store: "[[some store]]",
item: "some item",
comments: "comments",
},
purchases: [
{
store: "[[some store]]",
item: "some item",
comments: "comments",
},
{
store: "[[another store]]",
item: "another item",
comments: "other comments",
},
],
},
{
date: "1992-03-01T00:00:00.000Z",
OnePurchase: {
store: "[[another store]]",
item: "another item",
comments: "other comments",
},
purchases: [
{
store: "[[some store]]",
item: "some item",
comments: "comments",
},
{
store: "[[another store]]",
item: "another item",
comments: "other comments",
},
],
},
]
```
Q2: What is the data structure of the file dic_19920601
?
Summary_Q2
Original Example: Q2 (To be explained)
NOTE:
- Take the following file
dic_19920601
as an example.- The
purchases
in the page is a Hash.
```yaml
---
date: 1992-06-01
purchases:
- store: "[[some store]]"
item: some item
comments: comments
---
```
A2_21:
Another Example: A2_21
- Here is a slice of the
page
hash, where thepage.file.name
isdic_19920601
.
```JSON
{
date: "1992-06-01T00:00:00.000Z",
purchases: [
{
store: "[[some store]]",
item: "some item",
comments: "comments",
},
],
}
```
Test
Summary
- dataview: v0.5.55
Input
Summary
dictionary files: for the DQL10
- Location: ā100_Project/02_dataview/Q17_Purchases/Q17_test_dataā
folder: 03_an_AoH_consists_of_two_hashes
- filename :
dic_19920301
---
date: 1992-03-01
purchases:
- store: "[[some store]]"
item: some item
comments: comments
- store: "[[another store]]"
item: another item
comments: other comments
---
folder: 04
- filename :
dic_19920401
---
date: 1992-04-01
purchases:
- store: "[[some store]]"
item: apples
comments:
- store: "[[some store]]"
item: oranges
comments:
---
folder: 05
- filename :
dic_19920501
---
date: 1992-05-01
purchases:
- store: "[[another store]]"
item: potatoes, potatoes
comments:
- store: "[[another store]]"
item: a very big watermelon
comments:
---
folder: 06_an_AoH_consists_of_one_hash
- filename :
dic_19920601
---
date: 1992-06-01
purchases:
- store: "[[some store]]"
item: some item
comments: comments
---
folder: 07_an_AoH_contains_one_empty_hash
- filename :
dic_19920701
---
date: 1992-07-01
purchases:
- store: "[[some store]]"
item: some item
comments: comments
- store:
item:
comments:
---
folder: 08_null
- filename :
dic_19920801
---
date: 1992-08-01
purchases:
- store:
item:
comments:
---
- filename :
dic_19920806
---
date: 1992-08-06
purchases:
---
folder: 09_undefined
- filename :
dic_19920901
---
date: 1992-09-01
---
folder: 10_excluding_store_not_link
- filename :
dic_19921001
---
date: 1992-10-01
purchases:
- store: "another store"
item: another item
comments: comments
---
DQL10_filter_by_filename_of_a_link_and_TABLE: case_YAML_Y-YYY
Summary
Main DQL
Code Name | Data type | Group By | Purposes | Remark |
---|---|---|---|---|
DQL10 _filter_by_filename _of_a_link _and_TABLE |
OnePurchase.store :a link |
no | 1.To filter by purchases 2.To split up a list purchases into each individual element OnePurchase 3.To filter by OnePurchase and OnePurchase.store 4.To define a field variable s_filename_of_link 5.To filter by s_filename_of_link 6.To sort by date in descending order 7.To display the result as a table |
NOTE: Require the files with the case_YAML_Y-YYY structureThe Regular Expression in the DQL10 is based on the DQL10 in the following topic. - Solutions: by Justdoitcc |
Code DQL10_filter_by_filename_of_a_link_and_TABLE: case_YAML_Y-YYY
Summary_code
title: DQL10_filter_by_filename_of_a_link_and_TABLE =>0.Require the files with the `case_YAML_Y-YYY` structure 1.To filter by `purchases` 2.To split up a list `purchases` into each individual element `OnePurchase` 3.To filter by `OnePurchase` and `OnePurchase.store` 4.To define a field variable `s_filename_of_link` 5.To filter by `s_filename_of_link` 6.To sort by `date` in descending order 7.To display the result as a table
collapse: close
icon:
color:
```dataview
TABLE WITHOUT ID
file.link AS "File",
OnePurchase.store AS "store",
OnePurchase.item AS "item",
OnePurchase.comments AS "comments",
s_filename_of_link AS "filename_of_store"
FROM "100_Project/02_dataview/Q17_Purchases/Q17_test_data"
WHERE purchases
FLATTEN purchases AS OnePurchase
WHERE OnePurchase AND OnePurchase.store
FLATTEN regexreplace(meta(OnePurchase.store).path, "^(.*/)(.+)(\.md)$", "$2") AS s_filename_of_link
WHERE contains(s_filename_of_link, "another store")
SORT date DESC
```
Screenshots(DQL10)
Reference
Summary
Q88_Linksļ¼Regular Expressions
- Q88_Links: Solutions
```dataview
FLATTEN regexreplace(meta(up).path, "^(.*/)(.+)(\.md)$", "$2") AS s_filename_of_link
```
YAML to JSON converters
YAML Formatters
Oh! I didnāt know this is possible!
Thatās why I developed my plugin āTable to CSV Exporterā.
I just started using Obsidian a few days ago as a daily journal and finally got my first dataviewjs query working this morning!
Itās nothing too fancy, especially compared to the query in the OP of this thread, but I just wanted to share my little success. My query creates a table of people mentioned in my daily notes, sorted by most recent mention, a count of mentions, and shows me their relationship to me (friend, family, work).
The thing that made this a bit complicated to setup (for me as a newbie) was that I wanted it be completely automatic and not require any manual editing of YAML. I initially had a field in each personās note that I would have had to update with the date of our last meetup, but instead I found a way to get the latest daily note and use that as the date.
I also originally had a field for relationship, but since I already had everything set up in folders I figured that there might be a way to inherit that directly from the folder structure, and there was.
So here is what the end result looks likeā¦
In my fault I have a folder called āPeopleā and sub-folders in it that have an individual note for every person like this:
And my query gives me this table:
// Get the latest daily note mentioning this person. Daily notes must be named so that most recent is latest alphabetically.
function latestDailyNote(k) {
let notes = k.file.inlinks;
notes = notes.map(n => dv.page(n));
notes = notes.where(n => n.file.folder == "Daily Journal");
notes = notes.map(n => n.file.name);
notes = notes.sort(n => n,'desc');
return notes[0];
}
dv.table(["Name", "Relationship", "Mentions", "Last Mention"], dv.pages('"People"')
.where(p => !p.file.link.equals(dv.current().file.link)) // Must use equals(), == fails because not both strings?
.sort(p => latestDailyNote(p), 'desc')
.map(p => [
p.file.link,
p.file.folder.split("/")[p.file.folder.split("/").length-1],
p.file.inlinks.length,
latestDailyNote(p)]))
Iāve probably written this in an unnecessarily convoluted way as I have zero experience in javascript. Iām just happy that the thing actually works, but would welcome any improvements, especially ones that might make it more efficient.
One thing that caused me a lot of problems in particular was working with links. It seems that links donāt necessary sort by the text of the link. Does anyone know how an array of links is sorted? In the end I settled for using dv.page to get the page of the link and then file.name to get the text of the link and sorting on that.
Iām trying to do a dv.table without the counts in the headers.
Anyone has an idea how to do so? Iām seeing
https://github.com/blacksmithgu/obsidian-dataview/search?q=values.length
and it appears there is no configuration option. At the same time, I see many people posting screenshots of examples where there are no counters in the headers.
See here:
Generated like this:
---
title: Meetings
days: -10
---
# Upcoming Meetings
```dataviewjs
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
function sortDate(a, b) {
return new Date(a) < new Date(b);
}
function padTo2Digits(num) {
return num.toString().padStart(2, '0');
}
function formatDate(date) {
date.setHours(0, 0, 0, 0);
return [
date.getFullYear(),
padTo2Digits(date.getMonth() + 1),
padTo2Digits(date.getDate()),
].join('-');
}
let pg = dv.current();
let pages = dv.pages("#meeting")
.where(p =>
p.date
&& p.file.name != pg.file.name
&& new Date().addDays(pg.days) <= new Date(p.date)
)
.sort(p => p.date, "desc", sortDate)
;
for (let group of pages.groupBy(
b => formatDate(new Date(b.date))
)
) {
dv.table(
[group.key, "Meeting"],
group.rows
.map(k => [ k.date, k.file.link ]
)
);
}
Iām sure this is stupidly easy question but Iām a javascript novice and Iāve been working an (unrelated) update all night. Googling skills havenāt helped, so can someone assist?
I have an inline dataviewjs script and all I want to do is a case-insensitive string compare. In straight dataview Iāve been doing this: WHERE contains(lower(muddle),āblargā)
where āmuddleā is defined in YAML.
In my inline dataviewjs script I have .where( k => k.muddle == āblargā) which works as long as the case fully matches but I havenāt been able to force āk.muddleā to lowercase. toLowerCase, lower, etc. have been tried as a result of google searches.
Trying to get some magic with Dashboard++ā¦
Help? Thanks!
Topic
Summary
- How to hide the file count in
the_nth_of_table
dataview table? - How to hide the file count in each dataview table?
Using DVJS
Summary_DVJS
Hide the file count in the the_nth_of_table
dataview table
```JS
// M91. hide the file count in the `the_nth_of_table` dataview table :
// #####################################################################
let the_nth_of_table = 2;
this.container.querySelectorAll(
".table-view-table tr:first-of-type th:first-of-type > span.small-text"
)[the_nth_of_table - 1].style.visibility = "hidden";
```
Hide the file count in each dataview table
```JS
// M99. hide the file count in each dataview table :
// #####################################################################
let css_Lists = this.container.querySelectorAll(
".table-view-table tr:first-of-type th:first-of-type > span.small-text"
);
for (let i = 0; i < css_Lists.length; i++) {
css_Lists[i].style.visibility = "hidden";
}
```
Using CSS snippet
Summary_CSS
```CSS
// C99. hide the file count in each dataview table :
// #####################################################################
.dataview.small-text {
display: none;
}
```
Reference
Summary
- DVJS: DVJS10,DVJS20, DVJS30
- css snippet: Solutions by mnvwvnm
Topic
Summary
- How to use
dv.func.contains
in a case-sensitive string comparison? - How to use
dv.func.icontains
in a case-insensitive string comparison?
Test
Summary
- dataview: v0.5.46
Input
Summary
dictionary files:
- Location: ā100_Project/01_dataviewjs/01_by_example/Q84_Contains/Q84_test_dataā
folder: 03
- filename :
dic_19850301
---
Date: 1985-03-01
muddle: BLARG123 abc
---
folder: 04
- filename :
dic_19850401
---
Date: 1985-04-01
muddle: BLARG abc
---
folder: 05
- filename :
dic_19850501
---
Date: 1985-05-01
muddle: blarg456 abc
---
folder: 06
- filename :
dic_19850601
---
Date: 1985-06-01
muddle: blarg abc
---
DVJS10_icontains_and_TABLE
Summary
Main DVJS
Code Name | Data type | Group By | Purposes | Remark |
---|---|---|---|---|
DVJS10_icontains_and_TABLE |
muddle :a string |
no | 1.To filter by muddle(An existence check) 2.To filter by muddle(case-insensitive) 3.To display the result as a table |
Notes
Summary
The same codes:
- To filter by muddle(case-insensitive)
Original Example10: DVJS
```JS
.where((page) => dv.func.contains(page.muddle.toLowerCase(), "blarg"))
```
Another Example11: DVJS
```JS
.where((page) => dv.func.contains(dv.func.lower(page.muddle), "blarg"))
```
Another Example12: DVJS
```JS
.where((page) => dv.func.icontains(page.muddle, "blarg"))
```
Another Example21: DQL
```SQL
WHERE contains(lower(muddle), "blarg")
```
Another Example22: DQL
```SQL
WHERE icontains(muddle, "blarg")
```
Code DVJS10_icontains_and_TABLE
Summary_code
title: DVJS10_icontains_and_TABLE =>1.To filter by muddle(An existence check) 2.To filter by muddle(case-insensitive) 3.To display the result as a table
collapse: close
icon:
color:
```dataviewjs
// M11. define pages: gather relevant pages
// #####################################################################
let pages = dv
.pages(
'"100_Project/01_dataviewjs/01_by_example/Q84_Contains/Q84_test_data"'
)
.where((page) => page.muddle)
.where((page) => dv.func.contains(page.muddle.toLowerCase(), "blarg"));
//.sort((page) => page.file.name, "desc");
// M31.Output :
// #####################################################################
//dv.header(2, "pp"); //org
dv.table(
["File", "muddle"],
pages.map((page) => [page.file.link, page.muddle])
);
Screenshots(DVJS10):
Thanks! That solved it. I can see Iām going to need a JavaScript course. Most of my coding was 10+ years ago and in C, C++ or Perl 5. Rust, so much rustā¦
I modified your countdown method, adding a dateDiff method using Mordredās answer from this stackoverflow question. Now the table shows that their birthday date is 1 month(s) 20 Day(s) away.
var start = moment().startOf('day');
var end = moment(start).add(dv.current().duration);
var dateformat = "YYYY-MM-DD";
if (dv.current().dateformat) { dateformat = dv.current().dateformat; }
// info text above table, {0}=duration, {1}=start date, {2}=end date
// parameters can be left out, or the string empty
var infotext = "Upcoming birthdays for {0} from now ({1} ā {2})<br><br>";
//======================================================================
function nextBirthday(birthday) {
// Get personās next birthday on or after "start"
// returns a moment
// need to "unparse" because DV has already converted YAML birthday to DateTime object
// shouldnāt harm if already a string
var bday = moment(birthday.toString());
var bdayNext = moment(bday).year(start.year());
if (bdayNext.isBefore(start, 'day')) {
bdayNext.add(1, "year");
}
return bdayNext;
}
function turns(birthday) {
// Get the age in years a person will turn to on their next birthday
// need to "unparse" because DV has already converted YAML birthday to DateTime object
// shouldnāt harm if already a string
var bday = moment(birthday.toString());
return nextBirthday(birthday).diff(bday, 'years');
}
function dateDiff(startingDate, endingDate) {
let startDate = new Date(new Date(startingDate).toISOString().substr(0, 10));
if (!endingDate) {
endingDate = new Date().toISOString().substr(0, 10); // need date in YYYY-MM-DD format
}
let endDate = new Date(endingDate);
if (startDate > endDate) {
const swap = startDate;
startDate = endDate;
endDate = swap;
}
const startYear = startDate.getFullYear();
const february = (startYear % 4 === 0 && startYear % 100 !== 0) || startYear % 400 === 0 ? 29 : 28;
const daysInMonth = [31, february, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let yearDiff = endDate.getFullYear() - startYear;
let monthDiff = endDate.getMonth() - startDate.getMonth();
if (monthDiff < 0) {
yearDiff--;
monthDiff += 12;
}
let dayDiff = endDate.getDate() - startDate.getDate();
if (dayDiff < 0) {
if (monthDiff > 0) {
monthDiff--;
} else {
yearDiff--;
monthDiff = 11;
}
dayDiff += daysInMonth[startDate.getMonth()];
}
return monthDiff + ' Month(s) ' + dayDiff + ' Day(s) away';
}
function countdown(birthday){
var bday = moment(birthday.toString())
const setTime = new Date(bday);
const nowTime = new Date();
const dateDifference = dateDiff(nowTime, setTime);
return dateDifference;
}
function showBirthday(birthday) {
// Determine if this birthday is in the range to be shown
// including the start date, excluding the end date
// because that comes from a duration calculation
// for use with "where", returns true or false
if (birthday) {
// need to "unparse" because DV has already converted YAML birthday to DateTime object
// shouldnāt harm if already a string
var bday = moment(birthday.toString());
var bdayNext = nextBirthday(birthday);
if (bdayNext.isBetween(start, end, 'day', '[)')) {
return true;
} else {
return false;
}
} else {
return false;
}
}
function sortByNextBirthday(a, b) {
// comparator function for "sort"
if (nextBirthday(a).isBefore(nextBirthday(b))) {
return -1;
}
if (nextBirthday(a).isAfter(nextBirthday(b))) {
return 1;
}
// theyāre equal
return 0;
}
//======================================================================
dv.paragraph(infotext.format(moment.duration(dv.current().duration.toString()).humanize(), start.format(dateformat), end.format(dateformat)));
dv.table(
["Name", "Birthday", "Turns", "Countdown"],
dv.pages(dv.current().searchterm)
// use a function to see if this birthday is in range to be shown
.where(p => showBirthday(p.birthday))
// use a comparator function to sort by next birthday
.sort(p => p.birthday, 'asc', sortByNextBirthday)
.map(p => [
p.file.link,
p.birthday ? nextBirthday(p.birthday).format(dateformat) : 'ā',
turns(p.birthday),
countdown(nextBirthday(p.birthday)),
])
);
Hey, thanks for a great JS code. I tried to make it work but i didnt succed.
I put these in the front matter:
birthday: 2000-01-01
#searchterm: "#family or #friends"
searchterm: '"People"'
duration: 1 year
And added the code in another note as a plain text, unfortunate i just see the code but it doesnt run, what did i do wrong?
Thanks.
Hello all, Iām sure this is probably very easy, but Iām a bit new to dataview.
I would like to use dataview to build a table (not a dataview TASK view) that includes a column with the note name and link (the first column) and a column with the text of the first uncomplete task that appears on that page. Iāve been trying all day to figure this out and nothing I do seems to come even close.
Many thanks in advance!
Last july, @Moonbase59 , created a script to list the current hotkeys, and I got news of this today. I discovered that if multiple keys was defined, it didnāt show the alternate keys provided, so I modified the scripts a little.
Modifications I made to script include:
- Allowing for showing multiple keys for a given command
- Simplified the join operations on the modifiers, and allowed for usage of symbols, if one are so inclined
- Changed the second listing to only show commands without a hotkey, and as a result I also removed the hotkey column for that listing
- Provided in-code examples of how to sort on either columns by changing which
.sort()
command is commented or not
With these listing I can now easier find conflicting hotkeys (even if more than two commands use the same key combination), and also easier see commands available for hotkeys.
New variant of Commands vs Hotkeys
### Commands with hotkeys sorted by name
```dataviewjs
function joinModifiers(modifiers, symbols=false) {
return modifiers.join(' ')
.replace('Mod', symbols ? 'ā' : 'CMD')
.replace('Alt', symbols ? 'ā„' : 'OPT')
.replace('Ctrl', symbols ? 'ā' : 'CTRL')
.replace('Shift', symbols ? 'ā§' : 'SHIFT')
}
function getHotkey(arr, highlight=true) {
let hi = highlight ? '**' : '';
let keys = []; // Store all key combinations defined for this command
let currKey = ""
// Find the default key setting for the command, if any
if (arr.hotkeys && arr.hotkeys.length > 0) {
console.log(arr.hotkeys)
for (let aKey of arr.hotkeys) {
keys.push(joinModifiers(aKey.modifiers) + ' ' + aKey.key)
}
}
// Handle custom hotkey setup, with possible multiple assignments
let ck = app.hotkeyManager.customKeys[arr.id];
if (ck) {
// Reset keys array, as custom keys override the default key setting
keys = []
for (let aKey of ck) {
keys.push(hi + joinModifiers(aKey.modifiers) + ' ' + aKey.key + hi)
}
}
return (keys.length != 0) ? keys.join('<br />') : 'none';
}
let cmds = dv.array(Object.entries(app.commands.commands))
.where(v => getHotkey(v[1]) != 'none')
//// Choose your sorting option by changing which line is commented out
.sort(v => v[1].id, 'asc'); // Sorted by the command name
// .sort(v => v[1].id, 'asc'); // Sorted by the descriptive name
//.sort(v => getHotkey(v[1], false), 'asc'); // Sorted by hotkey
dv.paragraph(cmds.length + " hotkeys. " +
"Both 'default' and <strong>'custom'</strong>.<br><br>");
dv.table(["Command", "Name", "Hotkeys"],
cmds.map(v => [
v[1].id,
v[1].name,
getHotkey(v[1]),
])
);
```
### Other available commands with no key assigned
```dataviewjs
function getHotkey(arr, highlight=true) {
let hi = highlight ? '**' : '';
let keys = []; // Store all key combinations defined for this command
let currKey = ""
// Find the default key setting for the command, if any
if (arr.hotkeys && arr.hotkeys.length > 0) {
console.log(arr.hotkeys)
for (let aKey of arr.hotkeys) {
keys.push(aKey.modifiers.join(' ')
.replace('Mod', 'CMD')
.replace('Alt', 'OPT')
.replace('Ctrl', 'CTRL')
.replace('Shift', 'SHIFT')
+ ' ' + aKey.key);
}
}
// Handle custom hotkey setup, with possible multiple assignments
let ck = app.hotkeyManager.customKeys[arr.id];
if (ck) {
// Reset keys array, as custom keys override the default key settings
keys = []
for (let aKey of ck) {
keys.push(hi + aKey.modifiers.join(' ')
.replace('Mod', 'CMD')
.replace('Alt', 'OPT')
.replace('Ctrl', 'CTRL')
.replace('Shift', 'SHIFT')
+ ' ' + aKey.key + hi)
}
}
return (keys.length != 0) ? keys.join('<br />') : 'none';
}
let cmds = dv.array(Object.entries(app.commands.commands))
.where(v => getHotkey(v[1]) == 'none')
//// Choose your sorting option by changing which line is commented out
.sort(v => v[1].id, 'asc'); // Sorted by the command name
// .sort(v => v[1].id, 'asc'); // Sorted by the descriptive name
//.sort(v => getHotkey(v[1], false), 'asc'); // Sorted by hotkey
dv.paragraph(cmds.length + " commands. " +
"Rest of commands which doesn't have any keys assigned to them.<br><br>");
dv.table(["Command", "Name"],
cmds.map(v => [
v[1].id,
v[1].name])
);
```
In the image below you can see the top part of the hotkeys currently defined for me, with some interesting (constructed!) conflicts.
See for example how Cmd P is connected to both opening the command palette, opening a daily note, and open the next daily note. Kind of stupid setup, so I need to fix that soon!
In addition one can see that for the first command, Navigate back, both Cmd Home and Opt ArrowLeft are valid combinations.
Whilst working with this weāve got a FR re-opened, see A way to find which command is bound a specific hotkey, so please show some love to that, to get more attention to issues related to resolving hotkey conflicts, and to locate what a given command does.
I also found a plugin, see forum post in Show only assigned hotkeys - #3 by ichmoimeyo, which could display hotkeys on a visual image of the keyboard. Sadly, itās in the early stages of development, and it doesnāt do the correct thing on Mac (as of today).
This question was also posted in the Help category, and solved there.
is it possible to create a bar chart from sum of different inlinefield ?
İ have a tag logbook and inlinefield games:: I ve been trying this one month now I am using obsidian charts