Algumas buscas Úteis com Dataview & Dataviewjs

//-----------------------------------------------------------
// 🧩 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 : 

==================================================