1/* DOKUWIKI:include_once vendor/pnotify/jquery.pnotify.js */ 2/** 3 * DokuWiki Plugin timetrack (JavaScript Component) 4 * 5 * Plugin timetrack 6 * 7 * @author peterfromearth <coder@peterfromearth.de> 8 * 9 */ 10jQuery.pnotify.defaults.styling = "jqueryui"; 11jQuery.pnotify.defaults.delay = 2000; 12jQuery.pnotify.defaults.history = false; 13 14jQuery(function() { 15 jQuery(document).on("click","li.plugin_timetrack a",function(e) { 16 e.preventDefault(); 17 jQuery(this).blur(); 18 if(!jQuery('#timetrack__dialog').length){ 19 jQuery('body').append('<div id="timetrack__dialog" position="absolute" border=1 height="800px"><div><div class="ui-tabs-panel"></div></div></div>'); 20 jQuery( "#timetrack__dialog" ).dialog({title:LANG.plugins.timetrack['timetrack'], 21 height:Math.min(700,jQuery(window).height()-50), 22 width: Math.min(700,jQuery(window).width()-50), 23 autoOpen:true, 24 modal:true, 25 26 }); 27 28 } 29 jQuery("#timetrack__dialog").dialog("open"); 30 timetrack_loadDialog('current'); 31 32 }); 33 34 jQuery(document).on('click','#timetrack-form button',function(event){ 35 event.preventDefault(); 36 var $btn = jQuery(event.target); 37 38 timetrack_loadDialog(jQuery('#timetrack-form input[name=cmd]').val(),{act:$btn.attr('name'),yearweek:$btn.attr('value')}); 39 40 }); 41 42 jQuery(document).on('click','#timetrack-form input',function(event){ 43 this.select(); 44 }); 45 jQuery(document).on('change keyup','#timetrack-form input',function(event){ 46 var $input = jQuery(this); 47 48 if($input.val() *1 < 0) $input.val(0); 49 50 var date = $input.data('date'); 51 52 var $dateInputs = jQuery('#timetrack-form input[data-date="'+date+'"]'); 53 54 var date_sum = 0; 55 $dateInputs.each(function(e){ 56 date_sum += parseInt(jQuery(this).val() * 1); 57 }); 58 59 var $th = jQuery('#timetrack-form th[data-date="'+date+'"]'); 60 61 $th.text($th.data('otherhours')*1 + date_sum); 62 63 }); 64 jQuery(document).on('keyup','#timetrack-form input',function(event){ 65 var $input = jQuery(this); 66 var $input_next; 67 var pos; 68 switch(event.which) { 69 case 37: // left 70 $input_next = $input.closest('td').prev().find('input'); 71 if(!$input_next.length) { 72 $input_next = $input.closest('tr').prev().find('input').last(); 73 } 74 $input_next.focus().select(); 75 break; 76 77 case 38: // up 78 pos = $input.closest('tr').find('input').index($input); 79 80 $input_next = jQuery($input.closest('tr').prev().find('input')[pos]); 81 if($input_next.length) { 82 $input_next.focus().select(); 83 } 84 break; 85 86 case 39: // right 87 $input_next = $input.closest('td').next().find('input'); 88 if(!$input_next.length) { 89 $input_next = $input.closest('tr').next().find('input').first(); 90 } 91 $input_next.focus().select(); 92 break; 93 94 case 40: // down 95 pos = $input.closest('tr').find('input').index($input); 96 97 $input_next = jQuery($input.closest('tr').next().find('input')[pos]); 98 if($input_next.length) { 99 $input_next.focus().select(); 100 } 101 break; 102 103 default: return; // exit this handler for other keys 104 } 105 event.preventDefault(); // prevent the default action (scroll / move caret) 106 107 }); 108 109 function timetrack_loadDialog(cmd,data) { 110 jQuery.ajax({ 111 type:'POST', 112 url:DOKU_BASE + 'lib/exe/ajax.php', 113 data:{ call: 'plugin_timetrack', cmd: cmd, pageid:JSINFO.id, data:data, sectok:JSINFO.sectok }, 114 success:timetrack_result, 115 beforeSend:function() {jQuery('#timetrack__dialog').addClass("loading");} 116 }); 117 } 118 119 function timetrack_save(applyonly) { 120 var $form = jQuery('#timetrack-form'); 121 122 jQuery.ajax({ 123 type:'POST', 124 url:DOKU_BASE + 'lib/exe/ajax.php', 125 data:$form.serialize(), 126 success:applyonly ? timetrack_resultapply : timetrack_resultnoapply, 127 beforeSend:function() {jQuery('#timetrack__dialog').addClass("loading");} 128 }); 129 } 130 131 function timetrack_resultapply(data) { 132 timetrack_result(data,true); 133 } 134 function timetrack_resultnoapply(data) { 135 timetrack_result(data,false); 136 } 137 function timetrack_result(data, applyonly) { 138 if(!data) { 139 console.log('timetrack returns false'); 140 return false; 141 } 142 var data = JSON.parse(data); 143 144 if(data.dialog) { 145 jQuery("#timetrack__dialog > div").empty(); 146 jQuery("#timetrack__dialog > div").html(data.dialog); 147 jQuery("#timetrack-dialog-tabs").tabs({ 148 beforeActivate: function( event, ui ) { 149 event.preventDefault(); 150 timetrack_loadDialog(ui.newTab.data('tabid')); 151 }, 152 active:jQuery("#timetrack-dialog-tabs ul a[selected=selected]").data('index') 153 }); 154 if(data.cmd === 'current' || data.cmd === 'recent') { 155 jQuery("#timetrack__dialog").dialog({ 156 buttons:[ 157 {text:LANG.plugins.timetrack['closeDialog'],icons: {primary:'ui-icon-close'}, class: 'left-button' ,click: function() {jQuery(this).dialog('close');}}, 158 {text:LANG.plugins.timetrack['save'],icons: {primary:'ui-icon-check'},click: function() {timetrack_save(false);}}, 159 {text:LANG.plugins.timetrack['apply'],icons: {primary:'ui-icon-refresh'},click: function() {timetrack_save(true);}}, 160 ], 161 }); 162 jQuery('#timetrack-form input[data-date="'+new Date().toISOString().slice(0, 10)+'"]').first().select().focus(); 163 164 } else if(data.cmd === 'overview') { 165 jQuery("#timetrack__dialog").dialog({ 166 buttons:[ 167 {text:LANG.plugins.timetrack['closeDialog'],click: function() {jQuery(this).dialog('close');}}, 168 169 ], 170 }); 171 } 172 jQuery("#timetrack__dialog").dialog("open"); 173 jQuery('#timetrack__dialog').removeClass('loading'); 174 175 176 } 177 178 if(data.success == true) { 179 if(applyonly !== true) jQuery("#timetrack__dialog").dialog("close"); 180 181 jQuery.pnotify({ 182 title: false, 183 text: data.msg?data.msg:'gespeichert', 184 type: 'success', 185 icon: false, 186 delay: data.notifyDelay?data.notifyDelay*1000:2000, 187 animate_speed: 100, 188 animation: { 189 effect_in:'bounce', 190 effect_out:'drop', 191 } 192 }); 193 } 194 195 } 196}); 197