const headers = ["tags"];
const pageSize = {{PageSize}}
const pageTitleLike = "{{FileName}}"
const authorLike = "{{Author}}"
const tagLikeA = "{{TagA}}"
const tagLikeB = "{{TagB}}"
const titleMatch = (page, title) => title ? page.file.name.toLowerCase().includes(title.toLowerCase()) : true;
const authorMatch = (page, author) => author ? new RegExp(`.*${author}.*`, 'i').test(String(page["author"])) : true;
const tagMatch = (page, tag) => tag ? page.file.tags && page.file.tags.some(t => t.includes(tag)) : true;
{ matcher: titleMatch, value: pageTitleLike },
{ matcher: authorMatch, value: authorLike },
{ matcher: tagMatch, value: tagLikeA },
{ matcher: tagMatch, value: tagLikeB }
const filteredData = dv.pages(`"Inbox" and -"Inbox/Tasks"`)
.where(p => filters.every(filter => filter.matcher(p, filter.value)))
.sort(p => {{SortFiled}},"{{Sort}}")
return [p.file, ...headers.map(property => p[property]), formatDate(p["created_date"])];
function formatDate(date) {
const mdate = new Date((!isNaN(date) && /^\d+$/.test(date)) ? date * 1000 : date);
return `${mdate.getFullYear()}-${String(mdate.getMonth() + 1).padStart(2, '0')}-${String(mdate.getDate()).padStart(2, '0')}`;
const totalData = filteredData.length;
const maxnum = Math.ceil(totalData / pageSize);
let flexContainer = createFlexContainer("space-between");
let paragraph = document.createElement("span");
paragraph.textContent = "检索出 " + totalData + " 条数据";
paragraph.style.flex = "1";
flexContainer.appendChild(paragraph);
let parentContainer = createFlexContainer("flex-end");
let [button1, button2, pageSpan1, pageSpan2, pageSpan3] = createPaginationElements();
parentContainer.append(button1, pageSpan1, pageSpan2, pageSpan3, button2);
flexContainer.appendChild(parentContainer);
// Append the flex container to the dataview container
dv.container.appendChild(flexContainer);
function createPaginationElements() {
let button1 = document.createElement("button");
button1.textContent = "上一页";
button1.onclick = () => {
pageNum = pageNum > 1 ? pageNum - 1 : maxnum;
let pageSpan1 = document.createElement("span");
pageSpan1.textContent = pageNum;
let pageSpan2 = document.createElement("span");
pageSpan2.textContent = " / ";
let pageSpan3 = document.createElement("span");
pageSpan3.textContent = maxnum;
let button2 = document.createElement("button");
button2.textContent = "下一页";
button2.onclick = () => {
pageNum = pageNum < maxnum ? pageNum + 1 : 1;
return [button1, button2, pageSpan1, pageSpan2, pageSpan3];
function createFlexContainer(justifyContent) {
let container = document.createElement("div");
container.style.display = "flex";
container.style.alignItems = "center";
container.style.justifyContent = justifyContent;
const tableContainerId = "custom-dataview-table-container";
let oldTableContainer = document.getElementById(tableContainerId);
if (oldTableContainer) {
oldTableContainer.remove();
let tableContainer = document.createElement("div");
tableContainer.id = tableContainerId;
dv.container.appendChild(tableContainer); // Ensure the table container is appended to the main container
let pageData = filteredData.slice((pageNum - 1) * pageSize, pageNum * pageSize);
let table = createTable(["FileName", ...headers, "CreatedDate"], pageData);
tableContainer.appendChild(table);
pageSpan1.innerText = pageNum;
function createTable(headers, data) {
let table = document.createElement("table");
table.className = "dataview table-view-table";
let thead = document.createElement("thead");
let headerRow = document.createElement("tr");
headers.forEach(header => {
let th = document.createElement("th");
th.textContent = header;
headerRow.appendChild(th);
thead.appendChild(headerRow);
table.appendChild(thead);
let tbody = document.createElement("tbody");
data.forEach(rowData => {
let row = document.createElement("tr");
rowData.forEach((cellData, index) => {
let td = document.createElement("td");
if (index === 0 && cellData && cellData.path) {
let a = document.createElement("a");
a.className = "internal-link";
a.textContent = cellData.name;
td.textContent = cellData;
table.appendChild(tbody);