Algumas buscas Úteis com Dataview & Dataviewjs
📝 Links sem notas criadas.
//-----------------------------------------------------------
// 🧩 DETECTOR DE LINKS NÃO CRIADOS (com exclusões)
//-----------------------------------------------------------
const count = 3;
let d = {};
// 🧱 Pastas a serem ignoradas (adicione aqui outras se quiser)
const ignoredFolders = ["system", "Projects & Areas/Projects/wArchives"];
// Função para verificar se um caminho pertence a alguma pasta ignorada
function isIgnored(path) {
return ignoredFolders.some(folder => path.toLowerCase().includes(folder.toLowerCase()));
}
// Verifica se um link vem de propriedades YAML
function linkInFrontmatter(file, link) {
const cache = app.metadataCache.getCache(file);
if (!cache || !cache.frontmatterLinks) return false;
return cache.frontmatterLinks.some(l => l.link === link);
}
function process(k, v) {
if (isIgnored(k)) return; // Ignorar notas da lista
Object.keys(v).forEach(function (x) {
if (isIgnored(x)) return; // Ignorar links de pastas ignoradas
if (linkInFrontmatter(k, x)) return; // Ignorar links vindos do YAML
if (!d[x]) d[x] = [];
d[x].push(dv.fileLink(k));
});
}
// Filtrar e processar apenas notas válidas
Object.entries(dv.app.metadataCache.unresolvedLinks)
.filter(([k, v]) => !isIgnored(k) && Object.keys(v).length)
.forEach(([k, v]) => process(k, v));
// Gerar tabela final
dv.table(
["Notas não Criadas", "Apontadas por"],
Object.entries(d)
.filter(([k, v]) => v.length >= count)
.sort((a, b) => b[1].length - a[1].length)
.map(([k, v]) => [dv.fileLink(k), v.join(" • ")])
);
📝 @_Garden
🫘Seed | 🌱 Plant | ☘️ Cultivate
🪴 Repot | 🍄 Question | 💦 Revitalize | 🍁 Revisit
TABLE WITHOUT ID
choice(contains(file.tags, "#garden/seed"),
"🫘" + file.link,
choice(contains(file.tags, "#garden/plant"),
"🌱 " + file.link,
choice(contains(file.tags, "#garden/cultivate"),
"☘️ " + file.link,
choice(contains(file.tags, "#garden/question"),
"🍄 " + file.link,
choice(contains(file.tags, "#garden/repot"),
"🪴 " + file.link,
choice(contains(file.tags, "#garden/revitalize"),
"💦 " + file.link,
choice(contains(file.tags, "#garden/revisit"),
"🍁 " + file.link,
file.link))))))) as "Notes",
join(filter(file.tags, (t) => startswith(t, "#garden/")), ", ") as "Tags",
choice(contains(file.folder, "+"),
"`" + file.folder + "`",
regexreplace(file.path, ".*/([^/]+)/[^/]+$", "$1")
) as "Folder"
FROM #garden
WHERE !contains(file.path, "30 Knowlegde/35 Recources/Ideaverse Pro 2") AND !contains(file.path, "System")
AND !contains(file.name, "Master Key (Garden Tags)")
SORT file.mtime DESC
LIMIT 77
📝 @_Architect
🧱 Build | 🪜 Renovate
TABLE WITHOUT ID
choice(contains(file.tags, "#architect/build"),
"🧱 " + file.link,
choice(contains(file.tags, "#architect/renovate"),
"🪜 " + file.link,
file.link)) as "Notes",
join(filter(file.tags, (t) => startswith(t, "#architect/")), ", ") as "Tags",
choice(contains(file.folder, "+"),
"`" + file.folder + "`",
regexreplace(file.path, ".*/([^/]+)/[^/]+$", "$1")
) as "Folder"
FROM #architect and -"30 Knowlegde/35 Recources/Ideaverse Pro 2"
WHERE !contains(file.name, "Master Key (Architect Tags)")
SORT file.mtime DESC
LIMIT 77
📝 Areas
//-----------------------------------------------------
// CONFIGURAÇÃO
//-----------------------------------------------------
const ICONES = {
"OBSIDIAN COMMUNITY": "📚", // basta trocar o nome da pasta e o icone
"YOUTUBE PKM CHANNEL": "📺",
"DEFAULT": "📄"
};
//-----------------------------------------------------
// FUNÇÕES AUXILIARES
//-----------------------------------------------------
function getIcon(folder) {
// Converte pasta e chaves para maiúsculas antes de comparar
const upperFolder = folder.toUpperCase();
const match = Object.keys(ICONES).find(key =>
upperFolder.includes(key.toUpperCase())
);
return ICONES[match] || ICONES.DEFAULT;
}
function formatarIdade(data) {
const diff = Date.now() - data.toJSDate().getTime();
const minutos = diff / 1000 / 60;
if (minutos < 60) return `${Math.floor(minutos)} min`;
if (minutos < 1440) return `${Math.floor(minutos / 60)} h`;
if (minutos < 43200) return `${Math.floor(minutos / 1440)} d`;
if (minutos < 525600) return `${Math.floor(minutos / 43200)} m`;
return `${Math.floor(minutos / 525600)} a`;
}
function estilizarLink(p) {
return `**${dv.fileLink(p.file.path, false, p.file.name)}**`;
}
//-----------------------------------------------------
// COLETA E FILTRO
//-----------------------------------------------------
const pages = dv.pages('"Projects & Areas/Areas"')
.where(p => p.type && p.type == "area_family")
.sort(p => p.file.mtime, 'desc')
.limit(20);
//-----------------------------------------------------
// EXIBIÇÃO
//-----------------------------------------------------
dv.table(
["", "📄", "🕐"],
pages.map(p => [
getIcon(p.file.folder),
estilizarLink(p),
`\`${formatarIdade(p.file.mtime)}\``
])
);
📝 Projetos
//-----------------------------------------------------
// CONFIGURAÇÃO
//-----------------------------------------------------
const ICONES_POR_PRAZO = {
TRANQUILO: "🟢",
ATENCAO: "🟡",
ATRASADO: "🔴",
SEM_DATA: "⚪"
};
//-----------------------------------------------------
// FUNÇÕES AUXILIARES
//-----------------------------------------------------
function getIconPorPrazo(entrega) {
if (!entrega) return ICONES_POR_PRAZO.SEM_DATA;
const hoje = dv.luxon.DateTime.now();
const dEntrega = dv.date(entrega);
const diff = Math.floor(dEntrega.diff(hoje, "days").days);
if (diff < 0) return ICONES_POR_PRAZO.ATRASADO;
if (diff <= 7) return ICONES_POR_PRAZO.ATENCAO;
return ICONES_POR_PRAZO.TRANQUILO;
}
function estilizarLink(p) {
return `**${dv.fileLink(p.file.path, false, p.file.name)}**`;
}
function diasRestantes(entrega) {
if (!entrega) return "-";
const hoje = dv.luxon.DateTime.now();
const dEntrega = dv.date(entrega);
const diff = Math.floor(dEntrega.diff(hoje, "days").days);
return diff >= 0 ? `${diff} d` : `${diff} d (atrasado)`;
}
//-----------------------------------------------------
// COLETA E FILTRO
//-----------------------------------------------------
const pages = dv.pages('"Projects & Areas/Projects/Ongoing"')
.where(p => p.type && p.type == "project")
.sort(p => p.file.mtime, 'desc');
//-----------------------------------------------------
// EXIBIÇÃO
//-----------------------------------------------------
dv.table(
["", "📄", "📅 Entrega", "⭐ Status", "⏳ Prazo"],
pages.map(p => [
getIconPorPrazo(p.entrega),
estilizarLink(p),
p.entrega ? `\`${dv.date(p.entrega).toFormat("yyyy-MM-dd")}\`` : "-",
p.status ?? "-",
diasRestantes(p.entrega)
])
);
📝 Últimas notas criadas
// =============================
// 🆕 Últimos Arquivos Criados
// =============================
let root = dv.el("div", "");
// Input de limite
let limitLabel = document.createElement("label");
limitLabel.textContent = "";
let limitInput = document.createElement("input");
limitInput.type = "number";
limitInput.value = 10;
limitInput.style.width = "50px";
limitInput.style.marginRight = "10px";
root.appendChild(limitLabel);
root.appendChild(limitInput);
// Botão de ordenação
let orderBtn = document.createElement("button");
orderBtn.textContent = "⬇️";
orderBtn.style.marginLeft = "5px";
root.appendChild(orderBtn);
// Div da tabela
let tableDiv = document.createElement("div");
tableDiv.style.marginTop = "10px";
root.appendChild(tableDiv);
let ascending = false;
// =============================
// ⏳ Função de tempo relativo
// =============================
function formatRelativeTime(date) {
if (!date) return "—";
const diffMs = Date.now() - date.toJSDate().getTime();
const minutes = diffMs / 1000 / 60;
if (minutes < 60) return `${Math.floor(minutes)} min`;
if (minutes < 1440) return `${Math.floor(minutes / 60)} h`;
return `${Math.floor(minutes / 1440)} d`;
}
// =============================
// 🧮 Renderização
// =============================
function renderTable() {
let limit = parseInt(limitInput.value);
let pages = dv.pages().array();
pages.sort((a, b) => {
let valA = a.file.ctime?.ts || 0;
let valB = b.file.ctime?.ts || 0;
return ascending ? valA - valB : valB - valA;
});
pages = pages.slice(0, limit);
tableDiv.innerHTML = "";
let table = document.createElement("table");
table.classList.add("dataview");
table.style.width = "100%";
table.style.borderCollapse = "collapse";
let thead = document.createElement("thead");
let header = document.createElement("tr");
["📄 Arquivo", "🕐"].forEach(h => {
let th = document.createElement("th");
th.textContent = h;
th.style.textAlign = "left";
th.style.padding = "4px 8px";
th.style.borderBottom = "1px solid #ccc";
header.appendChild(th);
});
thead.appendChild(header);
table.appendChild(thead);
let tbody = document.createElement("tbody");
pages.forEach(p => {
let row = document.createElement("tr");
let tdLink = document.createElement("td");
tdLink.appendChild(dv.el("span", p.file.link));
tdLink.style.padding = "4px 8px";
row.appendChild(tdLink);
let tdDiff = document.createElement("td");
tdDiff.textContent = formatRelativeTime(p.file.ctime);
tdDiff.style.padding = "4px 8px";
row.appendChild(tdDiff);
tbody.appendChild(row);
});
table.appendChild(tbody);
tableDiv.appendChild(table);
}
// =============================
// 🎯 Eventos
// =============================
limitInput.onchange = renderTable;
orderBtn.onclick = () => {
ascending = !ascending;
orderBtn.textContent = ascending ? "⬆️" : "⬇️";
renderTable();
};
// Inicial
renderTable();
📝 Últimas notas monificadas
// =============================
// 🛠️ Últimos Arquivos Modificados
// =============================
let root = dv.el("div", "");
// Input de limite
let limitLabel = document.createElement("label");
limitLabel.textContent = "Limite: ";
let limitInput = document.createElement("input");
limitInput.type = "number";
limitInput.value = 10;
limitInput.style.width = "50px";
limitInput.style.marginRight = "10px";
root.appendChild(limitLabel);
root.appendChild(limitInput);
// Botão de ordenação
let orderBtn = document.createElement("button");
orderBtn.textContent = "⬇️";
orderBtn.style.marginLeft = "5px";
root.appendChild(orderBtn);
// Div da tabela
let tableDiv = document.createElement("div");
tableDiv.style.marginTop = "10px";
root.appendChild(tableDiv);
let ascending = false;
// =============================
// ⏳ Função de tempo relativo
// =============================
function formatRelativeTime(date) {
if (!date) return "—";
const diffMs = Date.now() - date.toJSDate().getTime();
const minutes = diffMs / 1000 / 60;
if (minutes < 60) return `${Math.floor(minutes)} min`;
if (minutes < 1440) return `${Math.floor(minutes / 60)} h`;
return `${Math.floor(minutes / 1440)} d`;
}
// =============================
// 🧮 Renderização
// =============================
function renderTable() {
let limit = parseInt(limitInput.value);
let pages = dv.pages().array();
pages.sort((a, b) => {
let valA = a.file.mtime?.ts || 0;
let valB = b.file.mtime?.ts || 0;
return ascending ? valA - valB : valB - valA;
});
pages = pages.slice(0, limit);
tableDiv.innerHTML = "";
let table = document.createElement("table");
table.classList.add("dataview");
table.style.width = "100%";
table.style.borderCollapse = "collapse";
let thead = document.createElement("thead");
let header = document.createElement("tr");
["📄", "⏳"].forEach(h => {
let th = document.createElement("th");
th.textContent = h;
th.style.textAlign = "left";
th.style.padding = "4px 8px";
th.style.borderBottom = "1px solid #ccc";
header.appendChild(th);
});
thead.appendChild(header);
table.appendChild(thead);
let tbody = document.createElement("tbody");
pages.forEach(p => {
let row = document.createElement("tr");
let tdLink = document.createElement("td");
tdLink.appendChild(dv.el("span", p.file.link));
tdLink.style.padding = "4px 8px";
row.appendChild(tdLink);
let tdDiff = document.createElement("td");
tdDiff.textContent = formatRelativeTime(p.file.mtime);
tdDiff.style.padding = "4px 8px";
row.appendChild(tdDiff);
tbody.appendChild(row);
});
table.appendChild(tbody);
tableDiv.appendChild(table);
}
// =============================
// 🎯 Eventos
// =============================
limitInput.onchange = renderTable;
orderBtn.onclick = () => {
ascending = !ascending;
orderBtn.textContent = ascending ? "⬆️" : "⬇️";
renderTable();
};
// Inicial
renderTable();
📝 @_vault-snippets-dates
native to properties
'[[{{date}}]]'
Last modified link note
=link(dateformat(date(today), "yyyy-MM-dd"))
Last modified : [[2025-11-05]] -
Last modified :
==================================================