let updatedAt = new Date() module.exports = function ({ line, source, totals }) { const project = this.project const emoji = { due: dueEmoji(totals), recent: recentEmoji(totals), wip: wipEmoji(totals), chart: EMOJI.CHART } // These are the properties that are available to use in your cards // Use ${property_name} to permanently insert the value of the property // Use {{property_name}} to insert the value of the property at runtime return { date: `${new Date().toISOString().substring(0, 10)}`, sourceLink: `[${source.path}:${line}](${source.path}:${line})`, cardTotal: cardTotal(totals), allTopics: project.allTopics, // This is an array of all the topics in the project topicTable: getTopicTable(project), // This is a markdown table with the count of tasks for each topic/list intersection emoji, icons } } const icons = { filter: `` ,openFile: `` ,kebab: `` ,clone: `` ,editCard: `` } const EMOJI = { BAD: ':rotating_light:', GREAT: ':rocket:', SLEEP: ':sleeping:', GOOD: ':2nd_place_medal:', CHART: ':chart:' } function formatEmoji(emoji) { return `${emoji}` } function dueEmoji(totals) { const due = totals["What's Due?"] let emoji = EMOJI.GOOD if (due >= 3) { emoji = EMOJI.BAD } else if (due === 0) { emoji = EMOJI.GREAT } return formatEmoji(emoji) } function recentEmoji(totals) { const recentlyCompleted = totals['Recently Completed'] let emoji = EMOJI.GOOD if (recentlyCompleted >= 3) { emoji = EMOJI.GREAT } else if (recentlyCompleted === 0) { emoji = EMOJI.BAD } return formatEmoji(emoji) } function wipEmoji(totals) { const doing = totals['DOING'] let emoji = EMOJI.GOOD if (doing >= 3) { emoji = EMOJI.BAD } else if (doing === 0) { emoji = EMOJI.SLEEP } else if (doing === 1) { emoji = EMOJI.GREAT } return formatEmoji(emoji) } function cardTotal(totals) { let count = 0 Object.keys(totals).forEach((list) => { count += totals[list] }) return count } function getTopicTable(project) { console.log('project.updatedAt', project.updatedAt) console.log('updatedAt', updatedAt) if (project.updatedAt < updatedAt) return '' updatedAt = project.updatedAt const lists = project.allLists.filter(list => !list.filter) const topicTable = project.allTopics.map((topic) => { return { name: topic, lists: [ ...lists.map((list) => { return { name: list.name, count: list.tasks.filter((task) => task.topics.includes(topic)).length } }) ] } }); //convert topic table into a markdown table with topic name on the left and list names on the top and the count for each topic/list intersection const table = ` | Topic | ${lists.map((list) => list.name).join(' | ')} | | --- | ${lists.map(() => ' --- ').join(' | ')} | ${topicTable.map((topic) => { const topicLink = `imdone://${project.path}?filter=topics="${encodeURIComponent(topic.name)}"`; return `| [[${topic.name}]] | ${topic.lists.map((list) => `[${list.count}](${topicLink})`).join(' | ')} |`; }).join('\n')} `; console.log(table); return table }