Ignore:
Timestamp:
08/09/12 16:46:57 (12 years ago)
Author:
acoutinho
Message:

Ticket #2966 - Suporte a edicao de tarefas na edicao de tarefas

Location:
sandbox/2.4.2-expresso1/prototype/modules/calendar
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • sandbox/2.4.2-expresso1/prototype/modules/calendar/css/style.css

    r6974 r6977  
    582582.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each:hover { background: #FFF2F2; cursor: pointer;} 
    583583 
    584 .div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour { width: 140px; float: left; height: 20px} 
     584.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour {overflow: hidden; width: 140px; float: left; height: 20px} 
    585585.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .date-hour span { margin: 8px; float: left; } 
    586 .div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user{ width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     586.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    587587.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .user span{ margin: 8px; float: left; } 
    588 .div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute{ width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     588.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    589589.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .attribute span{ margin: 8px; float: left; } 
    590 .div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue{ width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     590.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    591591.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .beforeValue span{ margin: 8px; float: left; } 
    592 .div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue{ width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     592.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue{overflow: hidden; width: 150px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    593593.div-addtask  #calendar_addtask_details8 .parent .child-bottom .child-bottom-each .afterValue span{ margin: 8px; float: left; } 
    594594 
    595595.div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour { width: 140px; float: left; background: #E8F4FD; height: 20px; text-align: center; } 
    596 .div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour span{ margin: 6px 0; position: absolute; font-weight: bold; color: #2E6E9E; } 
     596.div-addtask  #calendar_addtask_details8 .parent .child-top .date-hour span{ display: block; padding: 6px; font-weight: bold; color: #2E6E9E; } 
    597597.div-addtask  #calendar_addtask_details8 .parent .child-top .user { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E; text-align: center;} 
    598 .div-addtask  #calendar_addtask_details8 .parent .child-top .user span{margin: 6px 0; position: absolute; } 
     598.div-addtask  #calendar_addtask_details8 .parent .child-top .user span{display: block; padding: 6px;} 
    599599.div-addtask  #calendar_addtask_details8 .parent .child-top .attribute { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
    600 .div-addtask  #calendar_addtask_details8 .parent .child-top .attribute span{margin: 6px 0; position: absolute; } 
     600.div-addtask  #calendar_addtask_details8 .parent .child-top .attribute span{display: block; padding: 6px;} 
    601601.div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
    602 .div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue span{margin: 6px 0; position: absolute; } 
     602.div-addtask  #calendar_addtask_details8 .parent .child-top .beforeValue span{display: block; padding: 6px; } 
    603603.div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue { width: 150px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
    604 .div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue span{margin: 6px 0; position: absolute; } 
     604.div-addtask  #calendar_addtask_details8 .parent .child-top .afterValue span{display: block; padding: 6px; } 
    605605 
    606606/*Atividades*/ 
     
    641641.div-addactivity  #group_addactivity_details6  .parent .child-bottom .task { height: 25px; text-align: center; background: #FEFEAD; border-bottom: 1px solid #CCC;} 
    642642.div-addactivity  #group_addactivity_details6  .parent .child-bottom .task.left {border-top: 1px solid #CCC;} 
    643 .div-addactivity  #group_addactivity_details6  .parent .child-bottom .task span{ position: absolute; margin-top: 6px;} 
    644  
    645 .div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .date-hour { width: 140px; float: left; height: 20px} 
     643.div-addactivity  #group_addactivity_details6  .parent .child-bottom .task span{padding: 5px; display: block;} 
     644 
     645.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .date-hour {overflow: hidden; width: 140px; float: left; height: 20px} 
    646646.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .date-hour span { margin: 8px; float: left; } 
    647 .div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .user{ width: 145px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     647.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .user{overflow: hidden; width: 145px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    648648.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .user span{ margin: 8px; float: left; } 
    649 .div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .attribute{ width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     649.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .attribute{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    650650.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .attribute span{ margin: 8px; float: left; } 
    651 .div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .beforeValue{ width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     651.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .beforeValue{overflow: hidden; width: 130px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    652652.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .beforeValue span{ margin: 8px; float: left; } 
    653 .div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .afterValue{ width: 145px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
     653.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .afterValue{overflow: hidden; width: 129px; float: left;  height: 20px; border-left: 1px solid #CCC; } 
    654654.div-addactivity  #group_addactivity_details6  .parent .child-bottom .child-bottom-each .afterValue span{ margin: 8px; float: left; } 
    655655 
    656656.div-addactivity  #group_addactivity_details6  .parent .child-top .date-hour { width: 140px; float: left; background: #E8F4FD; height: 20px; text-align: center; } 
    657 .div-addactivity  #group_addactivity_details6  .parent .child-top .date-hour span{ margin: 6px 0; position: absolute; font-weight: bold; color: #2E6E9E; } 
     657.div-addactivity  #group_addactivity_details6  .parent .child-top .date-hour span{ display: block; padding: 6px; font-weight: bold; color: #2E6E9E; } 
    658658.div-addactivity  #group_addactivity_details6  .parent .child-top .user { width: 145px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E; text-align: center;} 
    659 .div-addactivity  #group_addactivity_details6  .parent .child-top .user span{margin: 6px 0; position: absolute; } 
     659.div-addactivity  #group_addactivity_details6  .parent .child-top .user span{display: block; padding: 6px; } 
    660660.div-addactivity  #group_addactivity_details6  .parent .child-top .attribute { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
    661 .div-addactivity  #group_addactivity_details6  .parent .child-top .attribute span{margin: 6px 0; position: absolute; } 
     661.div-addactivity  #group_addactivity_details6  .parent .child-top .attribute span{display: block; padding: 6px; } 
    662662.div-addactivity  #group_addactivity_details6  .parent .child-top .beforeValue { width: 130px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
    663 .div-addactivity  #group_addactivity_details6  .parent .child-top .beforeValue span{margin: 6px 0; position: absolute; } 
    664 .div-addactivity  #group_addactivity_details6  .parent .child-top .afterValue { width: 145px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
    665 .div-addactivity  #group_addactivity_details6  .parent .child-top .afterValue span{margin: 6px 0; position: absolute; } 
     663.div-addactivity  #group_addactivity_details6  .parent .child-top .beforeValue span{display: block; padding: 6px; } 
     664.div-addactivity  #group_addactivity_details6  .parent .child-top .afterValue { width: 129px; float: left; background: #E8F4FD; height: 20px; font-weight: bold; color: #2E6E9E;  text-align: center;} 
     665.div-addactivity  #group_addactivity_details6  .parent .child-top .afterValue span{display: block; padding: 6px; } 
    666666 
    667667 
  • sandbox/2.4.2-expresso1/prototype/modules/calendar/interceptors/DBMapping.php

    r6974 r6977  
    498498                unset($criteria['historic']['due']); 
    499499 
     500            //necessário para atulizar a atividade de composta pela tarefa aqui sendo atualizada 
     501            if(isset($criteria['historic']['startTime']) || isset($criteria['historic']['endTime'])){ 
     502                $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'schedulable', $event['id']), array('=', 'owner', Config::me('uidNumber'))), 'deepness' => 2)); 
     503 
     504                if(!empty($taskToActivity)){ 
     505                    $activity = Controller::read(array('concept' => 'schedulable', 'id' => $taskToActivity[0]['activity']), array('startTime', 'endTime', 'rangeStart', 'rangeEnd')); 
     506                    $start = $params['startTime']; 
     507                    $end = $params['endTime']; 
     508                    foreach($taskToActivity as $t){ 
     509                         if($t['task']['id'] != $params['id']){ 
     510                            $start = $t['task']['startTime'] < $start ? $t['task']['startTime'] : $start; 
     511                            $end = $t['task']['endTime'] < $end ? $t['task']['endTime'] : $end; 
     512                         } 
     513                    } 
     514 
     515                    $toUpdate = array(); 
     516                     
     517                    if($start != $activity['startTime']) 
     518                        $toUpdate['starTime'] = $start; 
     519                     
     520                    if($end != $activity['endTime']) 
     521                        $toUpdate['endTime'] = $end; 
     522                      
     523                    if(!empty($toUpdate)) 
     524                        Controller::update(array('concept' => 'schedulable', 'id' => $activity['id']), $toUpdate);                 
     525                } 
     526            } 
     527 
    500528            unset($criteria['historic']['rangeEnd']); 
    501529            unset($criteria['historic']['rangeStart']); 
     530            unset($criteria['historic']['class']); 
     531            unset($criteria['historic']['type']); 
     532            unset($criteria['historic']['allDay']); 
    502533            unset($criteria['historic']['id']);             
    503534        } 
  • sandbox/2.4.2-expresso1/prototype/modules/calendar/js/activity.helpers.js

    r6974 r6977  
    1111    if(!isMail) 
    1212        objActivity = DataLayer.encode( "schedulable:activity", objActivity ); 
     13 
     14    /** 
     15    * canDiscardActivityDialog deve ser true se não houver alterações no evento 
     16    */ 
     17    canDiscardActivityDialog = true; 
     18    /** 
     19         * zebraDiscardActivityDialog é uma flag indicando que uma janela de confirmação (Zebra_Dialog) 
     20         * já está aberta na tela, uma vez que não é possivel acessar o evento ESC utilizado para fechá-la 
     21         */ 
     22    zebraDiscardActivityDialog = false; 
     23         
     24        var html = DataLayer.render( path+'templates/activity_add.ejs', { 
     25            activity:objActivity 
     26        });      
     27                         
     28        if (!UI.dialogs.addActivity) { 
     29 
     30            UI.dialogs.addActivity = jQuery('#sandbox').append('<div title="Criar Atividade" class="new-activity-win active"> <div>').find('.new-activity-win.active').html(html).dialog({ 
     31                resizable: false,  
     32                modal:true,  
     33                autoOpen: false, 
     34                width:735,  
     35                position: 'center',  
     36                close: function(event, ui) { 
     37                        /** 
     38                         * Remove tooltip possivelmente existente 
     39                         */ 
     40                        if ($('.qtip.qtip-blue.qtip-active').length) 
     41                                $('.qtip.qtip-blue.qtip-active').qtip('destroy');                                                
     42                         
     43                attendees  = {}; 
     44                }, 
     45                beforeClose: function(event, ui) { 
     46                 
     47                    if (!canDiscardActivityDialog && !zebraDiscardActivityDialog) { 
     48                                zebraDiscardActivityDialog = true; 
     49                                window.setTimeout(function() { 
     50                                    $.Zebra_Dialog('Suas alterações na atividade não foram salvas. Deseja descartar as alterações?', { 
     51                                        'type':     'question', 
     52                                        'overlay_opacity': '0.5', 
     53                                        'buttons':  ['Descartar alterações', 'Continuar editando'], 
     54                                        'onClose':  function(clicked) { 
     55                                            if(clicked == 'Descartar alterações') { 
     56                                                canDiscardActivityDialog = true; 
     57                                                /** 
     58                                                *Remoção dos anexos do eventos caso seja cancelado a edição 
     59                                                */ 
     60                                                DataLayer.rollback(); 
     61 
     62                                                var ids = false; 
     63                                                $.each($('.attachment-list input'), function (i, input) { 
     64                                                    DataLayer.put('attachment', {id: ''+input.value}); 
     65                                                    DataLayer.remove('attachment', ''+input.value); 
     66                                                        ids = true; 
     67                                                }); 
     68                                                if(ids) 
     69                                                        DataLayer.commit(); 
     70 
     71                                                UI.dialogs.addActivity.dialog('close'); 
     72                                            }else{ 
     73                                                   zebraDiscardActivityDialog = false; 
     74                                            } 
     75                                                                                         
     76                                            /** 
     77                                            * Uma vez aberta uma janela de confirmação (Zebra_Dialog), ao fechá-la 
     78                                            * com ESC, para que o evento ESC não seja propagado para fechamento da 
     79                                            * janela de edição de eventos, deve ser setada uma flag indicando que 
     80                                            * já existe uma janela de confirmação aberta. 
     81                                            */ 
     82                                            if (!clicked) { 
     83                                                window.setTimeout(function() { 
     84                                                    zebraDiscardActivityDialog = false; 
     85                                                }, 200); 
     86                                            } 
     87                                        } 
     88                            }); 
     89                                                                         
     90                        }, 300); 
     91            } 
     92            //DataLayer.rollback(); 
     93            return canDiscardActivityDialog; 
     94        }, 
     95        dragStart: function(event, ui) { 
     96            if ($('.qtip.qtip-blue.qtip-active').length) 
     97                $('.qtip.qtip-blue.qtip-active').qtip('destroy'); 
     98       } 
     99    }); 
     100                                 
     101        } else { 
     102            UI.dialogs.addActivity.html(html); 
     103        } 
     104 
     105/* Checkbox allday */ 
     106UI.dialogs.addActivity.find('input[name="allDay"]').click(function(){ 
     107    $(this).attr("checked") ?  
     108    UI.dialogs.addActivity.find('.start-time, .end-time').addClass('hidden') : 
     109    UI.dialogs.addActivity.find('.start-time, .end-time').removeClass('hidden');  
     110}); 
     111                 
     112var tabs = UI.dialogs.addActivity.children('.content').tabs({ 
     113        select: function(event, ui) {  
     114                if ($('.qtip.qtip-blue.qtip-active').length) 
     115                        $('.qtip.qtip-blue.qtip-active').qtip('destroy'); 
     116        }        
     117        }); 
     118 
     119var group = DataLayer.get('calendar', objActivity.group); 
     120                                 
     121if (group.timezone != objActivity.timezone){ 
     122    UI.dialogs.addActivity.find('.group_addactivity_details_lnk_timezone').find('option[value="'+objActivity.timezone+'"]').attr('selected','selected').trigger('change'); 
     123    UI.dialogs.addActivity.find('.group_addactivity_details_lnk_timezone').addClass('hidden'); 
     124    $('.group-addevent-details-txt-timezone').removeClass('hidden'); 
     125                         
     126} 
     127 
     128UI.dialogs.addActivity.find('.group_addactivity_details_lnk_timezone').click(function(e){ 
     129    $(this).addClass('hidden'); 
     130    $('.group-addactivity-details-txt-timezone').removeClass('hidden'); 
     131    e.preventDefault(); 
     132}); 
     133 
     134UI.dialogs.addActivity.find('.button.remove').button({ 
     135    text:false,  
     136    icons:{ 
     137        primary:'ui-icon-close' 
     138    } 
     139}).click(function(el){ 
     140    var id; 
     141    if( id = $(this).parent().find('input[name="alarmId[]"]').val()) 
     142        DataLayer.remove('alarm', id); 
     143    $(this).parent().remove().find('li').is(':empty'); 
     144}); 
     145 
     146UI.dialogs.addActivity.find('.button-add-alarms').click(function(){ 
     147            DataLayer.render( 'templates/alarms_add_itemlist.ejs', {type: 0}, function( template ){                      
     148            jQuery('.activity-alarms-list').append(template) 
     149            .find('li:last label:eq(0)').remove().end() 
     150            .find('.number').numeric().end() 
     151            .find('.button.remove').button({ 
     152                text:false,  
     153                icons:{ 
     154                    primary:'ui-icon-close' 
     155                } 
     156            }).click(function(el) { 
     157                $(this).parent().remove(); 
     158            });     
     159            }); 
     160        }); 
     161 
     162/*Seleciona a agenda padrão para visualização/edição de um evento*/ 
     163if(objActivity.id) 
     164    UI.dialogs.addActivity.find('select[name="group"] option[value="'+objActivity.group+'"]').attr('selected','selected').trigger('change'); 
     165 
     166UI.dialogs.addActivity.find('.button').button(); 
     167    UI.dialogs.addActivity.find('.button.add').button({ 
     168        icons: { 
     169           secondary: "ui-icon-plus" 
     170        } 
     171}); 
     172 
     173todoStatus('addActivity', (objActivity.activityStatus != undefined) ? objActivity.activityStatus : 1); 
     174 
     175UI.dialogs.addActivity.find('select[name="activityStatus"]').attr('disabled', 'disabled'); 
     176 
     177// ==== validation events ==== 
     178UI.dialogs.addActivity.find(".input-group .h1").Watermark("Atividade sem título"); 
     179 
     180UI.dialogs.addActivity.find(".number").numeric(); 
     181 
     182User.preferences.dateFormat.indexOf('-') > 0 ?  
     183UI.dialogs.addActivity.find(".date").mask("99-99-9999", { 
     184    completed:function(){ 
     185        updateMap(); 
     186    } 
     187}) :  
     188 
     189UI.dialogs.addActivity.find(".date").mask("99/99/9999", { 
     190    completed:function(){ 
     191        updateMap(); 
     192    } 
     193}); 
     194 
     195UI.dialogs.addActivity.find(".menu-addactivity") 
     196.children(".delete").click(function(){ 
     197    $.Zebra_Dialog('Tem certeza que deseja excluir a atividade?', { 
     198        'type':     'question', 
     199        'overlay_opacity': '0.5', 
     200        'buttons':  ['Sim', 'Não'], 
     201        'onClose':  function(clicked) { 
     202            if(clicked == 'Sim'){ 
     203                canDiscardActivityDialog = true; 
     204                /* Remove por filtro */ 
     205                DataLayer.removeFilter('schedulable', {filter: ['AND', ['=', 'id', objActivity.id], ['=', 'calendar', objActivity.group], ['=','user',(objActivity.me.user ? objActivity.me.user.id : objActivity.me.id)], ['=', 'type', '2']]}); 
     206                Calendar.rerenderView(true); 
     207                /********************/ 
     208                UI.dialogs.addActivity.dialog("close"); 
     209            } 
     210        } 
     211    }); 
     212}).end() 
     213             
     214.children(".cancel").click(function(){ 
     215    UI.dialogs.addActivity.dialog("close"); 
     216}).end() 
     217             
     218.children(".save").click(function(){ 
     219    /* Validação  
     220    var msg = false;                     
     221    if(msg = validDateEvent()){ 
     222        $(".new-activity-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg);  
     223        return false; 
     224    } 
     225    */ 
     226        UI.dialogs.addActivity.find('select[name="activityStatus"]').removeAttr('disabled'); 
     227    canDiscardActivityDialog = true; 
     228                         
     229        UI.dialogs.addActivity.children().find('form.form-addactivity').submit(); 
     230        UI.dialogs.addActivity.dialog("close"); 
     231 
     232}).end() 
     233                 
     234.children(".export").click(function(){ 
     235    UI.dialogs.addActivity.children().find(".form-export").submit(); 
     236}); 
     237 
     238var task_activityHtml = DataLayer.render( path+'templates/task_activity_add.ejs', {     activity: objActivity}); 
     239var blkAddTask = UI.dialogs.addActivity.find('#group_addactivity_details8').append(task_activityHtml); 
     240 
     241var dates = UI.dialogs.addActivity.find('input.date').datepicker({ 
     242    dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'), 
     243    onSelect : function( selectedDate ){ 
     244        updateMap(); 
     245    } 
     246}); 
     247 
     248blkAddTask.find('.add-activity-search .ui-icon-search').click(function(event) { 
     249    blkAddTask.find('.add-activity-search input').keydown(); 
     250}); 
     251                         
     252                         
     253blkAddTask.find('.add-activity-search input').keydown(function(event) { 
     254 
     255    if(event.keyCode == '13' || typeof(event.keyCode) == 'undefined') {  
     256    // Fazer get das tarefas     
     257        var filter =  
     258        { 
     259            filter:  
     260                ['AND', 
     261                    ['=', 'type', '2'],  
     262                    ['>=','startTime', $.now()],  
     263                    ['in', 'calendar',  
     264                        [$('div.new-activity-win.active select[name="groupFilter"]').val()] 
     265                    ] 
     266                ], criteria: {'filterTasks': true} 
     267        }; 
     268    if($(this).val() != ''){ 
     269        filter['filter'].push(['OR', 
     270                            ["i*", "summary", $(this).val()],  
     271                            ["i*", "description", $(this).val()] 
     272                           ]); 
     273    } 
     274 
     275    var result = DataLayer.get('schedulable:taskSearch', filter, true) 
     276        /** 
     277        * TODO: trocar por template 
     278        */ 
     279        blkAddTask.find('ul.search-result-list').empty().css('overflow', 'hidden'); 
     280        if (!result) { 
     281            blkAddTask.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>'); 
     282        }else{ 
     283        for(i=0; i<result.length; i++) 
     284            result[i].enabled = (blkAddTask.find('dd.task-activity-list ul.task-activity-list input[value="' +  result[i].id + '"]').length) ? false : true; 
     285                                                                                         
     286        blkAddTask.find('ul.search-result-list').append(DataLayer.render( path+'templates/task_search_itemlist.ejs', result)); 
     287 
     288        /* TODO - Verificar id da aitividade*/ 
     289        blkAddTask.find('ul.search-result-list li').click(function(event, ui){ 
     290            if ($(event.target).is('input')) { 
     291                old_item = $(event.target).parents('li'); 
     292 
     293                tasks[old_item.find('[name="id"]').val()] = { 
     294                    startDate: old_item.find('[name="taskStartDate"]').val(), 
     295                    startHour: old_item.find('[name="taskStartHour"]').val(), 
     296                    endDate: old_item.find('[name="taskEndDate"]').val(), 
     297                    endHour: old_item.find('[name="taskEndHour"]').val(), 
     298                    dueDate: old_item.find('[name="taskDueDate"]').val(), 
     299                    dueTime: old_item.find('[name="taskDueTime"]').val(), 
     300                    allDay: old_item.find('[name="taskAllDay"]').val(), 
     301                    percentage: old_item.find('[name="taskPercentage"]').val(), 
     302                    status: old_item.find('[name="taskStatus"]').val() 
     303                }; 
     304 
     305                tasks.length += 1; 
     306                                                                 
     307                blkAddTask.find('dd.task-activity-list ul.task-activity-list') 
     308                    .append(DataLayer.render(path+'templates/task_add_itemlist.ejs', [{ 
     309                        idTask: old_item.find('[name="id"]').val(), 
     310                            description: old_item.find('.description').html(), 
     311                            isWrite: false 
     312                        }])) 
     313                        .scrollTo('max'); 
     314                callbackTask(); 
     315                registerStatus(); 
     316                blkAddTask.find('.not-activity').addClass('hidden'); 
     317                old_item.remove(); 
     318            } 
     319        }); 
     320    } 
     321    event.preventDefault(); 
     322    } 
     323}); 
     324 
     325/*Carrega as tarefas já existentes em uma atividade*/ 
     326if(objActivity.tasks.length){ 
     327    tasks = objActivity.tasks; 
     328 
     329    for(var i in objActivity.tasks){ 
     330        if(i != 'length') 
     331            blkAddTask.find('dd.task-activity-list ul.task-activity-list') 
     332                .append(DataLayer.render(path+'templates/task_add_itemlist.ejs', [{ 
     333                    idTask: i, 
     334                    description: tasks[i].description, 
     335                    idTaskToActivity: tasks[i].taskToActivity, 
     336                    isWrite: true 
     337                 }])) 
     338            .scrollTo('max'); 
     339    } 
     340 
     341    callbackTask(); 
     342    registerStatus(); 
     343    blkAddTask.find('.not-activity').addClass('hidden'); 
     344} 
     345 
     346UI.dialogs.addActivity.find('.row.fileupload-buttonbar-activity .button').filter('.delete').button({ 
     347    icons: { 
     348           primary: "ui-icon-close" 
     349    }, 
     350    text: 'Excluir' 
     351}).click(function () { 
     352    $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', { 
     353        'type':     'question', 
     354        'overlay_opacity': '0.5', 
     355        'buttons':  ['Sim', 'Não'], 
     356        'onClose':  function(clicked) { 
     357            if(clicked == 'Sim'){ 
     358                 
     359                var ids = []; 
     360                $.each($('.attachment-list input'), function (i, input) { 
     361                     DataLayer.remove('schedulableToAttachment', { 
     362                        filter: ['=', 'id', ''+input.value] 
     363                        }); 
     364                }); 
     365                $('.attachment-list input').remove(); 
     366                $('.row.fileupload-buttonbar-activity .attachments-list p').remove(); 
     367            } 
     368        }}); 
     369}).end() 
     370.filter('.close').button({ 
     371    icons: { 
     372           primary: "ui-icon-close" 
     373    }, 
     374    text: false 
     375}).click(function () { 
     376    DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val()); 
     377    $(this).parents('p').remove(); 
     378}).end() 
     379.filter('.downlaod-archive').button({ 
     380    icons: { 
     381           primary: "ui-icon-arrowthickstop-1-s" 
     382    }, 
     383    text: false 
     384}); 
     385var maxSizeFile = 2000000; 
     386$('#fileuploadactivity').fileupload({ 
     387    sequentialUploads: true, 
     388    add: function (e, data) { 
     389        if(data.files[0].size < maxSizeFile) 
     390            data.submit(); 
     391    }, 
     392    change: function (e, data) { 
     393        $.each(data.files, function (index, file) { 
     394            var attach = {}; 
     395            attach.fileName = file.name; 
     396            var ext = file.name.split('.'); 
     397            if(file.name.length > 10) 
     398                attach.fileName = ext.length == 1 ? file.name.substr(0, 10) :  file.name.substr(0, 6) + '.' + ext[ext.length -1]; 
     399            attach.fileSize = formatBytes(file.size); 
     400            if(file.size > maxSizeFile) 
     401                attach.error = 'Tamanho de arquivo nao permitido!!' 
     402                                 
     403            $('div.new-activity-win .attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', { 
     404                file : attach 
     405            })); 
     406                                 
     407            if(file.size < maxSizeFile){ 
     408                $('div.new-activity-win .fileinput-button.new').append(data.fileInput[0]).removeClass('new'); 
     409                $('div.new-activity-win .attachments-list').find('[type=file]').addClass('hidden'); 
     410                                         
     411            }else 
     412                $('div.new-activity-win .fileinput-button.new').removeClass('new'); 
     413                                 
     414                                 
     415            $('div.new-activity-win .attachments-list').find('.button.close').button({ 
     416                icons: { 
     417                    primary: "ui-icon-close" 
     418                }, 
     419                text: false 
     420            }).click(function(){ 
     421                var idAttach = $(this).parent().find('input[name="fileId[]"]').val(); 
     422                $('.attachment-list').find('input[value="'+idAttach+'"]') 
     423                $(this).parent().remove(); 
     424            });  
     425                                 
     426        }) 
     427        }, 
     428    done: function(e, data){ 
     429        var currentUpload = $('div.new-activity-win .progress.after-upload:first').removeClass('after-upload').addClass('on-complete').hide(); 
     430 
     431        if(!!data.result && data.result != "[]"){ 
     432            var newAttach = (attch = jQuery.parseJSON(data.result)) ? attch : jQuery.parseJSON(data.result[0].activeElement.childNodes[0].data); 
     433            $('div.new-activity-win .attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>'); 
     434            currentUpload.removeClass('on-complete').parents('p') 
     435            .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>') 
     436            .find('.status-upload').addClass('ui-icon ui-icon-check'); 
     437        }else 
     438            currentUpload.removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel'); 
     439        } 
     440}); 
     441$('.attachments-list .button').button(); 
     442 
     443if(!!window.FormData)                    
     444$('#fileuploadactivity').bind('fileuploadstart', function () { 
     445    var widget = $(this), 
     446    progressElement = $('#fileupload-progress-activity').fadeIn(), 
     447    interval = 500, 
     448    total = 0, 
     449    loaded = 0, 
     450    loadedBefore = 0, 
     451    progressTimer, 
     452    progressHandler = function (e, data) { 
     453        loaded = data.loaded; 
     454        total = data.total; 
     455    }, 
     456    stopHandler = function () { 
     457        widget 
     458        .unbind('fileuploadprogressall', progressHandler) 
     459        .unbind('fileuploadstop', stopHandler); 
     460        window.clearInterval(progressTimer); 
     461        progressElement.fadeOut(function () { 
     462            progressElement.html(''); 
     463        }); 
     464    }, 
     465    formatTime = function (seconds) { 
     466        var date = new Date(seconds * 1000); 
     467        return ('0' + date.getUTCHours()).slice(-2) + ':' + 
     468        ('0' + date.getUTCMinutes()).slice(-2) + ':' + 
     469        ('0' + date.getUTCSeconds()).slice(-2); 
     470    }, 
     471    /* formatBytes = function (bytes) { 
     472            if (bytes >= 1000000000) { 
     473                return (bytes / 1000000000).toFixed(2) + ' GB'; 
     474            } 
     475            if (bytes >= 1000000) { 
     476                return (bytes / 1000000).toFixed(2) + ' MB'; 
     477            } 
     478            if (bytes >= 1000) { 
     479                return (bytes / 1000).toFixed(2) + ' KB'; 
     480            } 
     481            return bytes + ' B'; 
     482        },*/ 
     483    formatPercentage = function (floatValue) { 
     484        return (floatValue * 100).toFixed(2) + ' %'; 
     485    }, 
     486    updateProgressElement = function (loaded, total, bps) { 
     487        progressElement.html( 
     488            formatBytes(bps) + 'ps | ' + 
     489            formatTime((total - loaded) / bps) + ' | ' + 
     490            formatPercentage(loaded / total) + ' | ' + 
     491            formatBytes(loaded) + ' / ' + formatBytes(total) 
     492            ); 
     493    }, 
     494    intervalHandler = function () { 
     495        var diff = loaded - loadedBefore; 
     496        if (!diff) { 
     497            return; 
     498        } 
     499        loadedBefore = loaded; 
     500        updateProgressElement( 
     501            loaded, 
     502            total, 
     503            diff * (1000 / interval) 
     504            ); 
     505    }; 
     506    widget 
     507    .bind('fileuploadprogressall', progressHandler) 
     508    .bind('fileuploadstop', stopHandler); 
     509    progressTimer = window.setInterval(intervalHandler, interval); 
     510}); 
     511 
     512UI.dialogs.addActivity.find(':input').change(function(event){ 
     513    if (event.keyCode != '27' && event.keyCode != '13') 
     514        canDiscardActivityDialog = false; 
     515}).keydown(function(event){ 
     516    if (event.keyCode != '27' && event.keyCode != '13') 
     517        canDiscardActivityDialog = false; 
     518}); 
     519 
     520UI.dialogs.addActivity.dialog('open'); 
     521} 
     522 
     523function refreshTaskActivity(){ 
     524    updateActivity = false; 
     525 
     526    var objActivity = DataLayer.get('schedulable:activity', UI.dialogs.addActivity.find('input[name="idActivity"]').val()); 
     527    var blkAddTask = UI.dialogs.addActivity.find('#group_addactivity_details8'); 
     528    var blkAuto = UI.dialogs.addActivity.find('#group_addactivity_details1'); 
    13529     
    14     var registerStatus = function(){ 
    15         var blkAuto = UI.dialogs.addActivity.find('#group_addactivity_details1'); 
    16  
    17         var startDate = false; 
    18         var endDate = new Date; 
    19         var dueDate = new Date; 
    20         var percentage = 0;              
    21                 var statusTasks = {1: 0, 2: 0, 3: 0, 4: 0}; 
    22                  
    23                 var allDay = true; 
    24  
    25         var formatString =  User.preferences.dateFormat + " " +  User.preferences.hourFormat; 
    26  
    27         if(tasks.length == 0){ 
    28  
    29             startDate = new Date(); 
    30             var configData = (startDate.toString('mm') < 30)  ? {minutes: (30 - parseInt(startDate.toString('mm')))} : {hours: 1, minutes: '-'+startDate.toString('mm')}; 
    31             startDate.add(configData);  
    32  
    33             endDate = new Date(dateCalendar.decodeRange(startDate, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ?  (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration)))); 
    34  
    35             blkAuto.find('input[name="startDate"]').val(startDate.toString(User.preferences.dateFormat )); 
    36             blkAuto.find('input[name="startHour"]').val(startDate.toString(User.preferences.hourFormat )); 
    37  
    38             blkAuto.find('input[name="endDate"]').val(endDate.toString(User.preferences.dateFormat )); 
    39             blkAuto.find('input[name="endHour"]').val(endDate.toString(User.preferences.hourFormat )); 
    40  
    41             blkAuto.find('input[name="dueDate"]').val(''); 
    42             blkAuto.find('input[name="dueHour"]').val(''); 
    43                          
    44             blkAuto.find('input[name="percentage"]').val(percentage); 
    45                          
    46                         todoStatus('addActivity', 1); 
    47                  
    48                         UI.dialogs.addActivity.find('select[name="activityStatus"] option[value="'+1+'"]').attr('selected','selected'); 
    49  
    50             blkAuto.find('input[name="allDay"]').attr('checked', false); 
    51  
    52             return true; 
    53         } 
    54  
    55         for (var i in tasks){ 
    56  
    57             if(i == 'length') 
    58                 continue; 
    59                          
    60                         statusTasks[tasks[i].status]++; 
    61                          
    62             stTime = Date.parseExact( tasks[i].startDate + " "+$.trim( tasks[i].startHour) , formatString); 
    63             enTime = Date.parseExact( tasks[i].endDate + " "+$.trim( tasks[i].endHour), formatString ); 
    64              
    65             startDate = (startDate && startDate.compareTo(stTime) == -1) ? startDate : stTime; 
    66             endDate = endDate.compareTo(enTime) == -1 ? enTime : endDate; 
    67              
    68             if(tasks[i].dueDate != ''){ 
    69                 pvTime = Date.parseExact( tasks[i].dueDate + " "+$.trim( tasks[i].dueTime), formatString ); 
    70                 dueDate = dueDate.compareTo(pvTime) == -1 ? pvTime : dueDate; 
    71             } 
    72  
    73             if(parseInt(tasks[i].percentage) > 0) 
    74                 percentage += parseInt((100 / tasks.length)) * ( parseInt(tasks[i].percentage) / 100); 
    75         } 
    76                 var statusActivity = 1; 
    77                  
    78                 if(statusTasks[4] != 0) 
    79                         statusActivity = 4; 
    80                 else if(statusTasks[2] != 0) 
    81                         statusActivity = 2; 
    82                 else if(statusTasks[3] == tasks.length) 
    83                         statusActivity = 3; 
    84                 else if(statusTasks[1] == tasks.length) 
    85                         statusActivity = 1; 
    86                 else 
    87                         statusActivity = 2;                      
    88                          
    89                 todoStatus('addActivity', statusActivity); 
    90                  
    91                 UI.dialogs.addActivity.find('select[name="activityStatus"] option[value="'+statusActivity+'"]').attr('selected','selected'); 
    92                  
    93         dueDate = dueDate.compareTo(endDate) == -1 ? endDate : dueDate; 
    94  
    95         blkAuto.find('input[name="startDate"]').val(startDate.toString(User.preferences.dateFormat )); 
    96         blkAuto.find('input[name="startHour"]').val(startDate.toString(User.preferences.hourFormat )); 
    97  
    98         blkAuto.find('input[name="endDate"]').val(endDate.toString(User.preferences.dateFormat )); 
    99         blkAuto.find('input[name="endHour"]').val(endDate.toString(User.preferences.hourFormat )); 
    100  
    101         blkAuto.find('input[name="dueDate"]').val(dueDate.toString(User.preferences.dateFormat )); 
    102         blkAuto.find('input[name="dueHour"]').val(dueDate.toString(User.preferences.hourFormat )); 
    103  
    104         blkAuto.find('input[name="percentage"]').val(percentage); 
    105  
    106         blkAuto.find('input[name="allDay"]').attr('checked', (!!(startDate.compareTo(endDate) == 0) || (startDate.toString('HH:mm') == endDate.toString('HH:mm')) ? true : false)); 
    107     } 
    108  
    109  
    110     var callbackTask = function(){ 
     530   tasks = objActivity.tasks; 
     531   blkAddTask.find('dd.task-activity-list ul.task-activity-list').html(''); 
     532    
     533   for(var i in tasks) 
     534       DataLayer.remove('schedulable', i, false); 
     535 
     536    for(var i in objActivity.tasks){ 
     537        if(i != 'length') 
     538            blkAddTask.find('dd.task-activity-list ul.task-activity-list') 
     539                .append(DataLayer.render('templates/task_add_itemlist.ejs', [{ 
     540                    idTask: i, 
     541                    description: tasks[i].description, 
     542                    idTaskToActivity: tasks[i].taskToActivity, 
     543                    isWrite: true 
     544                 }])) 
     545            .scrollTo('max'); 
     546    } 
     547 
     548    callbackTask(blkAddTask); 
     549    registerStatus(blkAuto); 
     550} 
     551 
     552function registerStatus(blkAuto){ 
     553    if(!blkAuto) 
     554        blkAuto = UI.dialogs.addActivity.find('#group_addactivity_details1'); 
     555 
     556    var startDate = false; 
     557    var endDate = new Date; 
     558    var dueDate = new Date; 
     559    var percentage = 0;          
     560            var statusTasks = {1: 0, 2: 0, 3: 0, 4: 0}; 
     561            var allDay = true; 
     562 
     563    var formatString =  User.preferences.dateFormat + " " +  User.preferences.hourFormat; 
     564 
     565    if(tasks.length == 0){ 
     566 
     567        startDate = new Date(); 
     568        var configData = (startDate.toString('mm') < 30)  ? {minutes: (30 - parseInt(startDate.toString('mm')))} : {hours: 1, minutes: '-'+startDate.toString('mm')}; 
     569        startDate.add(configData);  
     570 
     571        endDate = new Date(dateCalendar.decodeRange(startDate, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ?  (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration)))); 
     572 
     573        blkAuto.find('input[name="startDate"]').val(startDate.toString(User.preferences.dateFormat )); 
     574        blkAuto.find('input[name="startHour"]').val(startDate.toString(User.preferences.hourFormat )); 
     575 
     576        blkAuto.find('input[name="endDate"]').val(endDate.toString(User.preferences.dateFormat )); 
     577        blkAuto.find('input[name="endHour"]').val(endDate.toString(User.preferences.hourFormat )); 
     578 
     579        blkAuto.find('input[name="dueDate"]').val(''); 
     580        blkAuto.find('input[name="dueHour"]').val(''); 
     581 
     582        blkAuto.find('input[name="percentage"]').val(percentage); 
     583 
     584        todoStatus('addActivity', 1); 
     585 
     586        UI.dialogs.addActivity.find('select[name="activityStatus"] option[value="'+1+'"]').attr('selected','selected'); 
     587 
     588        blkAuto.find('input[name="allDay"]').attr('checked', false); 
     589 
     590        return true; 
     591    } 
     592 
     593    for (var i in tasks){ 
     594 
     595        if(i == 'length') 
     596            continue; 
     597 
     598        statusTasks[tasks[i].status]++; 
     599 
     600        var stTime = Date.parseExact( tasks[i].startDate + " "+$.trim( tasks[i].startHour) , formatString); 
     601        var enTime = Date.parseExact( tasks[i].endDate + " "+$.trim( tasks[i].endHour), formatString ); 
     602 
     603        startDate = (startDate && startDate.compareTo(stTime) == -1) ? startDate : stTime; 
     604        endDate = endDate.compareTo(enTime) == -1 ? enTime : endDate; 
     605 
     606        if(tasks[i].dueDate != ''){ 
     607            var pvTime = Date.parseExact( tasks[i].dueDate + " "+$.trim( tasks[i].dueTime), formatString ); 
     608            dueDate = dueDate.compareTo(pvTime) == -1 ? pvTime : dueDate; 
     609        } 
     610 
     611        if(parseInt(tasks[i].percentage) > 0) 
     612            percentage += parseInt(parseInt((100 / tasks.length)) * ( parseInt(tasks[i].percentage) / 100)); 
     613    } 
     614    var statusActivity = 1; 
     615 
     616    if(statusTasks[4] != 0) 
     617        statusActivity = 4; 
     618    else if(statusTasks[2] != 0) 
     619        statusActivity = 2; 
     620    else if(statusTasks[3] == tasks.length) 
     621        statusActivity = 3; 
     622    else if(statusTasks[1] == tasks.length) 
     623        statusActivity = 1; 
     624    else 
     625        statusActivity = 2;                      
     626 
     627    todoStatus('addActivity', statusActivity); 
     628 
     629    UI.dialogs.addActivity.find('select[name="activityStatus"] option[value="'+statusActivity+'"]').attr('selected','selected'); 
     630 
     631    dueDate = dueDate.compareTo(endDate) == -1 ? endDate : dueDate; 
     632 
     633    blkAuto.find('input[name="startDate"]').val(startDate.toString(User.preferences.dateFormat )); 
     634    blkAuto.find('input[name="startHour"]').val(startDate.toString(User.preferences.hourFormat )); 
     635 
     636    blkAuto.find('input[name="endDate"]').val(endDate.toString(User.preferences.dateFormat )); 
     637    blkAuto.find('input[name="endHour"]').val(endDate.toString(User.preferences.hourFormat )); 
     638 
     639    blkAuto.find('input[name="dueDate"]').val(dueDate.toString(User.preferences.dateFormat )); 
     640    blkAuto.find('input[name="dueHour"]').val(dueDate.toString(User.preferences.hourFormat )); 
     641 
     642    blkAuto.find('input[name="percentage"]').val(percentage); 
     643 
     644    blkAuto.find('input[name="allDay"]').attr('checked', (!!(startDate.compareTo(endDate) == 0) || (startDate.toString('HH:mm') == endDate.toString('HH:mm')) ? true : false)); 
     645} 
     646 
     647function callbackTask(blkAddTask){ 
     648        if(!blkAddTask) 
     649            blkAddTask = UI.dialogs.addActivity.find('#group_addactivity_details8'); 
    111650 
    112651        blkAddTask.find("li .button").filter(".close.new").button({ 
     
    211750     }) 
    212751 .addClass('tiny disable ui-button-disabled ui-state-disabled') 
    213  .removeClass('new').end()     
     752 .removeClass('new').end() 
     753 .filter(".edit.new").button({ 
     754            icons: { 
     755            primary: "ui-icon-pencil" 
     756            }, 
     757            text: false 
     758        }).click(function () { 
     759            var task = DataLayer.get('schedulable:task', $(this).parents('li').find('input[name="idtask[]"]').val()); 
     760            taskDetails(task, true, '',true, null, true);            
     761        }) 
     762        .addClass('tiny disable ui-button-disabled ui-state-disabled') 
     763        .removeClass('new').end() 
    214764 
    215765        UI.dialogs.addActivity.find('.task-activity-list li').hover( 
     
    226776        );         
    227777    } 
    228  
    229  
    230     /** 
    231          * canDiscardActivityDialog deve ser true se não houver alterações no evento 
    232          */ 
    233     canDiscardActivityDialog = true; 
    234     /** 
    235          * zebraDiscardActivityDialog é uma flag indicando que uma janela de confirmação (Zebra_Dialog) 
    236          * já está aberta na tela, uma vez que não é possivel acessar o evento ESC utilizado para fechá-la 
    237          */ 
    238     zebraDiscardActivityDialog = false; 
    239          
    240         var html = DataLayer.render( path+'templates/activity_add.ejs', { 
    241             activity:objActivity 
    242         });      
    243                          
    244         if (!UI.dialogs.addActivity) { 
    245  
    246             UI.dialogs.addActivity = jQuery('#sandbox').append('<div title="Criar Atividade" class="new-activity-win active"> <div>').find('.new-activity-win.active').html(html).dialog({ 
    247                 resizable: false,  
    248                 modal:true,  
    249                 autoOpen: false, 
    250                 width:735,  
    251                 position: 'center',  
    252                 close: function(event, ui) { 
    253                         /** 
    254                          * Remove tooltip possivelmente existente 
    255                          */ 
    256                         if ($('.qtip.qtip-blue.qtip-active').length) 
    257                                 $('.qtip.qtip-blue.qtip-active').qtip('destroy');                                                
    258                          
    259                 attendees  = {}; 
    260                 }, 
    261                 beforeClose: function(event, ui) { 
    262                  
    263                     if (!canDiscardActivityDialog && !zebraDiscardActivityDialog) { 
    264                                 zebraDiscardActivityDialog = true; 
    265                                 window.setTimeout(function() { 
    266                                     $.Zebra_Dialog('Suas alterações na atividade não foram salvas. Deseja descartar as alterações?', { 
    267                                         'type':     'question', 
    268                                         'overlay_opacity': '0.5', 
    269                                         'buttons':  ['Descartar alterações', 'Continuar editando'], 
    270                                         'onClose':  function(clicked) { 
    271                                             if(clicked == 'Descartar alterações') { 
    272                                                 canDiscardActivityDialog = true; 
    273                                                 /** 
    274                                                 *Remoção dos anexos do eventos caso seja cancelado a edição 
    275                                                 */ 
    276                                                 DataLayer.rollback(); 
    277  
    278                                                 var ids = false; 
    279                                                 $.each($('.attachment-list input'), function (i, input) { 
    280                                                     DataLayer.put('attachment', {id: ''+input.value}); 
    281                                                     DataLayer.remove('attachment', ''+input.value); 
    282                                                         ids = true; 
    283                                                 }); 
    284                                                 if(ids) 
    285                                                         DataLayer.commit(); 
    286  
    287                                                 UI.dialogs.addActivity.dialog('close'); 
    288                                             }else{ 
    289                                                    zebraDiscardActivityDialog = false; 
    290                                             } 
    291                                                                                          
    292                                             /** 
    293                                             * Uma vez aberta uma janela de confirmação (Zebra_Dialog), ao fechá-la 
    294                                             * com ESC, para que o evento ESC não seja propagado para fechamento da 
    295                                             * janela de edição de eventos, deve ser setada uma flag indicando que 
    296                                             * já existe uma janela de confirmação aberta. 
    297                                             */ 
    298                                             if (!clicked) { 
    299                                                 window.setTimeout(function() { 
    300                                                     zebraDiscardActivityDialog = false; 
    301                                                 }, 200); 
    302                                             } 
    303                                         } 
    304                             }); 
    305                                                                          
    306                         }, 300); 
    307             } 
    308             //DataLayer.rollback(); 
    309             return canDiscardActivityDialog; 
    310         }, 
    311         dragStart: function(event, ui) { 
    312             if ($('.qtip.qtip-blue.qtip-active').length) 
    313                 $('.qtip.qtip-blue.qtip-active').qtip('destroy'); 
    314        } 
    315     }); 
    316                                  
    317         } else { 
    318             UI.dialogs.addActivity.html(html); 
    319         } 
    320  
    321 /* Checkbox allday */ 
    322 UI.dialogs.addActivity.find('input[name="allDay"]').click(function(){ 
    323     $(this).attr("checked") ?  
    324     UI.dialogs.addActivity.find('.start-time, .end-time').addClass('hidden') : 
    325     UI.dialogs.addActivity.find('.start-time, .end-time').removeClass('hidden');  
    326 }); 
    327                  
    328 var tabs = UI.dialogs.addActivity.children('.content').tabs({ 
    329         select: function(event, ui) {  
    330                 if ($('.qtip.qtip-blue.qtip-active').length) 
    331                         $('.qtip.qtip-blue.qtip-active').qtip('destroy'); 
    332         }        
    333         }); 
    334  
    335 var group = DataLayer.get('calendar', objActivity.group); 
    336                                  
    337 if (group.timezone != objActivity.timezone){ 
    338     UI.dialogs.addActivity.find('.group_addactivity_details_lnk_timezone').find('option[value="'+objActivity.timezone+'"]').attr('selected','selected').trigger('change'); 
    339     UI.dialogs.addActivity.find('.group_addactivity_details_lnk_timezone').addClass('hidden'); 
    340     $('.group-addevent-details-txt-timezone').removeClass('hidden'); 
    341                          
    342 } 
    343  
    344 UI.dialogs.addActivity.find('.group_addactivity_details_lnk_timezone').click(function(e){ 
    345     $(this).addClass('hidden'); 
    346     $('.group-addactivity-details-txt-timezone').removeClass('hidden'); 
    347     e.preventDefault(); 
    348 }); 
    349  
    350 UI.dialogs.addActivity.find('.button.remove').button({ 
    351     text:false,  
    352     icons:{ 
    353         primary:'ui-icon-close' 
    354     } 
    355 }).click(function(el){ 
    356     var id; 
    357     if( id = $(this).parent().find('input[name="alarmId[]"]').val()) 
    358         DataLayer.remove('alarm', id); 
    359     $(this).parent().remove().find('li').is(':empty'); 
    360 }); 
    361  
    362 UI.dialogs.addActivity.find('.button-add-alarms').click(function(){ 
    363             DataLayer.render( 'templates/alarms_add_itemlist.ejs', {type: 0}, function( template ){                      
    364             jQuery('.activity-alarms-list').append(template) 
    365             .find('li:last label:eq(0)').remove().end() 
    366             .find('.number').numeric().end() 
    367             .find('.button.remove').button({ 
    368                 text:false,  
    369                 icons:{ 
    370                     primary:'ui-icon-close' 
    371                 } 
    372             }).click(function(el) { 
    373                 $(this).parent().remove(); 
    374             });     
    375             }); 
    376         }); 
    377  
    378 /*Seleciona a agenda padrão para visualização/edição de um evento*/ 
    379 if(objActivity.id) 
    380     UI.dialogs.addActivity.find('select[name="group"] option[value="'+objActivity.group+'"]').attr('selected','selected').trigger('change'); 
    381  
    382 UI.dialogs.addActivity.find('.button').button(); 
    383     UI.dialogs.addActivity.find('.button.add').button({ 
    384         icons: { 
    385            secondary: "ui-icon-plus" 
    386         } 
    387 }); 
    388  
    389 todoStatus('addActivity', (objActivity.activityStatus != undefined) ? objActivity.activityStatus : 1); 
    390  
    391 UI.dialogs.addActivity.find('select[name="activityStatus"]').attr('disabled', 'disabled'); 
    392  
    393 // ==== validation events ==== 
    394 UI.dialogs.addActivity.find(".input-group .h1").Watermark("Atividade sem título"); 
    395  
    396 UI.dialogs.addActivity.find(".number").numeric(); 
    397  
    398 User.preferences.dateFormat.indexOf('-') > 0 ?  
    399 UI.dialogs.addActivity.find(".date").mask("99-99-9999", { 
    400     completed:function(){ 
    401         updateMap(); 
    402     } 
    403 }) :  
    404  
    405 UI.dialogs.addActivity.find(".date").mask("99/99/9999", { 
    406     completed:function(){ 
    407         updateMap(); 
    408     } 
    409 }); 
    410  
    411 UI.dialogs.addActivity.find(".menu-addactivity") 
    412 .children(".delete").click(function(){ 
    413     $.Zebra_Dialog('Tem certeza que deseja excluir a atividade?', { 
    414         'type':     'question', 
    415         'overlay_opacity': '0.5', 
    416         'buttons':  ['Sim', 'Não'], 
    417         'onClose':  function(clicked) { 
    418             if(clicked == 'Sim'){ 
    419                 canDiscardActivityDialog = true; 
    420                 /* Remove por filtro */ 
    421                 DataLayer.removeFilter('schedulable', {filter: ['AND', ['=', 'id', objActivity.id], ['=', 'calendar', objActivity.group], ['=','user',(objActivity.me.user ? objActivity.me.user.id : objActivity.me.id)], ['=', 'type', '2']]}); 
    422                 Calendar.rerenderView(true); 
    423                 /********************/ 
    424                 UI.dialogs.addActivity.dialog("close"); 
    425             } 
    426         } 
    427     }); 
    428 }).end() 
    429              
    430 .children(".cancel").click(function(){ 
    431     UI.dialogs.addActivity.dialog("close"); 
    432 }).end() 
    433              
    434 .children(".save").click(function(){ 
    435     /* Validação  
    436     var msg = false;                     
    437     if(msg = validDateEvent()){ 
    438         $(".new-activity-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg);  
    439         return false; 
    440     } 
    441     */ 
    442         UI.dialogs.addActivity.find('select[name="activityStatus"]').removeAttr('disabled'); 
    443     canDiscardActivityDialog = true; 
    444                          
    445         UI.dialogs.addActivity.children().find('form.form-addactivity').submit(); 
    446         UI.dialogs.addActivity.dialog("close"); 
    447  
    448 }).end() 
    449                  
    450 .children(".export").click(function(){ 
    451     UI.dialogs.addActivity.children().find(".form-export").submit(); 
    452 }); 
    453  
    454 var task_activityHtml = DataLayer.render( path+'templates/task_activity_add.ejs', {     activity: objActivity}); 
    455 var blkAddTask = UI.dialogs.addActivity.find('#group_addactivity_details8').append(task_activityHtml); 
    456  
    457 var dates = UI.dialogs.addActivity.find('input.date').datepicker({ 
    458     dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'), 
    459     onSelect : function( selectedDate ){ 
    460         updateMap(); 
    461     } 
    462 }); 
    463  
    464 blkAddTask.find('.add-activity-search .ui-icon-search').click(function(event) { 
    465     blkAddTask.find('.add-activity-search input').keydown(); 
    466 }); 
    467                          
    468                          
    469 blkAddTask.find('.add-activity-search input').keydown(function(event) { 
    470  
    471     if(event.keyCode == '13' || typeof(event.keyCode) == 'undefined') {  
    472     // Fazer get das tarefas     
    473         var filter =  
    474         { 
    475             filter:  
    476                 ['AND', 
    477                     ['=', 'type', '2'],  
    478                     ['>=','startTime', $.now()],  
    479                     ['in', 'calendar',  
    480                         [$('div.new-activity-win.active select[name="groupFilter"]').val()] 
    481                     ] 
    482                 ], criteria: {'filterTasks': true} 
    483         }; 
    484     if($(this).val() != ''){ 
    485         filter['filter'].push(['OR', 
    486                             ["i*", "summary", $(this).val()],  
    487                             ["i*", "description", $(this).val()] 
    488                            ]); 
    489     } 
    490  
    491     var result = DataLayer.get('schedulable:taskSearch', filter, true) 
    492         /** 
    493         * TODO: trocar por template 
    494         */ 
    495         blkAddTask.find('ul.search-result-list').empty().css('overflow', 'hidden'); 
    496         if (!result) { 
    497             blkAddTask.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>'); 
    498         }else{ 
    499         for(i=0; i<result.length; i++) 
    500             result[i].enabled = (blkAddTask.find('dd.task-activity-list ul.task-activity-list input[value="' +  result[i].id + '"]').length) ? false : true; 
    501                                                                                          
    502         blkAddTask.find('ul.search-result-list').append(DataLayer.render( path+'templates/task_search_itemlist.ejs', result)); 
    503  
    504         /* TODO - Verificar id da aitividade*/ 
    505         blkAddTask.find('ul.search-result-list li').click(function(event, ui){ 
    506             if ($(event.target).is('input')) { 
    507                 old_item = $(event.target).parents('li'); 
    508  
    509                 tasks[old_item.find('[name="id"]').val()] = { 
    510                     startDate: old_item.find('[name="taskStartDate"]').val(), 
    511                     startHour: old_item.find('[name="taskStartHour"]').val(), 
    512                     endDate: old_item.find('[name="taskEndDate"]').val(), 
    513                     endHour: old_item.find('[name="taskEndHour"]').val(), 
    514                     dueDate: old_item.find('[name="taskDueDate"]').val(), 
    515                     dueTime: old_item.find('[name="taskDueTime"]').val(), 
    516                     allDay: old_item.find('[name="taskAllDay"]').val(), 
    517                     percentage: old_item.find('[name="taskPercentage"]').val(), 
    518                     status: old_item.find('[name="taskStatus"]').val() 
    519                 }; 
    520  
    521                 tasks.length += 1; 
    522                                                                  
    523                 blkAddTask.find('dd.task-activity-list ul.task-activity-list') 
    524                     .append(DataLayer.render(path+'templates/task_add_itemlist.ejs', [{ 
    525                         idTask: old_item.find('[name="id"]').val(), 
    526                             description: old_item.find('.description').html() 
    527                         }])) 
    528                         .scrollTo('max'); 
    529                 callbackTask(); 
    530                 registerStatus(); 
    531                 blkAddTask.find('.not-activity').addClass('hidden'); 
    532                 old_item.remove(); 
    533             } 
    534         }); 
    535     } 
    536     event.preventDefault(); 
    537     } 
    538 }); 
    539  
    540 /*Carrega as tarefas já existentes em uma atividade*/ 
    541 if(objActivity.tasks.length){ 
    542     tasks = objActivity.tasks; 
    543  
    544     for(var i in objActivity.tasks){ 
    545         if(i != 'length') 
    546             blkAddTask.find('dd.task-activity-list ul.task-activity-list') 
    547                 .append(DataLayer.render(path+'templates/task_add_itemlist.ejs', [{ 
    548                     idTask: i, 
    549                     description: tasks[i].description, 
    550                     idTaskToActivity: tasks[i].taskToActivity 
    551                  }])) 
    552             .scrollTo('max'); 
    553     } 
    554  
    555     callbackTask(); 
    556     registerStatus(); 
    557     blkAddTask.find('.not-activity').addClass('hidden'); 
    558 } 
    559  
    560 UI.dialogs.addActivity.find('.row.fileupload-buttonbar-activity .button').filter('.delete').button({ 
    561     icons: { 
    562            primary: "ui-icon-close" 
    563     }, 
    564     text: 'Excluir' 
    565 }).click(function () { 
    566     $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', { 
    567         'type':     'question', 
    568         'overlay_opacity': '0.5', 
    569         'buttons':  ['Sim', 'Não'], 
    570         'onClose':  function(clicked) { 
    571             if(clicked == 'Sim'){ 
    572                  
    573                 var ids = []; 
    574                 $.each($('.attachment-list input'), function (i, input) { 
    575                      DataLayer.remove('schedulableToAttachment', { 
    576                         filter: ['=', 'id', ''+input.value] 
    577                         }); 
    578                 }); 
    579                 $('.attachment-list input').remove(); 
    580                 $('.row.fileupload-buttonbar-activity .attachments-list p').remove(); 
    581             } 
    582         }}); 
    583 }).end() 
    584 .filter('.close').button({ 
    585     icons: { 
    586            primary: "ui-icon-close" 
    587     }, 
    588     text: false 
    589 }).click(function () { 
    590     DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val()); 
    591     $(this).parents('p').remove(); 
    592 }).end() 
    593 .filter('.downlaod-archive').button({ 
    594     icons: { 
    595            primary: "ui-icon-arrowthickstop-1-s" 
    596     }, 
    597     text: false 
    598 }); 
    599 var maxSizeFile = 2000000; 
    600 $('#fileuploadactivity').fileupload({ 
    601     sequentialUploads: true, 
    602     add: function (e, data) { 
    603         if(data.files[0].size < maxSizeFile) 
    604             data.submit(); 
    605     }, 
    606     change: function (e, data) { 
    607         $.each(data.files, function (index, file) { 
    608             var attach = {}; 
    609             attach.fileName = file.name; 
    610             var ext = file.name.split('.'); 
    611             if(file.name.length > 10) 
    612                 attach.fileName = ext.length == 1 ? file.name.substr(0, 10) :  file.name.substr(0, 6) + '.' + ext[ext.length -1]; 
    613             attach.fileSize = formatBytes(file.size); 
    614             if(file.size > maxSizeFile) 
    615                 attach.error = 'Tamanho de arquivo nao permitido!!' 
    616                                  
    617             $('div.new-activity-win .attachments-list').append(DataLayer.render(path+'templates/attachment_add_itemlist.ejs', { 
    618                 file : attach 
    619             })); 
    620                                  
    621             if(file.size < maxSizeFile){ 
    622                 $('div.new-activity-win .fileinput-button.new').append(data.fileInput[0]).removeClass('new'); 
    623                 $('div.new-activity-win .attachments-list').find('[type=file]').addClass('hidden'); 
    624                                          
    625             }else 
    626                 $('div.new-activity-win .fileinput-button.new').removeClass('new'); 
    627                                  
    628                                  
    629             $('div.new-activity-win .attachments-list').find('.button.close').button({ 
    630                 icons: { 
    631                     primary: "ui-icon-close" 
    632                 }, 
    633                 text: false 
    634             }).click(function(){ 
    635                 var idAttach = $(this).parent().find('input[name="fileId[]"]').val(); 
    636                 $('.attachment-list').find('input[value="'+idAttach+'"]') 
    637                 $(this).parent().remove(); 
    638             });  
    639                                  
    640         }) 
    641         }, 
    642     done: function(e, data){ 
    643         var currentUpload = $('div.new-activity-win .progress.after-upload:first').removeClass('after-upload').addClass('on-complete').hide(); 
    644  
    645         if(!!data.result && data.result != "[]"){ 
    646             var newAttach = (attch = jQuery.parseJSON(data.result)) ? attch : jQuery.parseJSON(data.result[0].activeElement.childNodes[0].data); 
    647             $('div.new-activity-win .attachment-list').append('<input tyepe="hidden" name="attachment[]" value="'+newAttach['attachment'][0][0].id+'"/>'); 
    648             currentUpload.removeClass('on-complete').parents('p') 
    649             .append('<input type="hidden" name="fileId[]" value="'+newAttach['attachment'][0][0].id+'"/>') 
    650             .find('.status-upload').addClass('ui-icon ui-icon-check'); 
    651         }else 
    652             currentUpload.removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel'); 
    653         } 
    654 }); 
    655 $('.attachments-list .button').button(); 
    656  
    657 if(!!window.FormData)                    
    658 $('#fileuploadactivity').bind('fileuploadstart', function () { 
    659     var widget = $(this), 
    660     progressElement = $('#fileupload-progress-activity').fadeIn(), 
    661     interval = 500, 
    662     total = 0, 
    663     loaded = 0, 
    664     loadedBefore = 0, 
    665     progressTimer, 
    666     progressHandler = function (e, data) { 
    667         loaded = data.loaded; 
    668         total = data.total; 
    669     }, 
    670     stopHandler = function () { 
    671         widget 
    672         .unbind('fileuploadprogressall', progressHandler) 
    673         .unbind('fileuploadstop', stopHandler); 
    674         window.clearInterval(progressTimer); 
    675         progressElement.fadeOut(function () { 
    676             progressElement.html(''); 
    677         }); 
    678     }, 
    679     formatTime = function (seconds) { 
    680         var date = new Date(seconds * 1000); 
    681         return ('0' + date.getUTCHours()).slice(-2) + ':' + 
    682         ('0' + date.getUTCMinutes()).slice(-2) + ':' + 
    683         ('0' + date.getUTCSeconds()).slice(-2); 
    684     }, 
    685     /* formatBytes = function (bytes) { 
    686             if (bytes >= 1000000000) { 
    687                 return (bytes / 1000000000).toFixed(2) + ' GB'; 
    688             } 
    689             if (bytes >= 1000000) { 
    690                 return (bytes / 1000000).toFixed(2) + ' MB'; 
    691             } 
    692             if (bytes >= 1000) { 
    693                 return (bytes / 1000).toFixed(2) + ' KB'; 
    694             } 
    695             return bytes + ' B'; 
    696         },*/ 
    697     formatPercentage = function (floatValue) { 
    698         return (floatValue * 100).toFixed(2) + ' %'; 
    699     }, 
    700     updateProgressElement = function (loaded, total, bps) { 
    701         progressElement.html( 
    702             formatBytes(bps) + 'ps | ' + 
    703             formatTime((total - loaded) / bps) + ' | ' + 
    704             formatPercentage(loaded / total) + ' | ' + 
    705             formatBytes(loaded) + ' / ' + formatBytes(total) 
    706             ); 
    707     }, 
    708     intervalHandler = function () { 
    709         var diff = loaded - loadedBefore; 
    710         if (!diff) { 
    711             return; 
    712         } 
    713         loadedBefore = loaded; 
    714         updateProgressElement( 
    715             loaded, 
    716             total, 
    717             diff * (1000 / interval) 
    718             ); 
    719     }; 
    720     widget 
    721     .bind('fileuploadprogressall', progressHandler) 
    722     .bind('fileuploadstop', stopHandler); 
    723     progressTimer = window.setInterval(intervalHandler, interval); 
    724 }); 
    725  
    726 UI.dialogs.addActivity.find(':input').change(function(event){ 
    727     if (event.keyCode != '27' && event.keyCode != '13') 
    728         canDiscardActivityDialog = false; 
    729 }).keydown(function(event){ 
    730     if (event.keyCode != '27' && event.keyCode != '13') 
    731         canDiscardActivityDialog = false; 
    732 }); 
    733  
    734 UI.dialogs.addActivity.dialog('open'); 
    735 } 
  • sandbox/2.4.2-expresso1/prototype/modules/calendar/js/calendar.codecs.js

    r6974 r6977  
    3232    } 
    3333} 
     34 
     35updateActivity = false; 
    3436 
    3537constantsParticipant = { 
     
    196198        DataLayer.commit( false, false, function(){      
    197199            Calendar.rerenderView(true); 
     200            if(updateActivity) 
     201                refreshTaskActivity(); 
    198202        }); 
    199203    } 
  • sandbox/2.4.2-expresso1/prototype/modules/calendar/js/task.helpers.js

    r6974 r6977  
    9999} 
    100100 
    101 function taskDetails(objTask, decoded, path, isMail, repeat) { 
     101function taskDetails(objTask, decoded, path, isMail, repeat, isActivityView) { 
    102102 
    103103    $('.qtip.qtip-blue').remove(); 
     
    278278                                    canDiscardTaskDialog = true; 
    279279                                    /** 
    280                                      *Remoção dos anexos da task caso seja cancelado a ediçãoo 
     280                                     *Remoção dos anexos da task caso seja cancelado a edição 
    281281                                     */ 
    282282                                    DataLayer.rollback(); 
     
    487487        UI.dialogs.addTask.find('input[name="summary"]').focus(); 
    488488                 
    489                 if (msg = validDateTask()) { 
     489        if (msg = validDateTask()) { 
    490490            $(".new-task-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg); 
    491491            return false; 
    492492        } 
    493                 canDiscardTaskDialog = true; 
     493        canDiscardTaskDialog = true; 
     494         
     495        if(isActivityView) 
     496            updateActivity = true; 
    494497 
    495498        UI.dialogs.addTask.children().find('form.form-addtask').submit(); 
  • sandbox/2.4.2-expresso1/prototype/modules/calendar/templates/task_add_itemlist.ejs

    r6974 r6977  
    22    <div style="overflow:hidden; width:100%; display:table;">    
    33        <div class="activity-options" style="float: right; margin: 0 10px 0 0;"> 
    4             <a class="button info activity-options-button-edit new ui-icon-notice">Informações</a> 
     4            <%if(data[0].isWrite){%> 
     5                <a class="button edit activity-options-button-edit new ui-icon-pencil">Editar</a> 
     6            <%}%> 
     7            <a class="button info activity-options-button-notice new ui-icon-notice">Informações</a> 
    58            <a class="button close new">Remover</a> 
    69        </div>   
Note: See TracChangeset for help on using the changeset viewer.