/** * Undo * * Single action: * 1. User clicks "delete" * 2. Notification appears for 5 seconds * 3. Token row is faded out * 4a User clicks on notification: * - Action is cancelled * - Token row is faded in * 4b User does not click on notification: * - Action gets executed 5 seconds after the delete click * - Token row gets removed * * * Multiple actions: * 1. User clicks "delete" * 2. Notification appears for 5 seconds * 3. User clicks "delete" * 4. Notification appears for 5 seconds * 5a User clicks on notification: All pending actions are cancelled * 5b User does not click on notification * - Action 1 gets executed 5 seconds after the first click * - Action 2 gets executed 5 seconds after the second click */ OC.grauphel = { simpleUndo: function(undoTask) { var notifier = $('#notification'); var timeout = 5; notifier.off('click'); notifier.text('Token has been deleted. Click to undo.'); notifier.fadeIn(); $('#' + undoTask.elementId).fadeOut(); OC.grauphel.startGuiTimer(timeout, notifier); var timer = setTimeout( function() { var dataid = timer.toString(); OC.grauphel.executeTask(notifier.data(dataid), true); notifier.removeData(dataid); }, timeout * 1000 ); var dataid = timer.toString(); notifier.data(dataid, undoTask); notifier.on('click', function() { for (var id in notifier.data()) { clearTimeout(parseInt(id)); notifier.off('click'); OC.grauphel.restore(notifier.data(id)); notifier.removeData(id); } }); }, executeTask: function(task, async) { //console.log("execute task: ", task); jQuery.ajax({ url: task.url, type: task.method, async: async }); }, restore: function(undoTask) { $('#' + undoTask.elementId).fadeIn(); var notifier = $('#notification'); var timeout = 5; notifier.off('click'); notifier.text('Token has been restored.'); OC.grauphel.startGuiTimer(timeout, notifier); notifier.on('click', function() { clearTimeout(OC.grauphel.guiTimer); notifier.fadeOut(); }); }, executeAllTasks: function() { var notifier = $('#notification'); for (var id in notifier.data()) { clearTimeout(parseInt(id)); OC.grauphel.executeTask(notifier.data(id), false); notifier.removeData(id); } }, guiTimer: null, startGuiTimer: function(timeout, notifier) { if (OC.grauphel.guiTimer !== null) { clearTimeout(OC.grauphel.guiTimer); } OC.grauphel.guiTimer = setTimeout( function() { notifier.fadeOut(); notifier.off('click'); }, timeout * 1000 ); } }; $(document).ready(function() { $('#grauphel-tokens .delete').click( function (event) { event.preventDefault(); var undoTask = { 'method': 'DELETE', 'url': $(this).parent('form').attr('action'), 'elementId': $(this).data('token') }; OC.grauphel.simpleUndo(undoTask); return false; } ); //in case a user deletes tokens and leaves the page within the 5 seconds window.onbeforeunload = function(e) { OC.grauphel.executeAllTasks(); }; });