MagicMirror² v2.7.0 is available! For more information about this release, check out this topic.

MMM-Todoist - Your todoist tasks on your mirror



  • This post is deleted!


  • 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