Read the statement by Michael Teeuw here.
MMM-Todoist - Your todoist tasks on your mirror
-
Has anyone solved this yet? I was unable to get Wunderlist to work (installed both regular and enhanced - would never show more than the heading title) and now I can’t get Todoist to work. All settings are correct - I’ve updated the List ID in the MMM-todoist.js file in addition to the config.js file. I also assigned deadlines to everything just to make sure that wasn’t an issue. Here’s my section of config file:
{ module: "MMM-Todoist", position: "top_center", // This can be any of the regions. Best results in left or right regions. header: "ToDo List", // This is optional config: { // See 'Configuration options' for more information. accessToken: "XXXXXXXXXX", maximumEntries: 60, interval: 60, // lists: ["XXXXXXXXX"], fade: false, } },
I’d really like ANY todo list to work on the mirror. I appreciate any help or suggestions. Thanks!
-
Follow-up question - I’ve been trying to put all the config options in both the MMM-Todoist file and the config.js file (commenting them on and off as needed) but it’s not working. Is there a way for me to find a LOG of what Todoist is responding with so I know if it’s working? I’m a relative beginner but am hoping there’s a place for me to look and diagnose what’s not working.
-
@jsp196 A possible reason for your tasks not displaying is if you have any tasks with no due dates, there is a known bug in MMM-Todoist that will not display any of the tasks. I have a fork at https://github.com/tkotz8105/MMM-Todoist that corrects the bug. I hope it solves your issue.
-
@tkotz8621 Thanks. I had tried that but I just went through and deleted all the MMM-Todoist files, started over with your fork and now it works.
One other question - if I want to change the color of this module, is the CSS entry .module.MMM-Todoist? And has anyone had any luck with it working in custom.css or does it need to go into main.css?
Thanks!
-
Have anyone added a feature where it shows duedate?
-
@Lange Good idea… I thought about looking to adding it as an option set in config file. It may be a few weeks before I can maybe start to take a look at it.
-
I want to extend the module a little bit:
- Project Name as header
- Project color in front of the name / the todos
- reminder icon behind the todo (due date like the discussion above)
I tried a few things (from @tidus5 within the fetcher). But I can’t get it to work. Any hints / ideas?
-
@djsunrise19 Hello
i’m on holiday. Can send you the files when i’m back. you need to change the fetcher indeed.
Have a nice day
-
This is my code
it’s based on 2 users (i badly commented the code)/* Magic Mirror * Fetcher * * * By Michael Teeuw http://michaelteeuw.nl edited for Wunderlist by Paul-Vincent Roll * Edited again for Todoist by Chris Brooker * * MIT Licensed. */ var request = require("request"); /* Fetcher * Responsible for requesting an update on the set interval and broadcasting the data. * * attribute listID string - ID of the Wunderlist list. * attribute reloadInterval number - Reload interval in milliseconds. */ function dateDiff(date1, date2){ var diff = {} // Initialisation du retour var tmp = date2 - date1; tmp = Math.floor(tmp/1000); // Nombre de secondes entre les 2 dates diff.sec = tmp % 60; // Extraction du nombre de secondes tmp = Math.floor((tmp-diff.sec)/60); // Nombre de minutes (partie entière) diff.min = tmp % 60; // Extraction du nombre de minutes tmp = Math.floor((tmp-diff.min)/60); // Nombre d'heures (entières) diff.hour = tmp % 24; // Extraction du nombre d'heures tmp = Math.floor((tmp-diff.hour)/24); // Nombre de jours restants diff.day = tmp; return diff; } var Fetcher = function(listID, reloadInterval, accessToken, clientID) { var self = this; if (reloadInterval < 1000) { reloadInterval = 1000; } var reloadTimer = null; var items = []; var fetchFailedCallback = function() {}; var itemsReceivedCallback = function() {}; /* private methods */ /* fetchTodos() * Request the new items. */ var fetchTodos = function() { clearTimeout(reloadTimer); reloadTimer = null; request({ url: "https://todoist.com/API/v7/sync/", method: "POST", headers: { 'content-type': 'application/x-www-form-urlencoded', 'cache-control': 'no-cache' }, form: { token: accessToken, sync_token: '*', resource_types: '["items"]' } }, function(error, response, body) { if (!error && response.statusCode == 200) { items = []; for (var i = 0; i < JSON.parse(body).items.length; i++) { if (JSON.parse(body).items[i].project_id == listID) { donneetableau = JSON.parse(body).items[i]; onbalance = []; icontodo = []; assignedname = []; datedueretour = []; contentretour = []; assignedtodoname = []; checkedretour = []; if (donneetableau.priority == '1') {icontodo ='<i></i> '} else if (donneetableau.priority == '2') {icontodo ='<i></i> '} else if (donneetableau.priority == '3') {icontodo ='<i></i> '} else {icontodo ='<i></i> '} if (donneetableau.assigned_by_uid == 'XXXXXXXX') {assignedname ='(XXXXX)'}//TEST first XXX UID second XXXX yourname else if (donneetableau.assigned_by_uid == 'XXXXXXX') {assignedname ='(XXXXXX)'}//TEST first XXX UID second XXXX yourname else {assignedname ='Inconnu'}; if (donneetableau.due_date_utc) { date1 = new Date(); date2 = new Date(donneetableau.due_date_utc); diff = dateDiff(date1, date2); if (diff.day = '1') {datedueretour += diff.day + 'd <i></i> ';} else if (diff.hour >= '1') {datedueretour += diff.hour + 'h <i></i> ';} else {datedueretour += diff.min + 'min <i></i> ';}; } else {datedueretour =''}; contentretour = donneetableau.content; if (donneetableau.responsible_uid ) { if (donneetableau.responsible_uid == 'XXXXXXX') { assignedtodoname ='<i></i> ' } ////YOUR UID USER else if (donneetableau.responsible_uid == 'XXXXXXX') {assignedtodoname ='<i></i> '} else {assignedtodoname ='Inconnu'}; // YOUR UID USER } else { assignedtodoname ='' }; checkedretour = donneetableau.checked; onbalance +=assignedtodoname + icontodo + datedueretour + contentretour; items.push(onbalance); //items.split('\n'); //priority.push(JSON.parse(body).priority[i].priority); //datedue.push(JSON.parse(body).datedue[i].due_date_utc); } } self.broadcastItems(); scheduleTimer(); } }); }; /* scheduleTimer() * Schedule the timer for the next update. */ var scheduleTimer = function() { //console.log('Schedule update timer.'); clearTimeout(reloadTimer); reloadTimer = setTimeout(function() { fetchTodos(); }, reloadInterval); }; /* public methods */ /* setReloadInterval() * Update the reload interval, but only if we need to increase the speed. * * attribute interval number - Interval for the update in milliseconds. */ this.setReloadInterval = function(interval) { if (interval > 1000 && interval < reloadInterval) { reloadInterval = interval; } }; /* startFetch() * Initiate fetchTodos(); */ this.startFetch = function() { fetchTodos(); }; /* broadcastItems() * Broadcast the exsisting items. */ this.broadcastItems = function() { if (items.length
-
Dumb question, how do you exactly generate the access token? I’m a little bit confused…
From pm2 logs, I read:
** Message: console message: http://localhost:8080/modules/MMM-Todoist//MMM-Todoist.js @199: SyntaxError: Unexpected token ‘>’
I used the access token generated from here, but I’m not sure about the process, which App service URL did you use? Which OAuth redirect URL? And last which token is the right one? I can see three of them
Thanks in advance