Changeset 8232 for branches/2.5/prototype/modules
- Timestamp:
- 10/08/13 16:20:46 (11 years ago)
- Location:
- branches/2.5/prototype/modules
- Files:
-
- 1 added
- 31 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.5/prototype/modules/attach_message/attach_message.css
r5831 r8232 36 36 #mailpreview_container {margin:5px;padding:0px;height:220px; width:907px; float:left; margin:5px 5px 5px 5px;} 37 37 #mailpreview_container .ui-tabs-panel {height:183px;overflow:auto;padding:0px; width:905px;} 38 /*#mailpreview_tabs { max-height: 20px; }*/ 38 #mailpreview_tabs { max-height: 25px; } 39 39 #buttons-container {text-align: right;margin:5px 5px 5px 5px;float:right;} 40 40 #selected_messages_counter {text-align:right;padding:0;} -
branches/2.5/prototype/modules/attach_message/attach_message.js
r7543 r8232 216 216 for (var message in selectedMessages[folder]) { 217 217 if (selectedMessages[folder][message]) { 218 byte_size += parseInt(onceOpened Messages[folder][message].size);218 byte_size += parseInt(onceOpenedHeadersMessages[folder][message].size); 219 219 total_messages++; 220 220 } … … 227 227 var msgAttacherGrid = $("#message_attacher_grid"), msgsTotal = $("#selected_messages_number"); 228 228 var lastLoadedMessages = []; 229 var onceOpenedMessages = [];230 229 var selectedMessages = {}; 231 230 var selectedFolder = {}; 232 231 232 function mount_children_localfolders_list(folder){ 233 folder.children = new Array(); 234 folder.id_search = folder.id; 235 folder.id = 'local_messages_'+folder.id, 236 folder.commonName = folder.name, 237 folder.parentId = folder.parentid, 238 folder.type = 'localFolder', 239 folder.name = folder.id, 240 folder.messageCount = { 241 total: folder.messages, 242 unseen: folder.unseen 243 } 244 245 if(folder.haschild){ 246 expresso_mail_archive.getFoldersList(folder.id_search); 247 folder.children = expresso_mail_archive.folders; 248 249 for(var i = 0; i < folder.children.length; i++){ 250 mount_children_localfolders_list(folder.children[i]); 251 } 252 253 } 254 } 233 255 function adaptOffline( data ) 234 256 { … … 254 276 255 277 return( data ); 256 257 } 278 } 279 280 function archive_flag( flagObj ){ 281 282 var flags = {}; 283 var returns = ''; 284 285 $.each( flagObj.tag , function(i, flag){ 286 flags[ flag['@value'] ] = true; 287 }); 288 289 returns += (flags['seen'] ? '0,' : '1,') ; 290 returns += (flags['answered'] && !flags['forwarded'] ? '1,' : '0,') ; 291 returns += (flags['forwarded'] ? '1,' : '0,') ; 292 returns += (flags['flagged'] || flags['importance_high'] ? '1,' : '0,') ; 293 returns += '0,0'; 294 295 return returns; 296 } 297 298 function archive_flag_search( flagObj ){ 299 var flags = {}; 300 var returns = ''; 301 302 flagObj = flagObj.split(""); 303 $.each( flagObj , function(i, flag){ 304 flags[ flag ] = true; 305 }); 306 307 returns += (flags['U'] ? '1,' : '0,') ; 308 returns += (flags['A'] && !flags['X'] ? '1,' : '0,') ; 309 returns += (flags['X'] ? '1,' : '0,') ; 310 returns += (flags['F'] ? '1,' : '0,') ; 311 returns += '0,0'; 312 313 return returns; 314 } 315 258 316 259 317 $mailpreview_tabs_label_length = 15; … … 271 329 var tree2 = new Array(); 272 330 var tree3 = new Array(); 331 332 if(preferences.use_local_messages == 1){ 333 if(expresso_mail_archive.folders && !expresso_offline && expresso_mail_archive.enabled == true) { //MailArchive 334 //pega pastas locais do mailarchiver e insere no array de pastas 335 expresso_mail_archive.getFoldersList("home"); 336 treeFolders = expresso_mail_archive.folders; 337 338 for(var i=0; i<treeFolders.length; i++ ){ 339 mount_children_localfolders_list(treeFolders[i]); 340 } 341 342 for(var i = 0; i < treeFolders.length; i++){ 343 data.push(treeFolders[i]); 344 } 345 } 346 } 347 273 348 for (var i=0; i<data.length; i++) { 274 349 … … 286 361 } 287 362 else if (/^local_messages/.test(data[i].id)) { 288 if (!unorphanize(tree3, data[i])) {289 data[i].children = new Array();290 363 tree3.push(data[i]); 291 }292 364 } 293 365 … … 299 371 .find("#foldertree").treeview() 300 372 .click(function(event){ 373 301 374 //request new selected folder messages 302 375 var target = $(event.target); … … 325 398 var grid = $("#message_attacher_grid"), offlineCase = ""; 326 399 327 if( !targetId.indexOf( 'local_messages/' ) ) 328 offlineCase = ":offline"; 329 330 331 grid.jqGrid('setGridParam',{url:BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+targetId.replace(dashes, '.')+'/message'}) 332 .trigger("reloadGrid") 333 .jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>'); 400 if(targetId.indexOf( 'local_messages' ) == 0){ 401 //Entrar caso: Clicar em uma pasta que seja do arquivamento local 402 targetId = targetId.split("_")[2]; 403 404 expresso_mail_archive.getMessagesByFolder(targetId,"ALL"); 405 406 msgAll = expresso_mail_archive.msgAll; 407 408 var msgs = new Array(); 409 var from = ''; 410 var flag = ''; 411 412 $.each(msgAll, function(i, msg){ 413 from = $.parseJSON(msg['_from']); 414 415 if(!from){ 416 from = {"mailbox":{"name":"null","route":"null","localPart":"null","domain":"null"}}; 417 } 418 419 flag = $.parseJSON(msg['_tags']); 420 id = msg['_id']; 421 422 var message = {}; 423 424 425 message['msg_number'] = id; 426 message['flags'] = archive_flag( flag ); 427 message['from.name'] = from['mailbox']['@name']; 428 message['subject'] = msg['_subject']; 429 message['timestamp'] = msg['_receivedDate']; 430 message['size'] = msg['_size']; 431 message['id'] = id; 432 msgs.push( message ); 433 434 }); 435 436 grid.jqGrid("clearGridData", true); 437 grid.jqGrid('setGridParam',{datatype: "local",data: msgs}) 438 .trigger("reloadGrid") 439 .jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>'); 440 441 } else { 442 if( !targetId.indexOf( 'local_messages/' ) ) 443 offlineCase = ":offline"; 444 445 grid.jqGrid('setGridParam',{datatype: "json", url:BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+targetId.replace(dashes, '.')+'/message'}) 446 .trigger("reloadGrid") 447 .jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>'); 448 } 334 449 }) 335 450 .find('span:first-child'); 336 $('span.folder.inbox'). addClass('selected');451 $('span.folder.inbox').parents(".ui-dialog").find("li#INBOX span").addClass('selected'); 337 452 selectedFolder = { 338 453 id: firstFolder.parent().attr('id'), … … 360 475 ], 361 476 jsonReader : { 362 root:"rows", 477 root: function(obj){ 478 obj['data'] = {}; 479 obj.data = {rows : obj.rows}; 480 if(obj.rows){ 481 if(!obj.rows[0].flag){ 482 var msgs = []; 483 $.each(obj.rows, function(i, msg){ 484 flag = msg['flags']; 485 id = msg['msg_number']; 486 var message = {}; 487 488 message['msg_number'] = id; 489 message['flags'] = flag; 490 message['to'] = { 491 name: msg['toaddress2'], 492 email: msg['toaddress2'] 493 }; 494 495 if(msg['from'] != undefined && msg['header']['from'] != undefined){ 496 message['from'] = { 497 'email' : msg['from']['email'], 498 'name' : msg['header']['from']['name'] 499 } 500 }else{ 501 message['from'] = { 502 'email' : '', 503 'name' : 'Rascunho' 504 } 505 } 506 //message['from']['name'] = msg['from']['name']; 507 message['subject'] = msg['subject'] ? msg['subject'] : "(sem assunto)"; 508 message['timestamp'] = parseInt(msg['timestamp']); 509 message['size'] = msg['size']; 510 message['id'] = id; 511 msgs.push( message ); 512 }); 513 obj['data'] = {}; 514 obj.data = {rows : msgs}; 515 } 516 } 517 return obj.data.rows; 518 }, 363 519 page: "page", 364 520 total: "total", … … 367 523 id: "0" 368 524 }, 525 hidegrid:false, 369 526 rowNum:10, 370 527 rowList:[10,25,50], … … 377 534 loadComplete: function(data) { 378 535 lastLoadedMessages = data.rows; 379 536 $("#mailgrid-container").find(".loading").hide(); 537 380 538 // aplica o contador 381 539 jQuery('.timable').each(function (i) { … … 401 559 402 560 }, 403 onSelectRow: function (id, selected) { 404 var message = false; 405 for (var i=0; i<lastLoadedMessages.length; i++){ 406 if (lastLoadedMessages[i].msg_number == id) { 407 message = lastLoadedMessages[i]; 408 break; 409 } 410 } 411 412 var tabPanelTemplateId = 'mailpreview_tab_' + selectedFolder.id.replace(/[.\/]/g, '_') + '_' + message.msg_number; 413 var tabPanelTemplateId = tabPanelTemplateId.replace(/[\s\/]/g, '-'); 414 415 if (selected) { 416 if (onceOpenedMessages[selectedFolder.id] && onceOpenedMessages[selectedFolder.id][message.msg_number]) { 417 if (!selectedMessages[selectedFolder.id]) 418 selectedMessages[selectedFolder.id] = {}; 419 420 selectedMessages[selectedFolder.id][message.msg_number] = true; 421 $('#mailpreview-container').unblock(); 422 423 var tabPanelTemplateLabel = html_entities(onceOpenedMessages[selectedFolder.id][message.msg_number].subject); 424 if (tabPanelTemplateLabel.length > $mailpreview_tabs_label_length + 3) 425 tabPanelTemplateLabel = tabPanelTemplateLabel.substring(0, $mailpreview_tabs_label_length) + '...'; 426 427 if (!$('#' + tabPanelTemplateId).length) { 428 $mailpreview_tabs.tabs("add", '#' + tabPanelTemplateId, tabPanelTemplateLabel) 429 .find('.message.empty-container').hide().end() 430 .find('#' + tabPanelTemplateId).html(onceOpenedMessages[selectedFolder.id][message.msg_number].body); 431 } else { 432 $mailpreview_tabs.tabs('select', '#' + tabPanelTemplateId) 433 .find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]').removeClass('preview-message-unselected'); 434 } 435 436 } else { 437 jQuery('#mailpreview_container').block({ 438 message: '<div id="loading-content"><div class="image"></div></div>', 439 css: { 440 backgroundImage: 'url('+BASE_PATH+'modules/attach_message/images/loading.gif)', 441 backgroundRepeat: 'no-repeat', 442 backgroundPosition: 'center', 443 backgroundColor: 'transparent', 444 width: '32px', 445 height: '32px', 446 border:'none' 447 }, 448 overlayCSS: { 449 backgroundColor: '#CCC', 450 opacity: 0.5 451 } 452 }); 453 454 var offlineCase = ""; 455 456 if( !selectedFolder.id.indexOf( 'local_messages/' ) ) 457 offlineCase = ":offline"; 458 459 if (!selectedMessages[selectedFolder.id]) 460 selectedMessages[selectedFolder.id] = {}; 461 selectedMessages[selectedFolder.id][message.msg_number] = true; 462 $.ajax({ 463 accepts: 'text/html', 464 url: BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+selectedFolder.id.replace(dashes, '.')+'/message/'+id, 465 dataType: 'json', 466 success: function( mail_preview ){ 467 //selectedMessagesCount(); 468 if (!onceOpenedMessages[selectedFolder.id]) 469 onceOpenedMessages[selectedFolder.id] = {}; 470 onceOpenedMessages[selectedFolder.id][message.msg_number] = jQuery.extend(true, message, mail_preview); 471 472 $('#mailpreview_container').unblock(); 473 474 var tabPanelTemplateLabel = html_entities(onceOpenedMessages[selectedFolder.id][message.msg_number].subject); 475 if (tabPanelTemplateLabel.length > $mailpreview_tabs_label_length + 3) 476 tabPanelTemplateLabel = tabPanelTemplateLabel.substring(0, $mailpreview_tabs_label_length) + '...'; 477 selectedMessagesCount(); 478 479 if (!$('#' + tabPanelTemplateId).length) { 480 $mailpreview_tabs.tabs("add", '#' + tabPanelTemplateId, tabPanelTemplateLabel) 481 .find('.message.empty-container').hide().end() 482 .find('#' + tabPanelTemplateId).html(onceOpenedMessages[selectedFolder.id][message.msg_number].body) 483 .prepend( 484 '<div class="mailpreview-message-info">' + 485 get_lang('Subject') + ': ' + 486 html_entities(onceOpenedMessages[selectedFolder.id][message.msg_number].subject) + 487 '</div>' 488 ) 489 .find('[class^="ExpressoCssWrapper"]').addClass("mailpreview-message-body"); 490 } else { 491 $mailpreview_tabs.tabs('select', '#' + tabPanelTemplateId) 492 .find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]').removeClass('preview-message-unselected'); 493 } 494 } 495 }); 496 } 497 } else { 498 /** 499 * if you wants to remove tab on unselect message, 500 * but still needs to uselect message on remove tab. 501 * 502 */ 503 /* 504 if ($('#' + tabPanelTemplateId).length) { 505 $mailpreview_tabs.tabs('remove', '#' + tabPanelTemplateId); 506 } 507 */ 508 selectedMessages[selectedFolder.id][message.msg_number] = false; 509 $mailpreview_tabs.find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]').addClass('preview-message-unselected'); 510 } 511 512 if (onceOpenedMessages[selectedFolder.id] && onceOpenedMessages[selectedFolder.id][message.msg_number]) 513 selectedMessagesCount(); 514 }, 561 onSelectRow: function(id, selected) 562 { 563 /* Funções auxiliares:*/ 564 565 /* 566 Marca a mensagem como selecionada no grid de anexar mensagena. 567 Parâmetros: 568 folder: folder em que a mensagem a ser selecionada se encontra. 569 msg_number: id da mensagem a ser selecionada. 570 */ 571 var mark_as_selected = function (folder, msg_number) { 572 if(!selectedMessages[folder]) 573 { 574 selectedMessages[folder] = {}; 575 } 576 selectedMessages[folder][msg_number] = true; 577 } 578 579 /* 580 Adiciona uma mensagem ao cache de mensagens. 581 cache: vetor de cache de mensagens. 582 msg: mensagem a ser armazenada. 583 */ 584 var add_msg_to_cache = function (cache, msg) { 585 if(!cache[selectedFolder.id]) 586 { 587 cache[selectedFolder.id] = {}; 588 } 589 cache[selectedFolder.id][msg.msg_number] = msg; 590 } 591 592 /* 593 Adiciona uma aba de preview para cada mensagem selecionada. 594 subject: assunto da mensagem. 595 body: corpo da mensagem. 596 */ 597 var add_preview_tab = function (subject, body) { 598 // Trunca o assunto, para caber na aba de preview: 599 var tabPanelTemplateLabel = html_entities(subject); 600 if(tabPanelTemplateLabel.length > $mailpreview_tabs_label_length + 3) 601 { 602 tabPanelTemplateLabel = tabPanelTemplateLabel.substring(0, $mailpreview_tabs_label_length) + '...'; 603 } 604 605 // Se a aba não tiver sido adicionada: 606 if(!$('#' + tabPanelTemplateId).length) 607 { 608 // adiciona-a: 609 $mailpreview_tabs 610 .tabs("add", '#' + tabPanelTemplateId, tabPanelTemplateLabel) 611 .find('.message.empty-container') 612 .hide() 613 .end() 614 .find('#' + tabPanelTemplateId) 615 .html(body) 616 .prepend('<div class="mailpreview-message-info">' + get_lang('Subject') + ': ' + html_entities(subject) + '</div>') 617 .find('[class^="ExpressoCssWrapper"]') 618 .addClass("mailpreview-message-body"); 619 } 620 else 621 { 622 // Senão, só a seleciona: 623 $mailpreview_tabs 624 .tabs('select', '#' + tabPanelTemplateId) 625 .find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]') 626 .removeClass('preview-message-unselected'); 627 } 628 } 629 630 var message = false; 631 for(var i = 0; i < lastLoadedMessages.length; i++) 632 { 633 if(lastLoadedMessages[i].msg_number == id) 634 { 635 message = lastLoadedMessages[i]; 636 break; 637 } 638 } 639 var tabPanelTemplateId = 'mailpreview_tab_' + selectedFolder.id.replace(/[.\/]/g, '_') + '_' + message.msg_number; 640 var tabPanelTemplateId = tabPanelTemplateId.replace(/[\s\/]/g, '-'); 641 642 if(selected) 643 { 644 // Se a já mensagem (com preview) já estiver no cache: 645 if(onceOpenedHeadersMessages[selectedFolder.id] && onceOpenedHeadersMessages[selectedFolder.id][message.msg_number] && onceOpenedHeadersMessages[selectedFolder.id][message.msg_number].body) 646 { 647 648 mark_as_selected(selectedFolder.id, message.msg_number); 649 650 add_preview_tab( 651 onceOpenedHeadersMessages[selectedFolder.id][message.msg_number].subject, 652 onceOpenedHeadersMessages[selectedFolder.id][message.msg_number].body 653 ); 654 } 655 else // Mensagem não está no cache: 656 { 657 jQuery('#mailpreview_container').block( 658 { 659 message: '<div id="loading-content"><div class="image"></div></div>', 660 css: { 661 backgroundImage: 'url(' + BASE_PATH + 'modules/attach_message/images/loading.gif)', 662 backgroundRepeat: 'no-repeat', 663 backgroundPosition: 'center', 664 backgroundColor: 'transparent', 665 width: '32px', 666 height: '32px', 667 border: 'none' 668 }, 669 overlayCSS: { 670 backgroundColor: '#CCC', 671 opacity: 0.5 672 } 673 }); 674 675 mark_as_selected(selectedFolder.id, message.msg_number); 676 677 // Se for mensagem local: 678 if(selectedFolder['id'].indexOf("local_messages_") != -1) 679 { 680 expresso_mail_archive.getPreviewToAttach(id); 681 682 var body = expresso_mail_archive.bodyPreview; 683 var subject = expresso_mail_archive.subjectPreview; 684 685 add_preview_tab(subject, body); 686 687 $('#mailpreview_container').unblock(); 688 689 add_msg_to_cache(onceOpenedHeadersMessages, message); 690 } 691 else 692 { 693 proxy_mensagens.get_msg(id, selectedFolder.id, '', function (data) { 694 message = $.extend(true, message, data); 695 696 add_preview_tab(message.subject, message.body); 697 698 $('#mailpreview_container').unblock(); 699 700 add_msg_to_cache(onceOpenedHeadersMessages, message); 701 702 703 }) 704 } 705 } 706 } 707 else 708 { 709 /** 710 * if you wants to remove tab on unselect message, 711 * but still needs to uselect message on remove tab. 712 * 713 */ 714 selectedMessages[selectedFolder.id][message.msg_number] = false; 715 $mailpreview_tabs 716 .find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]') 717 .addClass('preview-message-unselected'); 718 } 719 720 selectedMessagesCount(); 721 }, 722 515 723 caption: '<span class="'+selectedFolder['class']+'">'+selectedFolder.name+'</span>' 516 724 }); 517 //.jqGrid('navGrid','#message_attacher_grid_pager',{edit:false,add:false,del:false}); 725 726 var search_local_messsages = function(param, folder){ 727 if(preferences.use_local_messages != 0) 728 { 729 folder = folder.split("_")[2]; 730 731 var local_folders = []; 732 expresso_mail_archive.search_queryresult = null; 733 734 local_folders.push(folder); 735 736 tmp = []; 737 738 groupResult = []; 739 expresso_mail_archive.search(local_folders, "SUBJECT " + "<=>" +url_encode(param) + "##"); 740 groupResult.push( expresso_mail_archive.search_queryresult ); 741 expresso_mail_archive.search(local_folders, "FROM " + "<=>" + url_encode(param) + "##"); 742 groupResult.push( expresso_mail_archive.search_queryresult ); 743 expresso_mail_archive.search(local_folders, "TO " + "<=>" + url_encode(param) + "##"); 744 groupResult.push( expresso_mail_archive.search_queryresult ); 745 expresso_mail_archive.search(local_folders, "CC " + "<=>" + url_encode(param) + "##"); 746 groupResult.push( expresso_mail_archive.search_queryresult ); 747 748 if($("#gbox_message_attacher_grid .attach-message-search-checkbox").is(":checked")){ 749 expresso_mail_archive.search(local_folders, "BODY " + "<=>" + url_encode(param) + "##"); 750 groupResult.push( expresso_mail_archive.search_queryresult ); 751 } 752 753 754 $.each(groupResult, function(i, result){ 755 if(result != null){ 756 757 var existsMessage = true; 758 759 $.each(result, function(i, each){ 760 761 $.each(tmp, function(i, ids){ 762 763 if(each.msg_number == ids.msg_number){ 764 765 existsMessage = false; 766 return false; 767 768 } 769 770 }); 771 772 if(existsMessage) tmp.push(each); 773 }); 774 775 } 776 }); 777 778 779 if(tmp == null) 780 { 781 tmp = new Object(); 782 tmp.length = 0; 783 } 784 785 msgs = []; 786 787 $.each(tmp, function(i, msg){ 788 789 flag = msg['flag']; 790 id = msg['msg_number']; 791 792 var message = {}; 793 794 var stamp = msg['timestamp']; 795 stamp = stamp.toString() + "000"; 796 stamp = parseInt(stamp); 797 798 message['msg_number'] = id; 799 message['flags'] = archive_flag_search(flag);//"1,1,1,1,1,1";// 800 message['from.name'] = msg['from']; 801 message['subject'] = msg['subject']; 802 message['timestamp'] = stamp; 803 message['size'] = msg['size']; 804 message['id'] = id; 805 msgs.push( message ); 806 }); 807 return msgs; 808 } 809 } 810 var search_imap_messages = function(param, folder){ 811 var grid = $("#message_attacher_grid"); 812 813 DataLayer.storage.cache = {}; 814 if( $(".attach-message-search-checkbox:checked").length > 0 ){ 815 var filters = [ 816 [ 817 'from', 818 '*', 819 param 820 ], 821 [ 822 'OR', 823 'to', 824 '*', 825 param 826 ], 827 [ 828 'OR', 829 'subject', 830 '*', 831 param 832 ], 833 [ 834 'OR', 835 'folder', 836 '*', 837 folder 838 ], 839 [ 840 'OR', 841 'body', 842 '*', 843 param 844 ] 845 ]; 846 }else{ 847 var filters = [ 848 [ 849 'from', 850 '*', 851 param 852 ], 853 [ 854 'OR', 855 'to', 856 '*', 857 param 858 ], 859 [ 860 'OR', 861 'subject', 862 '*', 863 param 864 ], 865 [ 866 'OR', 867 'folder', 868 '*', 869 folder 870 ] 871 ]; 872 } 873 874 var data = DataLayer.get( 'message', { filter: filters, criteria: { properties: { context: { folder: folder } } } }, true ); 875 876 if(DataLayer.criterias['message:jqGridSearch']){ 877 delete DataLayer.criterias['message:jqGridSearch']; 878 } 879 880 DataLayer.register( 'criterias', 'message:jqGridSearch', function( crit ){ 881 crit.properties = { context: { folder: folder } }; 882 883 return { filter: [ "msgNumber", "IN", data ], criteria: crit }; 884 }); 885 if(typeof(data) == 'object'){ 886 grid.jqGrid("clearGridData", true); 887 grid.jqGrid('setGridParam',{datatype: "json", url: 'message:jqGridSearch'}).trigger("reloadGrid"); 888 889 }else{ 890 $("#mailgrid-container").find(".loading").hide(); 891 grid.jqGrid("clearGridData", true); 892 } 893 } 894 895 var search_messages = function(param){ 896 var grid = $("#message_attacher_grid"); 897 var folder = $("#foldertree li span.selected").parent().attr("id"); 898 899 if(param == ""){ 900 $('#foldertree [id="'+folder+'"]').trigger("click"); 901 return; 902 } 903 $(".attach-message-search-input").val(""); 904 if(folder.indexOf("local_messages_") == 0){ 905 // Pesquisa pelas mensagens locais... 906 msgs = search_local_messsages(param, folder); 907 } else { 908 // Pesquisa pelo Imap... 909 return search_imap_messages(param, folder); 910 } 911 912 // Monta as mensagens na grid... 913 grid.jqGrid("clearGridData", true); 914 grid.jqGrid('setGridParam',{datatype: "local",data: msgs}) 915 .trigger("reloadGrid"); 916 //.jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>'); 917 } 918 518 919 var title = [get_lang("First page"), get_lang("Prev page"), get_lang("Next page"), get_lang("Last page")]; 519 920 $("#first_message_attacher_grid_pager").attr("title",title[0]); … … 521 922 $("#next_message_attacher_grid_pager").attr("title",title[2]); 522 923 $("#last_message_attacher_grid_pager").attr("title",title[3]); 924 $("#mailgrid-container .ui-jqgrid-titlebar") 925 .append( DataLayer.render("../prototype/modules/attach_message/attachment_search.ejs") ).find(".ui-jqgrid-titlebar-close").hide() 926 .end().find(".attach-message-search-input").Watermark("Pesquisa...").keydown(function(e){ 927 var param = $(this).val(); 928 if($.ui.keyCode.ENTER == e.keyCode){ 929 $("#mailgrid-container").find(".loading").show("fast", function(){ 930 search_messages(param); 931 }); 932 } 933 934 }).end().find(".attach-message-search-checkbox").click(function(){ 935 var msg; 936 if($(this).is(":checked")){ 937 msg = get_lang("take off this option to disregard the message body in the search."); 938 } else { 939 msg = get_lang("take on this option to regard the message body in the search."); 940 } 941 $(".attach-message-search-div .button-body-msg-title").attr("title",msg); 942 }); 943 944 $("#attach-message-search").button({ 945 text: false, 946 icons: { 947 primary: "ui-icon-search" 948 } 949 }).next().button({ 950 text: false, 951 icons: { 952 primary: "ui-icon-script" 953 } 954 }); 955 $("#attach-message-search").parent().buttonset(); 956 957 $("#attach-message-search").click(function(){ 958 var param = $(this).parents(".attach-message-search-div:first").find(".attach-message-search-input").val(); 959 $("#mailgrid-container").find(".loading").show("fast", function(){ 960 search_messages(param); 961 }); 962 }); 523 963 } 524 964 }); -
branches/2.5/prototype/modules/calendar/assetic.php
r7664 r8232 87 87 88 88 if (strpos($javaVersion,"java version") !== false){ 89 $filterManager->set('yui_js', $compressor); 90 $js->ensureFilter($filterManager->get('yui_js')); 89 $filterManager->set('yui_js', $compressor); 90 $js->ensureFilter($filterManager->get('yui_js')); 91 91 } 92 92 -
branches/2.5/prototype/modules/calendar/css/layout.css
r7968 r8232 1408 1408 color: transparent; 1409 1409 } 1410 1411 .occurrence-zebra{ 1412 width: 440px !important; 1413 } 1410 1411 .occurrence-zebra{ 1412 width: 440px !important; 1413 } -
branches/2.5/prototype/modules/calendar/css/reset.css
r5341 r8232 33 33 } 34 34 body { 35 line-height: 1;35 /*line-height: 1;*/ 36 36 color: black; 37 37 background: white; -
branches/2.5/prototype/modules/calendar/css/style.css
r8050 r8232 51 51 .new-event-win fieldset#calendar_addevent_details5 .button-files-upload, .new-task-win fieldset#calendar_addevent_details5 .button-files-upload{margin: 15px 0 0 0} 52 52 .new-event-win fieldset fieldset, .new-event-win fieldset.tab-level2 fieldset, .new-task-win fieldset fieldset, .new-event-win fieldset.tab-level2 fieldset { padding: 5px 0; } 53 .new-event-win .creation-date-label{ white-space: nowrap; float: right;} 53 .new-event-win .creation-date-label{ white-space: nowrap; float: right;} 54 54 55 55 .new-activity-win fieldset { border: none; margin: 0; padding: 0; } … … 559 559 .div-addtask #calendar_addtask_details1 .subitem .done { width: 45px;} 560 560 561 @-moz-document url-prefix() {.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -14px !important;}}562 563 @media screen and (-webkit-min-device-pixel-ratio:0){.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -2px !important;}} 561 .div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -2px !important;;} 562 /*@-moz-document url-prefix() {.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -2px !important;}}*/ 563 /*@media screen and (-webkit-min-device-pixel-ratio:0){.div-addtask #calendar_addtask_details1 .ui-spinner-buttons{ top: -2px !important;}}*/ 564 564 565 565 .div-addtask #calendar_addtask_details1 .ui-spinner-buttons .ui-spinner-up{height: 7px !important;} -
branches/2.5/prototype/modules/calendar/interceptors/DAViCalAdapter.php
r7799 r8232 206 206 { 207 207 $args = Controller::parse( array( 'service' => 'iCal' ) , $data , $params); 208 ob_start(); 208 ob_start(); 209 209 include ROOTPATH.'/Sync.php'; 210 210 ob_end_clean(); -
branches/2.5/prototype/modules/calendar/interceptors/DBMapping.php
r8059 r8232 164 164 165 165 public function encodeSignatureAlarmType(&$uri, &$params, &$criteria, $original) { 166 $params['type'] = self::codeAlarmType($params['type']); 167 } 168 169 public function schedulableSecurity(&$uri, &$params, &$criteria, $original) 166 $params['type'] = self::codeAlarmType($params['type']); 167 } 168 169 public function schedulableSecurity(&$uri, &$params, &$criteria, $original) 170 170 { 171 172 if( !isset($criteria['filter'][1]) || !$criteria['filter'][1] == 'uid') 173 { 174 $security = 'schedulable.id = calendarToSchedulable.schedulable'; 175 $security .= ' AND calendar.id = calendarToSchedulable.calendar'; 176 $security .= ' AND calendar.id = calendarSignature.calendar'; 177 $security .= ' AND calendarSignature.user = ' . base64_encode(Config::me('uidNumber')); 178 179 $criteria['condition'] = $security; 180 } 181 182 } 183 184 public function calendarSecurity(&$uri, &$params, &$criteria, $original) 185 { 186 $security = 'calendar.id = calendarSignature.calendar'; 187 $security .= ' AND calendarSignature.user = ' . base64_encode(Config::me('uidNumber')); 188 189 $criteria['condition'] = $security; 190 } 191 192 public function calendarSignatureSecurity(&$uri, &$params, &$criteria, $original) 193 { 194 // $security = 'calendarSignature.user = ' . base64_encode(Config::me('uidNumber')); 195 // 196 // $criteria['condition'] = $security; 171 172 if( !isset($criteria['filter'][1]) || !$criteria['filter'][1] == 'uid') 173 { 174 $security = 'schedulable.id = calendarToSchedulable.schedulable'; 175 $security .= ' AND calendar.id = calendarToSchedulable.calendar'; 176 $security .= ' AND calendar.id = calendarSignature.calendar'; 177 $security .= ' AND calendarSignature.user = ' . base64_encode(Config::me('uidNumber')); 178 179 $criteria['condition'] = $security; 180 } 181 182 } 183 184 public function calendarSecurity(&$uri, &$params, &$criteria, $original) 185 { 186 $security = 'calendar.id = calendarSignature.calendar'; 187 $security .= ' AND calendarSignature.user = ' . base64_encode(Config::me('uidNumber')); 188 189 $criteria['condition'] = $security; 190 } 191 192 public function calendarSignatureSecurity(&$uri, &$params, &$criteria, $original) 193 { 194 // $security = 'calendarSignature.user = ' . base64_encode(Config::me('uidNumber')); 195 // 196 // $criteria['condition'] = $security; 197 197 } 198 198 … … 347 347 if (isset($original['properties']['exceptions'])) { 348 348 $exceptions = explode(',', $original['properties']['exceptions']); 349 $event = Controller::read(array('concept' => 'schedulable', 'id' => $repeat['schedulable'])); 350 351 if(array_key_exists(0, $event)) $event = $event[0]; 352 353 $date = new DateTime('now', new DateTimeZone('UTC')); 354 355 foreach($exceptions as &$e){ 356 $date->setTimestamp((int) ($e / 1000)); 357 $date->setTimezone( new DateTimeZone( $event['timezone'] )); 358 $e = ($date->getTimestamp() - $date->getOffset()).'000'; 359 } 360 361 unset($repeat['exceptions']); 349 $event = Controller::read(array('concept' => 'schedulable', 'id' => $repeat['schedulable'])); 350 351 if(array_key_exists(0, $event)) $event = $event[0]; 352 353 $date = new DateTime('now', new DateTimeZone('UTC')); 354 355 foreach($exceptions as &$e){ 356 $date->setTimestamp((int) ($e / 1000)); 357 $date->setTimezone( new DateTimeZone( $event['timezone'] )); 358 $e = ($date->getTimestamp() - $date->getOffset()).'000'; 359 } 360 361 unset($repeat['exceptions']); 362 362 } 363 363 364 unset($repeat['schedulable']); 365 366 $lastExceptions = Controller::find(array('concept' => 'repeatOccurrence'), array("occurrence"), array('filter' => array('AND', array('=', 'repeat', $id), array('=', 'exception', 1)))); 364 unset($repeat['schedulable']); 365 366 $lastExceptions = Controller::find(array('concept' => 'repeatOccurrence'), array("occurrence"), array('filter' => array('AND', array('=', 'repeat', $id), array('=', 'exception', 1)))); 367 367 368 368 //Recurepa as execeções anteriores caso exista … … 379 379 else if(!empty($exceptions)) 380 380 Controller::service('PostgreSQL')->execResultSql("INSERT INTO calendar_repeat_occurrence(repeat_id,exception,occurrence)VALUES ('" . $id . "','1','" . implode("'),('" . $id . "','1','", $exceptions) . "')" ); 381 } 381 } 382 382 383 383 public function checkOccurrences($start, $end, $calendarIds) { … … 428 428 429 429 foreach ($result as $id => $res){ 430 431 $ocurrences = array_unique($res); 432 433 /* 434 * Check current range decoded 435 * */ 436 $current = Controller::find(array('concept' => 'repeatOccurrence'), array("occurrence"), array('filter' => array('=', 'repeat', $id))); 437 $toDiff = array(); 438 439 if(!empty($current)) 440 foreach($current as $c) $toDiff[] = $c['occurrence']; 441 442 $ocurrences = array_diff($ocurrences, $toDiff); 443 444 if(!empty($ocurrences)) 430 431 $ocurrences = array_unique($res); 432 433 /* 434 * Check current range decoded 435 * */ 436 $current = Controller::find(array('concept' => 'repeatOccurrence'), array("occurrence"), array('filter' => array('=', 'repeat', $id))); 437 $toDiff = array(); 438 439 if(!empty($current)) 440 foreach($current as $c) $toDiff[] = $c['occurrence']; 441 442 $ocurrences = array_diff($ocurrences, $toDiff); 443 444 if(!empty($ocurrences)) 445 445 Controller::service('PostgreSQL')->execResultSql("INSERT INTO calendar_repeat_occurrence(repeat_id,occurrence)VALUES('" . $id . "','" . implode("'),('" . $id . "', '", $ocurrences) . "')"); 446 447 } 446 447 } 448 448 $data = array(); 449 449 … … 471 471 $result = array(); 472 472 $params = array(); 473 $realResult = array(); 473 $realResult = array(); 474 474 foreach ($return as $ret) { 475 475 $currentId = $ret['schedulable']; … … 483 483 } 484 484 485 foreach($result as $i => $v) 486 { 487 $calendarToCalendarObj = self::schedulable2calendarToObject($v['id']); 488 foreach($calendarToCalendarObj as $vv) 489 { 490 $v['calendar'] = $vv['calendar_id']; 491 $realResult[] = $v; 492 } 493 } 494 495 return( $realResult ); 485 foreach($result as $i => $v) 486 { 487 $calendarToCalendarObj = self::schedulable2calendarToObject($v['id']); 488 foreach($calendarToCalendarObj as $vv) 489 { 490 $v['calendar'] = $vv['calendar_id']; 491 $realResult[] = $v; 492 } 493 } 494 495 return( $realResult ); 496 496 } 497 497 … … 633 633 //necessário para atulizar a atividade de composta pela tarefa aqui sendo atualizada 634 634 if(isset($criteria['historic']['startTime']) || isset($criteria['historic']['endTime'])){ 635 /* 636 * Verify current task is built-in activity 637 * */ 635 /* 636 * Verify current task is built-in activity 637 * */ 638 638 $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'task', $uri['id']), array('=', 'owner', Config::me('uidNumber'))), 'deepness' => 2)); 639 639 if(!empty($taskToActivity)){ … … 641 641 $isAllDay = 1; 642 642 643 /* 644 * Get all task in activity 645 * */ 646 $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'activity', $taskToActivity[0]['activity']), array('=', 'owner', Config::me('uidNumber'))), 'deepness' => 2)); 647 643 /* 644 * Get all task in activity 645 * */ 646 $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'activity', $taskToActivity[0]['activity']), array('=', 'owner', Config::me('uidNumber'))), 'deepness' => 2)); 647 648 648 if(!empty($activity)){ 649 649 $start = $params['startTime']; 650 650 $end = $params['endTime']; 651 651 foreach($taskToActivity as $t){ 652 653 654 if($t['task']['id'] != $params['id']){ 655 $start = $t['task']['startTime'] < $start ? $t['task']['startTime'] : $start; 656 $end = $t['task']['endTime'] > $end ? $t['task']['endTime'] : $end; 657 $isAllDay = (($isAllDay == 1) && ($t['task']['allDay'] == '1')) ? 1 : 0; 658 } 652 653 654 if($t['task']['id'] != $params['id']){ 655 $start = $t['task']['startTime'] < $start ? $t['task']['startTime'] : $start; 656 $end = $t['task']['endTime'] > $end ? $t['task']['endTime'] : $end; 657 $isAllDay = (($isAllDay == 1) && ($t['task']['allDay'] == '1')) ? 1 : 0; 658 } 659 659 } 660 660 … … 680 680 } 681 681 } 682 /* 683 * Clean historic not used 684 * */ 682 /* 683 * Clean historic not used 684 * */ 685 685 unset($criteria['historic']['endTime']); 686 686 unset($criteria['historic']['rangeEnd']); … … 771 771 } 772 772 } 773 } 774 775 static function autoImportCalendar(&$uri, &$params, &$criteria, $original){ 776 $autoCommit = Controller::service('PostgreSQL')->execResultSql('Select config_value FROM phpgw_config WHERE config_app = \'expressoCalendar\' AND config_name = \'expressoCalendar_autoImportCalendars\''); 777 778 779 if(isset($autoCommit[0]) && $autoCommit[0]['config_value'] == 'true') 780 { 781 if(isset($original['properties']) && isset($original['properties']['user']) && isset($original['properties']['isOrganizer']) && $original['properties']['isOrganizer'] != '1') 782 { 783 $defaultCalendar = Controller::find(array('concept' => 'modulePreference'), array('value') , array('filter' => array( 'and' , array('=' , 'name' , 'dafaultImportCalendar') , array('=' , 'module' , 'expressoCalendar') , array('=' , 'user' , $original['properties']['user']) )) ); 784 if(isset($defaultCalendar[0]) && $defaultCalendar[0]['value'] > 0) 785 { 786 Controller::create(array('concept' => 'calendarToSchedulable'), 787 array('schedulable' => $original['properties']['schedulable'], 788 'calendar' => $defaultCalendar[0]['value'] 789 ) 790 ); 791 } 792 } 793 } 773 } 774 775 static function autoImportCalendar(&$uri, &$params, &$criteria, $original){ 776 $autoCommit = Controller::service('PostgreSQL')->execResultSql('Select config_value FROM phpgw_config WHERE config_app = \'expressoCalendar\' AND config_name = \'expressoCalendar_autoImportCalendars\''); 777 778 779 if(isset($autoCommit[0]) && $autoCommit[0]['config_value'] == 'true') 780 { 781 if(isset($original['properties']) && isset($original['properties']['user']) && isset($original['properties']['isOrganizer']) && $original['properties']['isOrganizer'] != '1') 782 { 783 $defaultCalendar = Controller::find(array('concept' => 'modulePreference'), array('value') , array('filter' => array( 'and' , array('=' , 'name' , 'dafaultImportCalendar') , array('=' , 'module' , 'expressoCalendar') , array('=' , 'user' , $original['properties']['user']) )) ); 784 if(isset($defaultCalendar[0]) && $defaultCalendar[0]['value'] > 0) 785 { 786 Controller::create(array('concept' => 'calendarToSchedulable'), 787 array('schedulable' => $original['properties']['schedulable'], 788 'calendar' => $defaultCalendar[0]['value'] 789 ) 790 ); 791 } 792 } 793 } 794 794 } 795 795 … … 913 913 } 914 914 915 public function getCalendarTask( $task ){ 916 917 $sql = 'select co.calendar_id as "calendar" from calendar_to_calendar_object as "co", calendar_signature as "cs" where cs.user_uidnumber = '. Config::me('uidNumber') 918 .' AND cs.is_owner = 1 AND cs.calendar_id = co.calendar_id AND co.calendar_object_id = '. $task; 919 920 921 $returns = Controller::service('PostgreSQL')->execResultSql($sql); 922 923 return $returns[0]['calendar']; 924 } 925 915 public function getCalendarTask( $task ){ 916 917 $sql = 'select co.calendar_id as "calendar" from calendar_to_calendar_object as "co", calendar_signature as "cs" where cs.user_uidnumber = '. Config::me('uidNumber') 918 .' AND cs.is_owner = 1 AND cs.calendar_id = co.calendar_id AND co.calendar_object_id = '. $task; 919 920 921 $returns = Controller::service('PostgreSQL')->execResultSql($sql); 922 923 return $returns[0]['calendar']; 924 } 925 926 926 //TODO: Remover apos suporte a deepness na api 927 927 public function deepnessFindTask(&$uri, &$result, &$criteria, $original) { 928 if (isset($criteria['deepness']) && $criteria['deepness'] != 0){ 929 930 foreach($result as &$value){ 931 928 if (isset($criteria['deepness']) && $criteria['deepness'] != 0){ 929 930 foreach($result as &$value){ 931 932 932 $value['task'] = Controller::read(array('concept' => 'schedulable', 'id' => $value['task'])); 933 $value['task']['calendar'] = self::getCalendarTask( $value['task']['id'] ); 934 } 935 936 return $result; 937 } 933 $value['task']['calendar'] = self::getCalendarTask( $value['task']['id'] ); 934 } 935 936 return $result; 937 } 938 938 } 939 939 … … 972 972 .'calendar_object.tzid as "timezone", calendar_to_calendar_object.calendar_id as "calendar" ' 973 973 .'FROM calendar_object, calendar_to_calendar_object ' 974 .'WHERE ( calendar_object.id = '. $criteria['schedulable'] .' AND calendar_to_calendar_object.calendar_object_id = calendar_object.id' 975 .' AND calendar_to_calendar_object.calendar_id IN (select calendar_id from calendar_signature where calendar_signature.user_uidnumber = '. Config::me('uidNumber') .' ) )'; 974 .'WHERE ( calendar_object.id = '. $criteria['schedulable'] .' AND calendar_to_calendar_object.calendar_object_id = calendar_object.id' 975 .' AND calendar_to_calendar_object.calendar_id IN (select calendar_id from calendar_signature where calendar_signature.user_uidnumber = '. Config::me('uidNumber') .' ) )'; 976 976 977 977 $params = Controller::service('PostgreSQL')->execResultSql($sql); 978 979 foreach( $params as &$event ){ 980 981 982 if(isset( $event['repeat'] ) && isset( $event['repeat']['id'] ) ){ 983 $occurrences = Controller::service('PostgreSQL')->execResultSql('SELECT DISTINCT occurrence FROM calendar_object as "c", calendar_repeat_occurrence as "o", calendar_repeat as "r" WHERE r.object_id = '. $event['id'] .' AND o.repeat_id = r.id ' ); 984 985 if($occurrences){ 986 $event['occurrences'] = array(); 987 988 foreach($occurrences as $o) 989 $event['occurrences'][] = $o['occurrence']; 990 }else 991 unset( $event['occurrences'] ); 992 } 993 } 978 979 foreach( $params as &$event ){ 980 981 982 if(isset( $event['repeat'] ) && isset( $event['repeat']['id'] ) ){ 983 $occurrences = Controller::service('PostgreSQL')->execResultSql('SELECT DISTINCT occurrence FROM calendar_object as "c", calendar_repeat_occurrence as "o", calendar_repeat as "r" WHERE r.object_id = '. $event['id'] .' AND o.repeat_id = r.id ' ); 984 985 if($occurrences){ 986 $event['occurrences'] = array(); 987 988 foreach($occurrences as $o) 989 $event['occurrences'][] = $o['occurrence']; 990 }else 991 unset( $event['occurrences'] ); 992 } 993 } 994 994 995 995 $params = self::deepnessFindEvent($uri, $params, $criteria, $original); … … 1047 1047 if(isset( $v['occurrences'] ) && count( $v['occurrences'] ) > 0){ 1048 1048 1049 $date->setTimestamp((int) ($v['startTime'] / 1000)); 1050 $date->setTimezone( new DateTimeZone( $v['timezone'] )); 1051 1049 $date->setTimestamp((int) ($v['startTime'] / 1000)); 1050 $date->setTimezone( new DateTimeZone( $v['timezone'] )); 1051 1052 1052 foreach( $result[$i]['occurrences'] as &$o){ 1053 1053 1054 $o = ($o + $date->getOffset()).'000'; 1054 $o = ($o + $date->getOffset()).'000'; 1055 1055 1056 1056 } … … 1421 1421 1422 1422 Controller::delete(array('concept' => 'calendar', 'id' => $signature['calendar'])); 1423 1424 $autoCommit = Controller::service('PostgreSQL')->execResultSql('Select config_value FROM phpgw_config WHERE config_app = \'expressoCalendar\' AND config_name = \'expressoCalendar_autoImportCalendars\''); 1425 1426 if(isset($autoCommit[0]) && $autoCommit[0]['config_value'] == 'true') 1427 { 1428 $defaultCalendar = Controller::find(array('concept' => 'modulePreference'), array('value','id') , array('filter' => array( 'and' , array('=' , 'name' , 'dafaultImportCalendar') , array('=' , 'module' , 'expressoCalendar') , array('=' , 'user' , $signature['user']) )) ); 1429 1430 1431 if(isset($defaultCalendar[0]) && $defaultCalendar[0]['value'] == $signature['calendar'] ) 1432 { 1433 Controller::delete(array('concept' => 'modulePreference', 'id' => $defaultCalendar[0]['id'])); 1434 } 1435 } 1436 1437 $permissions = Controller::find(array('concept' => 'calendarToPermission'), array('id'), array('filter' => array('=', 'calendar', $signature['calendar']))); 1438 1423 1424 $autoCommit = Controller::service('PostgreSQL')->execResultSql('Select config_value FROM phpgw_config WHERE config_app = \'expressoCalendar\' AND config_name = \'expressoCalendar_autoImportCalendars\''); 1425 1426 if(isset($autoCommit[0]) && $autoCommit[0]['config_value'] == 'true') 1427 { 1428 $defaultCalendar = Controller::find(array('concept' => 'modulePreference'), array('value','id') , array('filter' => array( 'and' , array('=' , 'name' , 'dafaultImportCalendar') , array('=' , 'module' , 'expressoCalendar') , array('=' , 'user' , $signature['user']) )) ); 1429 1430 1431 if(isset($defaultCalendar[0]) && $defaultCalendar[0]['value'] == $signature['calendar'] ) 1432 { 1433 Controller::delete(array('concept' => 'modulePreference', 'id' => $defaultCalendar[0]['id'])); 1434 } 1435 } 1436 1437 $permissions = Controller::find(array('concept' => 'calendarToPermission'), array('id'), array('filter' => array('=', 'calendar', $signature['calendar']))); 1438 1439 1439 if($permissions && count($permissions) > 0){ 1440 1440 $ids = array(); … … 1583 1583 } 1584 1584 1585 if($i == 0) 1586 { 1587 $pref = array(); 1588 $pref['user'] = $_SESSION['wallet']['user']['uidNumber']; 1589 $pref['value'] = $calCreated['id']; 1590 $pref['name'] = 'dafaultImportCalendar' ; 1591 $pref['module'] = 'expressoCalendar'; 1592 Controller::create(array('concept' => 'modulePreference'), $pref); 1593 } 1594 1585 if($i == 0) 1586 { 1587 $pref = array(); 1588 $pref['user'] = $_SESSION['wallet']['user']['uidNumber']; 1589 $pref['value'] = $calCreated['id']; 1590 $pref['name'] = 'dafaultImportCalendar' ; 1591 $pref['module'] = 'expressoCalendar'; 1592 Controller::create(array('concept' => 'modulePreference'), $pref); 1593 } 1594 1595 1595 } 1596 1596 } else { … … 1614 1614 1615 1615 $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig); 1616 1617 1618 $pref = array(); 1619 $pref['user'] = $_SESSION['wallet']['user']['uidNumber']; 1620 $pref['value'] = $calCreated['id']; 1621 $pref['name'] = 'dafaultImportCalendar' ; 1622 $pref['module'] = 'expressoCalendar'; 1623 Controller::create(array('concept' => 'modulePreference'), $pref); 1624 1625 1616 1617 1618 $pref = array(); 1619 $pref['user'] = $_SESSION['wallet']['user']['uidNumber']; 1620 $pref['value'] = $calCreated['id']; 1621 $pref['name'] = 'dafaultImportCalendar' ; 1622 $pref['module'] = 'expressoCalendar'; 1623 Controller::create(array('concept' => 'modulePreference'), $pref); 1624 1625 1626 1626 } 1627 1627 … … 1634 1634 //TODO - Criar conceito separado para participantes externos e remover o criterio notExternal 1635 1635 public function findExternalPaticipants(&$uri, &$result, &$criteria, $original) { 1636 if (Config::me('uidNumber') && !isset($criteria['notExternal'])) { 1637 $newuri['concept'] = 'user'; 1638 $newuri['service'] = 'PostgreSQL'; 1639 1640 $newCriteria = $original['criteria']; 1641 $valid = true; 1642 1643 $newCriteria['filter'] = array('AND', $newCriteria['filter'], array('=', 'owner', Config::me('uidNumber'))); 1644 $externalUsers = Controller::find($newuri, $original['properties'] ? $original['properties'] : null, $newCriteria ); 1645 1646 if (!is_array($result)) 1647 $result = array(); 1648 1649 if (is_array($externalUsers)) { 1650 foreach ($externalUsers as $i => $v) 1651 $externalUsers[$i]['isExternal'] = '1'; 1652 } 1653 else 1654 $externalUsers = array(); 1655 1656 $result = array_merge($result, $externalUsers); 1657 1658 1659 if(isset($original['criteria']['externalCatalogs']) && $original['criteria']['externalCatalogs'] == true) 1660 { 1661 $externalCatalogs = self::findExternalCatalogContacts($original['criteria']['filter'][2]); 1662 1663 foreach($externalCatalogs as $i => $v) 1664 { 1665 $exist = false; 1666 foreach($result as $vv) 1667 { 1668 if($v['mail'] == $vv['mail'] ) 1669 $exist = true; 1670 } 1671 if(!$exist) 1672 $result[] = $v; 1673 } 1674 } 1675 1676 1677 if(isset($original['criteria']['personalContacts']) && $original['criteria']['personalContacts'] == true) 1678 { 1679 $personalContacts = self::findPersonalContacts($original['criteria']['filter'][2]); 1680 1681 foreach($personalContacts as $i => $v) 1682 { 1683 $exist = false; 1684 foreach($result as $vv) 1685 { 1686 if($v['mail'] == $vv['mail'] ) 1687 $exist = true; 1688 } 1689 if(!$exist) 1690 $result[] = $v; 1691 } 1692 } 1693 1694 return $result ; 1695 } 1636 if (Config::me('uidNumber') && !isset($criteria['notExternal'])) { 1637 $newuri['concept'] = 'user'; 1638 $newuri['service'] = 'PostgreSQL'; 1639 1640 $newCriteria = $original['criteria']; 1641 $valid = true; 1642 1643 $newCriteria['filter'] = array('AND', $newCriteria['filter'], array('=', 'owner', Config::me('uidNumber'))); 1644 $externalUsers = Controller::find($newuri, $original['properties'] ? $original['properties'] : null, $newCriteria ); 1645 1646 if (!is_array($result)) 1647 $result = array(); 1648 1649 if (is_array($externalUsers)) { 1650 foreach ($externalUsers as $i => $v) 1651 $externalUsers[$i]['isExternal'] = '1'; 1652 } 1653 else 1654 $externalUsers = array(); 1655 1656 $result = array_merge($result, $externalUsers); 1657 1658 1659 if(isset($original['criteria']['externalCatalogs']) && $original['criteria']['externalCatalogs'] == true) 1660 { 1661 $externalCatalogs = self::findExternalCatalogContacts($original['criteria']['filter'][2]); 1662 1663 foreach($externalCatalogs as $i => $v) 1664 { 1665 $exist = false; 1666 foreach($result as $vv) 1667 { 1668 if($v['mail'] == $vv['mail'] ) 1669 $exist = true; 1670 } 1671 if(!$exist) 1672 $result[] = $v; 1673 } 1674 } 1675 1676 1677 if(isset($original['criteria']['personalContacts']) && $original['criteria']['personalContacts'] == true) 1678 { 1679 $personalContacts = self::findPersonalContacts($original['criteria']['filter'][2]); 1680 1681 foreach($personalContacts as $i => $v) 1682 { 1683 $exist = false; 1684 foreach($result as $vv) 1685 { 1686 if($v['mail'] == $vv['mail'] ) 1687 $exist = true; 1688 } 1689 if(!$exist) 1690 $result[] = $v; 1691 } 1692 } 1693 1694 return $result ; 1695 } 1696 1696 } 1697 1697 … … 1812 1812 && ($timestamp >= ~PHP_INT_MAX); 1813 1813 } 1814 1815 static function findExternalCatalogContacts( $search ) 1816 { 1817 $result = array(); 1818 $external_srcs = array(); 1819 $external_mappings = array(); 1820 1821 include_once dirname(__DIR__) .'/../../../contactcenter/setup/external_catalogs.inc.php'; 1822 1823 $search = str_replace(' ', '*', $search) ; 1824 $search = '*' . $search . '*'; 1825 1826 foreach($external_srcs as $i => $v) 1827 { 1828 $con = ldap_connect($v['host']); 1829 1830 ldap_set_option( $con , LDAP_OPT_PROTOCOL_VERSION , 3 ); 1831 1832 if( isset( $v['acc'] ) && isset( $v['pw'] ) ) 1833 ldap_bind( $con, $v['acc'], $v['pw'] ); 1834 1835 $fields = array(); 1836 $fields[] = $external_mappings[$i]['contact.names_ordered'][0]; 1837 $fields[] = $external_mappings[$i]['contact.connection.typeof_connection.contact_connection_type_name']['email'][0]; 1838 1839 $ldapFilter = '(&(objectClass='.$v['obj'].')(|('.$fields[0].'='.$search.')('.$fields[1].'='.$search.')))'; 1840 $sr = ldap_search( $con, utf8_encode($v['dn']) , $ldapFilter , $fields ); 1841 if($sr) 1842 { 1843 $search = ldap_get_entries($con, $sr); 1844 1845 for ($j = 0; $j < $search["count"]; ++$j) { 1846 $tmp = array(); 1847 $tmp['name'] = $search[$j][$fields[0]][0]; 1848 $tmp['mail'] = $search[$j][$fields[1]][0]; 1849 $tmp['isExternal'] = '1'; 1850 1851 $result[] = $tmp; 1852 } 1853 } 1854 } 1855 return $result; 1856 } 1857 1858 static function findPersonalContacts($search_for) 1859 { 1860 1861 $query = 'select' 1862 1863 . ' C.id_connection,' 1864 . ' A.id_contact,' 1865 . ' A.names_ordered,' 1866 . ' A.alias,' 1867 . ' A.birthdate,' 1868 . ' A.sex,' 1869 . ' A.pgp_key,' 1870 . ' A.notes,' 1871 . ' A.web_page,' 1872 . ' A.corporate_name,' 1873 . ' A.job_title,' 1874 . ' A.department,' 1875 . ' C.connection_name,' 1876 . ' C.connection_value,' 1877 . ' B.id_typeof_contact_connection,' 1878 . ' phpgw_cc_contact_addrs.id_typeof_contact_address,' 1879 . ' phpgw_cc_addresses.address1,' 1880 . ' phpgw_cc_addresses.address2,' 1881 . ' phpgw_cc_addresses.complement,' 1882 . ' phpgw_cc_addresses.postal_code,' 1883 . ' phpgw_cc_city.city_name,' 1884 . ' phpgw_cc_state.state_name,' 1885 . ' phpgw_cc_addresses.id_country' 1886 ; 1887 1888 $query .= ' from' 1889 . ' phpgw_cc_contact A' 1890 . ' inner join phpgw_cc_contact_conns B on ( A.id_contact = B.id_contact )' 1891 . ' inner join phpgw_cc_connections C on ( B.id_connection = C.id_connection )' 1892 . ' left join phpgw_cc_contact_addrs on ( A.id_contact = phpgw_cc_contact_addrs.id_contact )' 1893 . ' left join phpgw_cc_addresses on ( phpgw_cc_contact_addrs.id_address = phpgw_cc_addresses.id_address )' 1894 . ' left join phpgw_cc_city on ( phpgw_cc_addresses.id_city = phpgw_cc_city.id_city )' 1895 . ' left join phpgw_cc_state on ( phpgw_cc_addresses.id_state = phpgw_cc_state.id_state)' 1896 ; 1897 1898 $query .= ' where ' 1899 . 'A.id_owner=' . Config::me('uidNumber') 1900 . ' and lower(translate(names_ordered, \'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇñÑ\',\'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN\'))' 1901 . ' LIKE lower(translate(\'%' . $search_for . '%\', \'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇñÑ\',\'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN\'))'; 1902 1903 //Se não existir parametro na busca, limita os usuarios no resultado da pesquisa. 1904 if(!$search_for){ 1905 $query .= 'LIMIT 11'; 1906 } 1907 1908 $r = Controller::service('PostgreSQL')->execResultSql($query); 1909 1910 1911 $all_contacts = array(); 1912 foreach( $r as $i => $object ) 1913 { 1914 if ( ! array_key_exists( $object[ 'id_contact' ], $all_contacts ) ) 1915 $all_contacts[ $object[ 'id_contact' ] ] = array( 1916 'connection_value' => '', 1917 'telephonenumber' => '', 1918 'mobile' => '', 1919 'cn' => '', 1920 'id_contact' => '', 1921 'id_connection' => '', 1922 'alias' => '', 1923 'birthdate' => '', 1924 'sex' => '', 1925 'pgp_key' => '', 1926 'notes' => '', 1927 'web_page' => '', 1928 'corporate_name' => '', 1929 'job_title' => '', 1930 'department' => '', 1931 'mail' => '', 1932 'aternative-mail' => '', 1933 'business-phone' => '', 1934 'business-address' => '', 1935 'business-complement' => '', 1936 'business-postal_code' => '', 1937 'business-city_name' => '', 1938 'business-state_name' => '', 1939 'business-id_country' => '', 1940 'business-fax' => '', 1941 'business-pager' => '', 1942 'business-mobile' => '', 1943 'business-address-2' => '', 1944 'home-phone' => '', 1945 'home-address' => '', 1946 'home-complement' => '', 1947 'home-postal_code' => '', 1948 'home-city_name' => '', 1949 'home-state_name' => '', 1950 'home-fax' => '', 1951 'home-pager' => '', 1952 'home-address-2' => '' 1953 1954 1955 ); 1956 1957 switch( $object[ 'id_typeof_contact_connection' ] ) 1958 { 1959 case 1 : 1960 $all_contacts[ $object[ 'id_contact' ] ][ 'connection_value' ] = $object[ 'connection_value' ]; 1961 switch ( strtolower( $object[ 'connection_name' ] ) ) 1962 { 1963 case 'alternativo' : 1964 $all_contacts[ $object[ 'id_contact' ] ][ 'alternative-mail' ] = $object[ 'connection_value' ]; 1965 break; 1966 case 'principal' : 1967 $all_contacts[ $object[ 'id_contact' ] ][ 'mail' ] = $object[ 'connection_value' ]; 1968 break; 1969 } 1970 break; 1971 case 2 : 1972 $all_contacts[ $object[ 'id_contact' ] ][ 'telephonenumber' ] = $object[ 'connection_value' ]; 1973 switch ( strtolower( $object[ 'connection_name' ] ) ) 1974 { 1975 case 'casa' : 1976 $all_contacts[ $object[ 'id_contact' ] ][ 'home-phone' ] = $object[ 'connection_value' ]; 1977 break; 1978 case 'celular' : 1979 $all_contacts[ $object[ 'id_contact' ] ][ 'mobile' ] = $object[ 'connection_value' ]; 1980 break; 1981 case 'trabalho' : 1982 $all_contacts[ $object[ 'id_contact' ] ][ 'business-phone' ] = $object[ 'connection_value' ]; 1983 break; 1984 case 'fax' : 1985 $all_contacts[ $object[ 'id_contact' ] ][ 'home-fax' ] = $object[ 'connection_value' ]; 1986 break; 1987 case 'pager' : 1988 $all_contacts[ $object[ 'id_contact' ] ][ 'home-pager' ] = $object[ 'connection_value' ]; 1989 break; 1990 case 'celular corporativo' : 1991 $all_contacts[ $object[ 'id_contact' ] ][ 'business-mobile' ] = $object[ 'connection_value' ]; 1992 break; 1993 case 'pager corporativo' : 1994 $all_contacts[ $object[ 'id_contact' ] ][ 'business-pager' ] = $object[ 'connection_value' ]; 1995 break; 1996 case 'fax corporativo' : 1997 $all_contacts[ $object[ 'id_contact' ] ][ 'business-fax' ] = $object[ 'connection_value' ]; 1998 break; 1999 } 2000 break; 2001 } 2002 2003 $all_contacts[ $object[ 'id_contact' ] ][ 'cn' ] = utf8_encode($object[ 'names_ordered' ]); 2004 $all_contacts[ $object[ 'id_contact' ] ][ 'id_contact' ] = $object[ 'id_contact' ]; 2005 $all_contacts[ $object[ 'id_contact' ] ][ 'id_connection' ] = $object[ 'id_connection' ]; 2006 $all_contacts[ $object[ 'id_contact' ] ][ 'alias' ] = $object[ 'alias' ]; 2007 $all_contacts[ $object[ 'id_contact' ] ][ 'birthdate' ] = $object[ 'birthdate' ];2008 $all_contacts[ $object[ 'id_contact' ] ][ 'sex' ] = $object[ 'sex' ];2009 $all_contacts[ $object[ 'id_contact' ] ][ 'pgp_key' ] = $object[ 'pgp_key' ];2010 $all_contacts[ $object[ 'id_contact' ] ][ 'notes' ] = $object[ 'notes' ]; 2011 $all_contacts[ $object[ 'id_contact' ] ][ 'web_page' ] = $object[ 'web_page' ];2012 $all_contacts[ $object[ 'id_contact' ] ][ 'corporate_name' ]= $object[ 'corporate_name' ]; 2013 $all_contacts[ $object[ 'id_contact' ] ][ 'job_title' ] = $object[ 'job_title' ];2014 $all_contacts[ $object[ 'id_contact' ] ][ 'department' ] = $object[ 'department' ]; 2015 2016 switch( $object[ 'id_typeof_contact_address' ] ) 2017 { 2018 case 1 : 2019 $all_contacts[ $object[ 'id_contact' ] ][ 'business-address' ] = $object[ 'address1' ]; 2020 $all_contacts[ $object[ 'id_contact' ] ][ 'business-address-2' ] = $object[ 'address2' ]; 2021 $all_contacts[ $object[ 'id_contact' ] ][ 'business-complement' ] = $object[ 'complement' ]; 2022 $all_contacts[ $object[ 'id_contact' ] ][ 'business-postal_code' ] = $object[ 'postal_code' ]; 2023 $all_contacts[ $object[ 'id_contact' ] ][ 'business-city_name' ] = $object[ 'city_name' ]; 2024 $all_contacts[ $object[ 'id_contact' ] ][ 'business-state_name' ] = $object[ 'state_name' ]; 2025 $all_contacts[ $object[ 'id_contact' ] ][ 'business-id_country' ] = $object[ 'id_country' ]; 2026 break; 2027 case 2 : 2028 $all_contacts[ $object[ 'id_contact' ] ][ 'home-address' ] = $object[ 'address1' ]; 2029 $all_contacts[ $object[ 'id_contact' ] ][ 'home-address-2' ] = $object[ 'address2' ]; 2030 $all_contacts[ $object[ 'id_contact' ] ][ 'home-complement' ] = $object[ 'complement' ]; 2031 $all_contacts[ $object[ 'id_contact' ] ][ 'home-postal_code' ] = $object[ 'postal_code' ]; 2032 $all_contacts[ $object[ 'id_contact' ] ][ 'home-city_name' ] = $object[ 'city_name' ]; 2033 $all_contacts[ $object[ 'id_contact' ] ][ 'home-state_name' ] = $object[ 'state_name' ]; 2034 $all_contacts[ $object[ 'id_contact' ] ][ 'home-id_country' ] = $object[ 'id_country' ]; 2035 break; 2036 } 2037 } 2038 $all = array_values($all_contacts); 2039 2040 $result = array(); 2041 foreach($all as $i => $v) 2042 { 2043 if(!$v['mail']) continue; 2044 2045 $tmp = array(); 2046 $tmp['mail'] = $v['mail']; 2047 $tmp['name'] = $v['cn']; 2048 $tmp['isExternal'] = '1'; 2049 $result[] = $tmp; 2050 } 2051 2052 return $result; 2053 2054 } 1814 1815 static function findExternalCatalogContacts( $search ) 1816 { 1817 $result = array(); 1818 $external_srcs = array(); 1819 $external_mappings = array(); 1820 1821 include_once dirname(__DIR__) .'/../../../contactcenter/setup/external_catalogs.inc.php'; 1822 1823 $search = str_replace(' ', '*', $search) ; 1824 $search = '*' . $search . '*'; 1825 1826 foreach($external_srcs as $i => $v) 1827 { 1828 $con = ldap_connect($v['host']); 1829 1830 ldap_set_option( $con , LDAP_OPT_PROTOCOL_VERSION , 3 ); 1831 1832 if( isset( $v['acc'] ) && isset( $v['pw'] ) ) 1833 ldap_bind( $con, $v['acc'], $v['pw'] ); 1834 1835 $fields = array(); 1836 $fields[] = $external_mappings[$i]['contact.names_ordered'][0]; 1837 $fields[] = $external_mappings[$i]['contact.connection.typeof_connection.contact_connection_type_name']['email'][0]; 1838 1839 $ldapFilter = '(&(objectClass='.$v['obj'].')(|('.$fields[0].'='.$search.')('.$fields[1].'='.$search.')))'; 1840 $sr = ldap_search( $con, utf8_encode($v['dn']) , $ldapFilter , $fields ); 1841 if($sr) 1842 { 1843 $search = ldap_get_entries($con, $sr); 1844 1845 for ($j = 0; $j < $search["count"]; ++$j) { 1846 $tmp = array(); 1847 $tmp['name'] = $search[$j][$fields[0]][0]; 1848 $tmp['mail'] = $search[$j][$fields[1]][0]; 1849 $tmp['isExternal'] = '1'; 1850 1851 $result[] = $tmp; 1852 } 1853 } 1854 } 1855 return $result; 1856 } 1857 1858 static function findPersonalContacts($search_for) 1859 { 1860 1861 $query = 'select' 1862 1863 . ' C.id_connection,' 1864 . ' A.id_contact,' 1865 . ' A.names_ordered,' 1866 . ' A.alias,' 1867 . ' A.birthdate,' 1868 . ' A.sex,' 1869 . ' A.pgp_key,' 1870 . ' A.notes,' 1871 . ' A.web_page,' 1872 . ' A.corporate_name,' 1873 . ' A.job_title,' 1874 . ' A.department,' 1875 . ' C.connection_name,' 1876 . ' C.connection_value,' 1877 . ' B.id_typeof_contact_connection,' 1878 . ' phpgw_cc_contact_addrs.id_typeof_contact_address,' 1879 . ' phpgw_cc_addresses.address1,' 1880 . ' phpgw_cc_addresses.address2,' 1881 . ' phpgw_cc_addresses.complement,' 1882 . ' phpgw_cc_addresses.postal_code,' 1883 . ' phpgw_cc_city.city_name,' 1884 . ' phpgw_cc_state.state_name,' 1885 . ' phpgw_cc_addresses.id_country' 1886 ; 1887 1888 $query .= ' from' 1889 . ' phpgw_cc_contact A' 1890 . ' inner join phpgw_cc_contact_conns B on ( A.id_contact = B.id_contact )' 1891 . ' inner join phpgw_cc_connections C on ( B.id_connection = C.id_connection )' 1892 . ' left join phpgw_cc_contact_addrs on ( A.id_contact = phpgw_cc_contact_addrs.id_contact )' 1893 . ' left join phpgw_cc_addresses on ( phpgw_cc_contact_addrs.id_address = phpgw_cc_addresses.id_address )' 1894 . ' left join phpgw_cc_city on ( phpgw_cc_addresses.id_city = phpgw_cc_city.id_city )' 1895 . ' left join phpgw_cc_state on ( phpgw_cc_addresses.id_state = phpgw_cc_state.id_state)' 1896 ; 1897 1898 $query .= ' where ' 1899 . 'A.id_owner=' . Config::me('uidNumber') 1900 . ' and lower(translate(names_ordered, \'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇñÑ\',\'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN\'))' 1901 . ' LIKE lower(translate(\'%' . $search_for . '%\', \'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇñÑ\',\'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN\'))'; 1902 1903 //Se não existir parametro na busca, limita os usuarios no resultado da pesquisa. 1904 if(!$search_for){ 1905 $query .= 'LIMIT 11'; 1906 } 1907 1908 $r = Controller::service('PostgreSQL')->execResultSql($query); 1909 1910 1911 $all_contacts = array(); 1912 foreach( $r as $i => $object ) 1913 { 1914 if ( ! array_key_exists( $object[ 'id_contact' ], $all_contacts ) ) 1915 $all_contacts[ $object[ 'id_contact' ] ] = array( 1916 'connection_value' => '', 1917 'telephonenumber' => '', 1918 'mobile' => '', 1919 'cn' => '', 1920 'id_contact' => '', 1921 'id_connection' => '', 1922 'alias' => '', 1923 'birthdate' => '', 1924 'sex' => '', 1925 'pgp_key' => '', 1926 'notes' => '', 1927 'web_page' => '', 1928 'corporate_name' => '', 1929 'job_title' => '', 1930 'department' => '', 1931 'mail' => '', 1932 'aternative-mail' => '', 1933 'business-phone' => '', 1934 'business-address' => '', 1935 'business-complement' => '', 1936 'business-postal_code' => '', 1937 'business-city_name' => '', 1938 'business-state_name' => '', 1939 'business-id_country' => '', 1940 'business-fax' => '', 1941 'business-pager' => '', 1942 'business-mobile' => '', 1943 'business-address-2' => '', 1944 'home-phone' => '', 1945 'home-address' => '', 1946 'home-complement' => '', 1947 'home-postal_code' => '', 1948 'home-city_name' => '', 1949 'home-state_name' => '', 1950 'home-fax' => '', 1951 'home-pager' => '', 1952 'home-address-2' => '' 1953 1954 1955 ); 1956 1957 switch( $object[ 'id_typeof_contact_connection' ] ) 1958 { 1959 case 1 : 1960 $all_contacts[ $object[ 'id_contact' ] ][ 'connection_value' ] = $object[ 'connection_value' ]; 1961 switch ( strtolower( $object[ 'connection_name' ] ) ) 1962 { 1963 case 'alternativo' : 1964 $all_contacts[ $object[ 'id_contact' ] ][ 'alternative-mail' ] = $object[ 'connection_value' ]; 1965 break; 1966 case 'principal' : 1967 $all_contacts[ $object[ 'id_contact' ] ][ 'mail' ] = $object[ 'connection_value' ]; 1968 break; 1969 } 1970 break; 1971 case 2 : 1972 $all_contacts[ $object[ 'id_contact' ] ][ 'telephonenumber' ] = $object[ 'connection_value' ]; 1973 switch ( strtolower( $object[ 'connection_name' ] ) ) 1974 { 1975 case 'casa' : 1976 $all_contacts[ $object[ 'id_contact' ] ][ 'home-phone' ] = $object[ 'connection_value' ]; 1977 break; 1978 case 'celular' : 1979 $all_contacts[ $object[ 'id_contact' ] ][ 'mobile' ] = $object[ 'connection_value' ]; 1980 break; 1981 case 'trabalho' : 1982 $all_contacts[ $object[ 'id_contact' ] ][ 'business-phone' ] = $object[ 'connection_value' ]; 1983 break; 1984 case 'fax' : 1985 $all_contacts[ $object[ 'id_contact' ] ][ 'home-fax' ] = $object[ 'connection_value' ]; 1986 break; 1987 case 'pager' : 1988 $all_contacts[ $object[ 'id_contact' ] ][ 'home-pager' ] = $object[ 'connection_value' ]; 1989 break; 1990 case 'celular corporativo' : 1991 $all_contacts[ $object[ 'id_contact' ] ][ 'business-mobile' ] = $object[ 'connection_value' ]; 1992 break; 1993 case 'pager corporativo' : 1994 $all_contacts[ $object[ 'id_contact' ] ][ 'business-pager' ] = $object[ 'connection_value' ]; 1995 break; 1996 case 'fax corporativo' : 1997 $all_contacts[ $object[ 'id_contact' ] ][ 'business-fax' ] = $object[ 'connection_value' ]; 1998 break; 1999 } 2000 break; 2001 } 2002 2003 $all_contacts[ $object[ 'id_contact' ] ][ 'cn' ] = utf8_encode($object[ 'names_ordered' ]); 2004 $all_contacts[ $object[ 'id_contact' ] ][ 'id_contact' ] = $object[ 'id_contact' ]; 2005 $all_contacts[ $object[ 'id_contact' ] ][ 'id_connection' ] = $object[ 'id_connection' ]; 2006 $all_contacts[ $object[ 'id_contact' ] ][ 'alias' ] = $object[ 'alias' ]; 2007 $all_contacts[ $object[ 'id_contact' ] ][ 'birthdate' ] = $object[ 'birthdate' ]; 2008 $all_contacts[ $object[ 'id_contact' ] ][ 'sex' ] = $object[ 'sex' ]; 2009 $all_contacts[ $object[ 'id_contact' ] ][ 'pgp_key' ] = $object[ 'pgp_key' ]; 2010 $all_contacts[ $object[ 'id_contact' ] ][ 'notes' ] = $object[ 'notes' ]; 2011 $all_contacts[ $object[ 'id_contact' ] ][ 'web_page' ] = $object[ 'web_page' ]; 2012 $all_contacts[ $object[ 'id_contact' ] ][ 'corporate_name' ]= $object[ 'corporate_name' ]; 2013 $all_contacts[ $object[ 'id_contact' ] ][ 'job_title' ] = $object[ 'job_title' ]; 2014 $all_contacts[ $object[ 'id_contact' ] ][ 'department' ] = $object[ 'department' ]; 2015 2016 switch( $object[ 'id_typeof_contact_address' ] ) 2017 { 2018 case 1 : 2019 $all_contacts[ $object[ 'id_contact' ] ][ 'business-address' ] = $object[ 'address1' ]; 2020 $all_contacts[ $object[ 'id_contact' ] ][ 'business-address-2' ] = $object[ 'address2' ]; 2021 $all_contacts[ $object[ 'id_contact' ] ][ 'business-complement' ] = $object[ 'complement' ]; 2022 $all_contacts[ $object[ 'id_contact' ] ][ 'business-postal_code' ] = $object[ 'postal_code' ]; 2023 $all_contacts[ $object[ 'id_contact' ] ][ 'business-city_name' ] = $object[ 'city_name' ]; 2024 $all_contacts[ $object[ 'id_contact' ] ][ 'business-state_name' ] = $object[ 'state_name' ]; 2025 $all_contacts[ $object[ 'id_contact' ] ][ 'business-id_country' ] = $object[ 'id_country' ]; 2026 break; 2027 case 2 : 2028 $all_contacts[ $object[ 'id_contact' ] ][ 'home-address' ] = $object[ 'address1' ]; 2029 $all_contacts[ $object[ 'id_contact' ] ][ 'home-address-2' ] = $object[ 'address2' ]; 2030 $all_contacts[ $object[ 'id_contact' ] ][ 'home-complement' ] = $object[ 'complement' ]; 2031 $all_contacts[ $object[ 'id_contact' ] ][ 'home-postal_code' ] = $object[ 'postal_code' ]; 2032 $all_contacts[ $object[ 'id_contact' ] ][ 'home-city_name' ] = $object[ 'city_name' ]; 2033 $all_contacts[ $object[ 'id_contact' ] ][ 'home-state_name' ] = $object[ 'state_name' ]; 2034 $all_contacts[ $object[ 'id_contact' ] ][ 'home-id_country' ] = $object[ 'id_country' ]; 2035 break; 2036 } 2037 } 2038 $all = array_values($all_contacts); 2039 2040 $result = array(); 2041 foreach($all as $i => $v) 2042 { 2043 if(!$v['mail']) continue; 2044 2045 $tmp = array(); 2046 $tmp['mail'] = $v['mail']; 2047 $tmp['name'] = $v['cn']; 2048 $tmp['isExternal'] = '1'; 2049 $result[] = $tmp; 2050 } 2051 2052 return $result; 2053 2054 } 2055 2055 } 2056 2056 -
branches/2.5/prototype/modules/calendar/interceptors/Notifications.php
r8003 r8232 34 34 if (Config::regGet('noAlarm') !== false) 35 35 return; //Escapa notificações caso a flag de noAlarm esteja ativa. 36 37 36 37 38 38 39 39 $organizers = array(); //Cache Organizadores … … 99 99 $psUpdated = Controller::find(array('concept' => 'participant'), false, array('deepness' => '1', 'filter' => array('IN', 'id', $updated))); 100 100 101 101 102 102 foreach ($psUpdated as $i => $pUpdated) { 103 103 if ($pUpdated['isOrganizer'] == '1' && $pUpdated['delegatedFrom'] == '0'){ … … 491 491 492 492 if (count($part) > 0) 493 { 494 $from = false; 495 foreach($schedulable['participants'] as $v) 496 { 497 if($v['isOrganizer'] == 1) 498 $from = $v; 499 } 500 501 self::sendMail($data, $ical, implode(',', $part), $subject, 'notify_cancel_body' , $from ); 502 } 493 { 494 $from = false; 495 foreach($schedulable['participants'] as $v) 496 { 497 if($v['isOrganizer'] == 1) 498 $from = $v; 499 } 500 501 self::sendMail($data, $ical, implode(',', $part), $subject, 'notify_cancel_body' , $from ); 502 } 503 503 } 504 504 } … … 522 522 $method = 'CANCEL'; 523 523 $notificationType = 'Cancelamento de Calendario'; 524 $part = 'me'; 525 self::mountStruture($schedulable['id'], $schedulable, false, $data, $subject, $ical, $part, $method, $notificationType); 526 527 $from = false; 528 foreach($schedulable['participants'] as $v) 529 { 530 if($v['isOrganizer'] == 1) 531 $from = $v; 532 } 533 self::sendMail($data, $ical, $participant['user']['mail'], $subject, 'notify_cancel_body' , $from);524 $part = 'me'; 525 self::mountStruture($schedulable['id'], $schedulable, false, $data, $subject, $ical, $part, $method, $notificationType); 526 527 $from = false; 528 foreach($schedulable['participants'] as $v) 529 { 530 if($v['isOrganizer'] == 1) 531 $from = $v; 532 } 533 self::sendMail($data, $ical, $participant['user']['mail'], $subject, 'notify_cancel_body' , $from); 534 534 } 535 535 } -
branches/2.5/prototype/modules/calendar/js/activity.helpers.js
r7977 r8232 222 222 } 223 223 */ 224 UI.dialogs.addActivity.find('select[name="activityStatus"], input[name="allDay"]').removeAttr('disabled'); 225 canDiscardActivityDialog = true; 226 227 UI.dialogs.addActivity.children().find('form.form-addactivity').submit(); 228 UI.dialogs.addActivity.dialog("close"); 224 //Código o qual será chamado para o salvamento da Atividade. 225 var handler_save = function (objsToSave){ 226 UI.dialogs.addActivity.find('select[name="activityStatus"], input[name="allDay"]').removeAttr('disabled'); 227 canDiscardActivityDialog = true; 228 229 var activity_tst = DataLayer.form( UI.dialogs.addActivity.children().find('form') ); 230 if(objsToSave) 231 objsToSave[objsToSave.length] = activity_tst; 232 233 else 234 objsToSave = activity_tst; 235 DataLayer.put('schedulable', objsToSave); 236 237 UI.dialogs.addActivity.dialog("close"); 238 } 239 240 //Verifica se o grupo da atividade mudou 241 if (group.id != UI.dialogs.addActivity.children().find('form select[name="group"] :selected').val() && typeof group.id != 'undefined') { 242 //Janela de dialogo 243 $.Zebra_Dialog('Você alterou o grupo da atividade, deseja alterar também o grupo das tarefas pertencentes à essa atividade?', { 244 'type': 'question', 245 'overlay_opacity': '0.5', 246 'modal': true, 247 'buttons': ['Não Alterar', 'Alterar'], 248 'onClose': function(clicked) { 249 if(clicked == 'Não Alterar') { 250 251 handler_save(); 252 }else{ 253 var objsToSave = []; 254 //percorre as tarefas da atividade para verificar se o grupo mudou 255 for(var t in objActivity.tasks){ 256 if(typeof objActivity.tasks[t].group != 'undefined') 257 if (objActivity.tasks[t].group != UI.dialogs.addActivity.children().find('form select[name="group"] :selected').val()){ 258 objActivity.tasks[t].group = UI.dialogs.addActivity.children().find('form select[name="group"] :selected').val(); 259 objsToSave[objsToSave.length] = {'calendar' : objActivity.tasks[t].group, 'id': t}; 260 } 261 } 262 handler_save(objsToSave); 263 264 } 265 266 } 267 }); 268 269 270 } else { 271 handler_save(); 272 } 229 273 230 274 }).end() … … 259 303 ['=', 'type', '2'], 260 304 ['>=','startTime', $.now()], 261 ['in', 'calendar', [$('div.new-activity-win.active select[name="groupFilter"]').val()]] 305 ['in', 'calendar', [$('div.new-activity-win.active select[name="groupFilter"]').val()]] 262 306 ], criteria: {filterTasks: true, deepness: 2} 263 307 }; … … 410 454 updateActivity = false; 411 455 412 var idTask = UI.dialogs.addActivity.find('input[name="idActivity"]').val(); 413 414 getSchedulable( idTask ); 415 416 var objActivity = DataLayer.get('schedulable:activity', idTask ); 456 var idTask = UI.dialogs.addActivity.find('input[name="idActivity"]').val(); 457 458 getSchedulable( idTask ); 459 460 var objActivity = DataLayer.get('schedulable:activity', idTask ); 417 461 var blkAddTask = UI.dialogs.addActivity.find('#group_addactivity_details8'); 418 462 var blkAuto = UI.dialogs.addActivity.find('#group_addactivity_details1'); … … 673 717 text: false 674 718 }).click(function () { 675 676 var idTask = $(this).parents('li').find('input[name="idtask[]"]').val() 677 getSchedulable(idTask); 678 var task = DataLayer.get('schedulable:task', idTask); 679 taskDetails(task, true, '',true, null, true); 719 720 var idTask = $(this).parents('li').find('input[name="idtask[]"]').val() 721 getSchedulable(idTask); 722 var task = DataLayer.get('schedulable:task', idTask); 723 taskDetails(task, true, '',true, null, true); 680 724 }) 681 725 .addClass('tiny disable ui-button-disabled ui-state-disabled') -
branches/2.5/prototype/modules/calendar/js/calendar.codecs.js
r8051 r8232 75 75 Calendar.currentView = DataLayer.encode('schedulable:calendar', DataLayer.dispatch('modules/calendar/schedules', DataLayer.criteria('schedulable:calendar', {start: start,end: end})) ); //DataLayer.get( 'schedulable:calendar', {start: start,end: end} ); 76 76 } 77 if( !!Calendar.currentView[ signature.calendar.id ]) 78 { 79 if(signature.hidden == true ) 80 Calendar.currentView[ signature.calendar.id ].hidden = true; 81 else 82 Calendar.currentView[ signature.calendar.id ].hidden = false; 83 } 84 77 78 if( !!Calendar.currentView[ signature.calendar.id ]) 79 { 80 if(signature.hidden == true ) 81 Calendar.currentView[ signature.calendar.id ].hidden = true; 82 else 83 Calendar.currentView[ signature.calendar.id ].hidden = false; 84 } 85 85 86 var view = Calendar.currentView[ signature.calendar.id ]; 86 87 87 88 88 89 callback( view && !view.hidden ? view : [] ); 89 90 }, … … 211 212 212 213 Calendar.rerenderView(true); 213 if(updateActivity){ 214 215 DataLayer.remove('taskToActivity', false); 214 if(updateActivity){ 215 216 DataLayer.remove('taskToActivity', false); 216 217 refreshTaskActivity(); 217 } 218 218 } 219 219 220 }); 220 221 } … … 624 625 calendars: Calendar.calendars, 625 626 calendar: objEvent.calendar, 626 occurrences: objEvent.occurrences, 627 occurrences: objEvent.occurrences, 627 628 summary: objEvent.summary, 628 629 type: !!objEvent.type ? objEvent.type : 1, … … 632 633 startDate: Timezone.getDate( (objEvent.DayLigth ? objEvent.DayLigth.event.startTime : objEvent.startTime), 'start', objEvent.allDay , true), 633 634 startHour: objEvent.DayLigth ? Timezone.getHour( objEvent.DayLigth.event.startTime) : Timezone.formateHour( objEvent.startTime ), 634 startUnixTime: objEvent.DayLigth ? objEvent.DayLigth.event.startTime : objEvent.startTime, 635 startUnixTime: objEvent.DayLigth ? objEvent.DayLigth.event.startTime : objEvent.startTime, 635 636 endDate: Timezone.getDate( (objEvent.DayLigth ? objEvent.DayLigth.event.endTime : objEvent.endTime), 'end', objEvent.allDay , true), 636 637 endHour: objEvent.DayLigth ? Timezone.getHour( objEvent.DayLigth.event.endTime) : Timezone.formateHour( objEvent.endTime ), … … 832 833 location: objEvent.location, 833 834 category: objEvent.category, 834 calendar: objEvent.calendar, 835 calendar: objEvent.calendar, 835 836 taskStatus: objEvent.status, 836 837 groups: Calendar.groups, … … 840 841 description: objEvent.description, 841 842 timezone: objEvent.timezone, 842 startUnixTime: objEvent.startTime, 843 startUnixTime: objEvent.startTime, 843 844 timezones: Timezone.timezones, 844 845 percentage: (objEvent.percentage) ? objEvent.percentage : '0', … … 1189 1190 percentage: task.percentage, 1190 1191 priority: task.priority, 1191 summary: task.summary 1192 summary: task.summary, 1193 group: task.calendar 1192 1194 } 1193 1195 … … 1217 1219 percentage: (objEvent.percentage) ? objEvent.percentage : '0', 1218 1220 priority: objEvent.priority, 1219 startUnixTime: objEvent.startTime, 1221 startUnixTime: objEvent.startTime, 1220 1222 startDate: new Date( parseInt(objEvent.startTime) ).setTimezoneOffset( Timezone.timezone( objEvent.timezone ) ).toString( User.preferences.dateFormat ), 1221 1223 startHour: dateCalendar.formatDate(Timezone.getDateEvent(new Date( parseInt(objEvent.startTime)), objEvent.timezone, objEvent.calendar, objEvent.DayLigth, 'startTime'), User.preferences.hourFormat), … … 1637 1639 } 1638 1640 1639 var orderByStartUnixTime = function( a , b ) 1640 { 1641 return parseInt(a.startUnixTime) > parseInt(b.startUnixTime); 1642 } 1643 1641 var orderByStartUnixTime = function( a , b ) 1642 { 1643 return parseInt(a.startUnixTime) > parseInt(b.startUnixTime); 1644 } 1645 1644 1646 for (var i=0; i < res.length; i++) { 1645 1646 if(Calendar.currentView[res[i].calendar].hidden == true) 1647 continue; 1648 1647 1648 if(Calendar.currentView[res[i].calendar].hidden == true) 1649 continue; 1650 1649 1651 res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type; 1650 1652 1651 1653 var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 1652 1654 var endDate = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 1653 1655 1654 1656 var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() ); 1655 1657 1656 1658 var occurrences = [ res[i].startUnixTime ]; 1657 1659 1658 1660 if( res[i].occurrences ) 1659 1661 { … … 1671 1673 }); 1672 1674 1673 res2.startUnixTime = parseInt(occurrences[ii]); 1674 1675 res2.startUnixTime = parseInt(occurrences[ii]); 1676 1675 1677 if(res[i].repeat) 1676 1678 res2.repeat = typeRepeat[res[i].repeat.frequency]; … … 1683 1685 1684 1686 dates[index].events.push(res2); 1685 1686 dates[index].events = dates[index].events.sort(orderByStartUnixTime); 1687 1688 dates[index].events = dates[index].events.sort(orderByStartUnixTime); 1687 1689 1688 1690 } … … 1812 1814 return (evt.editable == '1' ) ? 1813 1815 { 1816 selectable: true, 1814 1817 editable: true, 1815 selectable: true,1816 1818 className: 'fullcalendar-context-menu event-type-1 event-id-'+idEvent+' calendar-id-'+calendar.id+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') 1817 1819 } : { … … 1874 1876 occurrence: occurrences[i], 1875 1877 type: typeEvent, 1876 calendar: evt.calendar, 1877 unanswered: evt.unanswered, 1878 calendar: evt.calendar, 1879 unanswered: evt.unanswered, 1880 status: evt.status 1878 1881 }, (parseInt(typeEvent) == 1 ? eventEditable(evt.id, isRepeat, i ) : (parseInt(typeEvent) == 2 ? taskEditable(evt.id) : {editable: false, disableResizing: true, disableDragging: true})))); 1879 1882 } -
branches/2.5/prototype/modules/calendar/js/calendar.shared.js
r7217 r8232 75 75 }); 76 76 77 DataLayer.commit(); 78 UI.dialogs.sharedCalendar.dialog("close"); 77 DataLayer.commit(false, false, function(result){ 78 79 /* 80 * Force clean cache 81 * */ 82 DataLayer.storage.cache = {}; 83 UI.dialogs.sharedCalendar.dialog("close"); 84 85 }); 86 79 87 }; 80 88 … … 295 303 296 304 //Carrega os dados já cadastrados 297 var dataCurrent = DataLayer.get('calendarToPermission:detail', { 298 filter: ['=','calendar', calendarId] , 299 criteria: { 300 deepness: 2 301 } 302 }); 303 if(dataCurrent){ 304 for(var i = 0; i < dataCurrent.length; i++){ 305 if(dataCurrent[i].user == "0"){ 306 UI.dialogs.sharedCalendar.find('input[name="isPublic"]').attr('checked', 'checked') 307 .parent().find('.free-busy').toggleClass('hidden'); 308 if(dataCurrent[i].acl['busy']) 309 UI.dialogs.sharedCalendar.find('input[name="busy"]').attr('checked', 'checked'); 310 }else{ 311 currentUsers[dataCurrent[i].user.id] = true; 312 313 UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list') 314 .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [{ 315 id: dataCurrent[i].user.id, 316 name: dataCurrent[i].user.name, 317 mail: dataCurrent[i].user.mail, 318 acl:dataCurrent[i].acl, 319 aclValue: dataCurrent[i].aclValues, 320 current: true, 321 idPermission: dataCurrent[i].id 322 }])) 323 .scrollTo('max'); 324 $('li.not-user').remove(); 325 callbackSharedCotactsAdd(); 326 327 for (var f in dataCurrent[i].acl){ 328 if(dataCurrent[i].acl[f]){ 329 UI.dialogs.sharedCalendar.find('.'+f+':last').toggleClass('attendee-permissions-change-button') 330 .find('span:first').toggleClass('attendee-permissions-change').end(); 331 } 332 } 333 } 334 } 335 } 305 var loadOldData = function (calendar) 306 { 307 UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list').empty(); 308 309 var dataCurrent = DataLayer.get('calendarToPermission:detail', { 310 filter: ['=','calendar', calendar] , 311 criteria: { 312 deepness: 2 313 } 314 }); 315 316 if(dataCurrent){ 317 for(var i = 0; i < dataCurrent.length; i++){ 318 if(dataCurrent[i].user == "0"){ 319 UI.dialogs.sharedCalendar.find('input[name="isPublic"]').attr('checked', 'checked') 320 .parent().find('.free-busy').toggleClass('hidden'); 321 if(dataCurrent[i].acl['busy']) 322 UI.dialogs.sharedCalendar.find('input[name="busy"]').attr('checked', 'checked'); 323 }else{ 324 currentUsers[dataCurrent[i].user.id] = true; 325 326 UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list') 327 .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [{ 328 id: dataCurrent[i].user.id, 329 name: dataCurrent[i].user.name, 330 mail: dataCurrent[i].user.mail, 331 acl:dataCurrent[i].acl, 332 aclValue: dataCurrent[i].aclValues, 333 current: true, 334 idPermission: dataCurrent[i].id 335 }])) 336 .scrollTo('max'); 337 $('li.not-user').remove(); 338 callbackSharedCotactsAdd(); 339 340 for (var f in dataCurrent[i].acl){ 341 if(dataCurrent[i].acl[f]){ 342 UI.dialogs.sharedCalendar.find('.'+f+':last').toggleClass('attendee-permissions-change-button') 343 .find('span:first').toggleClass('attendee-permissions-change').end(); 344 } 345 } 346 } 347 } 348 } 349 } 350 351 loadOldData(calendarId); 352 353 //Bind calendar select change 354 var select = UI.dialogs.sharedCalendar.find('select[name="calendar"]'); 355 select.change(function() { 356 loadOldData(select.val()); 357 }); 358 336 359 UI.dialogs.sharedCalendar.dialog('open'); 337 360 } … … 526 549 for (var i = 0; i < Calendar.signatures.length; i++) 527 550 if(Calendar.signatures[i].isOwner == "0"){ 551 552 /* 553 * Verificar se o Owner é um objeto caso ao contrário é realizado a busca e adicionado ao mesmo o uid 554 * */ 555 if (Calendar.signatures[i].permission.owner != "object"){ 556 557 var result = DataLayer.get('calendarToPermission', { 558 filter: ['AND', ['=','id', Calendar.signatures[i].permission.id]] , 559 criteria: { 560 deepness: 2 561 } 562 }, true); 563 564 Calendar.signatures[i].permission.owner = {}; 565 Calendar.signatures[i].permission.owner['uid'] = result[0].owner.uid; 566 567 } 568 528 569 var dataCurrent = Calendar.signatures[i].calendar; 529 570 currentCalendars[Calendar.signatures[i].permission.id] = { -
branches/2.5/prototype/modules/calendar/js/desktop.notification.js
r7693 r8232 5 5 initDesktopNotificationAddon: function(){ 6 6 if(useDesktopNotification()){ 7 7 if ($.cookie('no-notification') == 'true'){ 8 return false; 9 } 8 10 if (!window.webkitNotifications && $.browser.mozilla) 9 11 this.installDektopNotificationAddon(); 10 12 11 13 if(window.webkitNotifications && window.webkitNotifications.checkPermission()){ 12 14 if($.browser.safari){ 13 15 $.Zebra_Dialog('Deseja instalar o plugin de notificação desktop?', { 14 16 'custom_class': 'request-notification-permission', … … 19 21 20 22 $('div.ZebraDialog.request-notification-permission a').click(function() { 21 if($(this).html() == 'Sim') 23 if($(this).html() == 'Sim'){ 22 24 window.webkitNotifications.requestPermission(); 25 }else if ($(this).html() == 'Não'){ 26 $.cookie('no-notification','true'); 27 } 23 28 }); 24 29 }else 25 30 window.webkitNotifications.requestPermission(); 26 31 } 32 }else{ 33 $.cookie('no-notification',null); 27 34 } 28 35 }, … … 40 47 } 41 48 }; 42 49 ; 43 50 InstallTrigger.install(params); 44 45 51 return false; 46 52 }, -
branches/2.5/prototype/modules/calendar/js/helpers.js
r8059 r8232 111 111 var end = $("#calendar").fullCalendar('getView').visEnd.getTime()/1000; 112 112 var criteria = DataLayer.criteria("schedulable:calendar", {'start':start, 'end':end} ); 113 114 var data = DataLayer.encode('schedulable:print', DataLayer.dispatch('modules/calendar/schedules', criteria ) ); 113 114 var data = DataLayer.encode('schedulable:print', DataLayer.dispatch('modules/calendar/schedules', criteria ) ); 115 115 116 116 if($("#calendar").fullCalendar('getView').name == "month"){ … … 163 163 print.removeClass('fc-button-year'); 164 164 print.removeClass('fc-corner-left'); 165 print.removeClass('fc-state-active'); 165 print.removeClass('fc-state-active'); 166 166 print.find('.fc-button-content').html('Imprimir'); 167 167 $('.fc-header-right').append(print); … … 179 179 function eventDetails( objEvent, decoded, path, isMail, repeat, buttonClicked) 180 180 { 181 182 181 $('.qtip.qtip-blue').remove(); 183 182 184 183 attendees = {}; 185 186 if(!!objEvent.participants) 187 { 188 $.each(objEvent.participants ,function(index, value) { 189 190 var part = DataLayer.get('participant' , value ); 191 var user = DataLayer.get('user' , part.user ); 192 193 attendees[part.user] = user.name; 194 }); 195 } 196 184 185 if(!!objEvent.participants) 186 { 187 $.each(objEvent.participants ,function(index, value) { 188 189 var part = DataLayer.get('participant' , value ); 190 var user = DataLayer.get('user' , part.user ); 191 192 attendees[part.user] = user.name; 193 }); 194 } 195 197 196 if(path == undefined) 198 197 path = ""; 199 198 200 199 if( !decoded ) 201 objEvent = DataLayer.decode("schedulable:calendar", objEvent ); 202 203 var dtstamp = objEvent.dtstamp; 200 objEvent = DataLayer.decode("schedulable:calendar", objEvent ); 201 202 var dtstamp = objEvent.dtstamp; 204 203 if(!isMail) 205 objEvent = DataLayer.encode( "schedulable:preview", objEvent ); 206 if (!dtstamp) 207 var date = new Date(); 208 else 209 var date = new Date(parseInt(dtstamp)); 210 objEvent.creationDate = []; 211 objEvent.creationDate[0] = dateFormat(parseInt(dtstamp),'dd/mm/yyyy'); 212 objEvent.creationDate[1] = date.getHours(); 213 objEvent.creationDate[2] = date.getMinutes(); 214 204 objEvent = DataLayer.encode( "schedulable:preview", objEvent ); 205 if (!dtstamp) 206 var date = new Date(); 207 else 208 var date = new Date(parseInt(dtstamp)); 209 objEvent.creationDate = []; 210 objEvent.creationDate[0] = dateFormat(parseInt(dtstamp),'dd/mm/yyyy'); 211 objEvent.creationDate[1] = date.getHours(); 212 objEvent.creationDate[2] = date.getMinutes(); 213 215 214 if(typeof(objEvent.id) == 'undefined'){ 216 215 objEvent.alarms = Calendar.signatureOf[User.preferences.defaultCalendar || Calendar.calendarIds[0]].defaultAlarms || false; … … 270 269 }).click(function () { 271 270 var participant = DataLayer.get('participant' , $(this).parents('li').find('[type=checkbox]').val()); 272 DataLayer.remove('participant', participant.id); 271 DataLayer.remove('participant', participant.id); 272 273 273 if($(this).parent().find('.button.delegate').hasClass('attendee-permissions-change-button')){ 274 274 removeOthers(); … … 278 278 blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change'); 279 279 } 280 280 281 $(this).parents('li').remove(); 281 282 282 283 if(blkAddAtendee.find(".attendee-list li").length == 1) 283 284 blkAddAtendee.find("li.not-attendee").removeClass('hidden'); 284 delete attendees[participant.user];285 delete attendees[participant.user]; 285 286 }) 286 287 .addClass('tiny disable ui-button-disabled ui-state-disabled') … … 467 468 } 468 469 ); 470 471 469 472 } 470 473 … … 487 490 $('.qtip.qtip-blue.qtip-active').qtip('destroy'); 488 491 attendees = {}; 492 DataLayer.rollback();//Limpa cache do datalayer 489 493 }, 490 494 beforeClose: function(event, ui) { … … 566 570 } 567 571 568 569 dateSameValue = function(){ 570 UI.dialogs.addEvent.find('input.start-date').datepicker({ 571 dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'), 572 onSelect : function (selectedDate){ 573 endDate = $(".end-date").val(); 574 storeSelectedDate = selectedDate; 575 576 if ( User.preferences.dateFormat == "dd/MM/yyyy" || User.preferences.dateFormat == "dd-MM-yyyy" ) { 577 if ( User.preferences.dateFormat == "dd/MM/yyyy" ) { 578 selectedDate = selectedDate.split("/"); 579 endDate = endDate.split("/"); 580 } else if( User.preferences.dateFormat == "dd-MM-yyyy" ){ 581 selectedDate = selectedDate.split("-"); 582 endDate = endDate.split("-"); 583 } 584 585 newDt = new Date(selectedDate[2],selectedDate[1], selectedDate[0]); 586 endDate = new Date(endDate[2],endDate[1], endDate[0]); 587 588 } else if ( User.preferences.dateFormat == "MM/dd/yyyy" ) { 589 selectedDate = selectedDate.split("/"); 590 endDate = endDate.split("/"); 591 592 newDt = new Date(selectedDate[2],selectedDate[0], selectedDate[1]); 593 endDate = new Date(endDate[2],endDate[0], endDate[1]); 594 } 595 596 if( newDt > endDate ) 597 $(".end-date").val(storeSelectedDate); 598 }, 599 onClose: function(){ 600 UI.dialogs.addEvent.find(".end-date").val(UI.dialogs.addEvent.find(".start-date").val()); 601 } 602 }); 603 } 604 572 573 dateSameValue = function(){ 574 UI.dialogs.addEvent.find('input.start-date').datepicker({ 575 dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'), 576 onSelect : function (selectedDate){ 577 endDate = $(".end-date").val(); 578 storeSelectedDate = selectedDate; 579 580 if ( User.preferences.dateFormat == "dd/MM/yyyy" || User.preferences.dateFormat == "dd-MM-yyyy" ) { 581 if ( User.preferences.dateFormat == "dd/MM/yyyy" ) { 582 selectedDate = selectedDate.split("/"); 583 endDate = endDate.split("/"); 584 } else if( User.preferences.dateFormat == "dd-MM-yyyy" ){ 585 selectedDate = selectedDate.split("-"); 586 endDate = endDate.split("-"); 587 } 588 589 newDt = new Date(selectedDate[2],selectedDate[1], selectedDate[0]); 590 endDate = new Date(endDate[2],endDate[1], endDate[0]); 591 592 } else if ( User.preferences.dateFormat == "MM/dd/yyyy" ) { 593 selectedDate = selectedDate.split("/"); 594 endDate = endDate.split("/"); 595 596 newDt = new Date(selectedDate[2],selectedDate[0], selectedDate[1]); 597 endDate = new Date(endDate[2],endDate[0], endDate[1]); 598 } 599 600 if( newDt > endDate ) 601 $(".end-date").val(storeSelectedDate); 602 }, 603 onClose: function(){ 604 UI.dialogs.addEvent.find(".end-date").val(UI.dialogs.addEvent.find(".start-date").val()); 605 } 606 }); 607 } 608 605 609 DataLayer.render( path+'templates/event_repeat.ejs', { 606 610 event:objEvent … … 608 612 609 613 UI.dialogs.addEvent.find('#calendar_addevent_details3').html(repeatHtml); 610 611 dateSameValue(); 614 615 dateSameValue(); 612 616 $(".date").datepicker({ 613 617 dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy') 614 }); 615 616 618 }); 619 620 617 621 if(objEvent.repeat) 618 622 { … … 1010 1014 }); 1011 1015 1012 dateSameValue(); 1013 1014 var fixHour = function(){ 1015 currentTimeStart = UI.dialogs.addEvent.find("input.start-time").val(); 1016 UI.dialogs.addEvent.find("input.start-time").val(currentTimeStart.replace(".","").replace(".","")); 1017 } 1018 1019 var setTime = function( selectedDateTime ) { 1020 if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __')) 1021 selectedDateTime.value = ""; 1022 if(!(User.preferences.hourFormat.length == 5)) 1023 $(this).val(selectedDateTime.replace(/[\.]/gi, "")); 1024 updateMap(); 1025 1026 if( Date.parse(selectedDateTime) < Date.parse(oldTime) ) return true; 1027 1028 var time = selectedDateTime.split(":"); 1029 1030 var hh = time[0]; 1031 var mm = time[1].substring(0, 2); 1016 dateSameValue(); 1017 1018 var fixHour = function(){ 1019 currentTimeStart = UI.dialogs.addEvent.find("input.start-time").val(); 1020 UI.dialogs.addEvent.find("input.start-time").val(currentTimeStart.replace(".","").replace(".","")); 1021 } 1022 1023 var setTime = function( selectedDateTime ) { 1024 if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __')) 1025 selectedDateTime.value = ""; 1026 if(!(User.preferences.hourFormat.length == 5)) 1027 $(this).val(selectedDateTime.replace(/[\.]/gi, "")); 1028 updateMap(); 1029 1030 if( Date.parse(selectedDateTime) < Date.parse(oldTime) ) return true; 1032 1031 1033 1034 dt = new Date(); 1035 dt.setHours(hh, mm); 1036 var startHours = dt.getHours(); 1037 add = parseInt(User.preferences.defaultDuration) + parseInt($("input.end-time").val().split(":")[1].substring(0,2)); 1038 dt.addMinutes(add); 1032 var time = selectedDateTime.split(":"); 1033 1034 var hh = time[0]; 1035 var mm = time[1].substring(0, 2); 1036 1039 1037 1040 1041 var minutes = dt.getMinutes().toString(); 1042 var hours = dt.getHours(); 1043 UI.dialogs.addEvent.find("input.start-time").val(selectedDateTime.replace(".","").replace(".","")); 1044 1045 1046 if (time[1].indexOf("p.m.") != -1 ) { 1047 var startHours = startHours == 12 ? 12 : startHours; 1048 var startHours = startHours == 1 ? 13 : startHours; 1049 var startHours = startHours == 2 ? 14 : startHours; 1050 var startHours = startHours == 3 ? 15 : startHours; 1051 var startHours = startHours == 4 ? 16 : startHours; 1052 var startHours = startHours == 5 ? 17 : startHours; 1053 var startHours = startHours == 6 ? 18 : startHours; 1054 var startHours = startHours == 7 ? 19 : startHours; 1055 var startHours = startHours == 8 ? 20 : startHours; 1056 var startHours = startHours == 9 ? 21 : startHours; 1057 var startHours = startHours == 10 ? 22 : startHours; 1058 var startHours = startHours == 11 ? 23 : startHours; 1059 } else if (time[1].indexOf("a.m.") ) { 1060 var startHours = startHours == 12 ? 00 : startHours; 1061 } 1062 1063 1064 dtFormat = (time[1].indexOf("p.m.") != -1 || time[1].indexOf("a.m.") != -1) ? ((((User.preferences.defaultDuration / 60) + startHours) >= 12 && (startHours + (User.preferences.defaultDuration / 60)) < 24) ? " pm" : " am") : ""; 1065 1066 var newHours = ""; 1067 if(dtFormat){ 1068 hours = hours == 13 ? 01 : hours; 1069 hours = hours == 14 ? 02 : hours; 1070 hours = hours == 15 ? 03 : hours; 1071 hours = hours == 16 ? 04 : hours; 1072 hours = hours == 17 ? 05 : hours; 1073 hours = hours == 18 ? 06 : hours; 1074 hours = hours == 19 ? 07 : hours; 1075 hours = hours == 20 ? 08 : hours; 1076 hours = hours == 21 ? 09 : hours; 1077 hours = hours == 22 ? 10 : hours; 1078 hours = hours == 23 ? 11 : hours; 1079 hours = hours == 24 ? 12 : hours; 1080 } else { 1081 newHours = hours <= 9 ? "0" : ""; 1082 } 1083 1084 minutes = minutes.length == 1 ? "0"+minutes+dtFormat : minutes+dtFormat; 1085 newHours += hours.toString() + ":" +minutes; 1086 UI.dialogs.addEvent.find("input.end-time").val(newHours); 1087 1088 } 1089 1090 UI.dialogs.addEvent.find(".start-date").focusout(function(data){ 1091 UI.dialogs.addEvent.find(".end-date").val($(this).val()); 1092 }); 1038 dt = new Date(); 1039 dt.setHours(hh, mm); 1040 var startHours = dt.getHours(); 1041 add = parseInt(User.preferences.defaultDuration) + parseInt($("input.end-time").val().split(":")[1].substring(0,2)); 1042 dt.addMinutes(add); 1043 1044 1045 var minutes = dt.getMinutes().toString(); 1046 var hours = dt.getHours(); 1047 UI.dialogs.addEvent.find("input.start-time").val(selectedDateTime.replace(".","").replace(".","")); 1048 1049 1050 if (time[1].indexOf("p.m.") != -1 ) { 1051 var startHours = startHours == 12 ? 12 : startHours; 1052 var startHours = startHours == 1 ? 13 : startHours; 1053 var startHours = startHours == 2 ? 14 : startHours; 1054 var startHours = startHours == 3 ? 15 : startHours; 1055 var startHours = startHours == 4 ? 16 : startHours; 1056 var startHours = startHours == 5 ? 17 : startHours; 1057 var startHours = startHours == 6 ? 18 : startHours; 1058 var startHours = startHours == 7 ? 19 : startHours; 1059 var startHours = startHours == 8 ? 20 : startHours; 1060 var startHours = startHours == 9 ? 21 : startHours; 1061 var startHours = startHours == 10 ? 22 : startHours; 1062 var startHours = startHours == 11 ? 23 : startHours; 1063 } else if (time[1].indexOf("a.m.") ) { 1064 var startHours = startHours == 12 ? 00 : startHours; 1065 } 1066 1067 1068 dtFormat = (time[1].indexOf("p.m.") != -1 || time[1].indexOf("a.m.") != -1) ? ((((User.preferences.defaultDuration / 60) + startHours) >= 12 && (startHours + (User.preferences.defaultDuration / 60)) < 24) ? " pm" : " am") : ""; 1069 1070 var newHours = ""; 1071 if(dtFormat){ 1072 hours = hours == 13 ? 01 : hours; 1073 hours = hours == 14 ? 02 : hours; 1074 hours = hours == 15 ? 03 : hours; 1075 hours = hours == 16 ? 04 : hours; 1076 hours = hours == 17 ? 05 : hours; 1077 hours = hours == 18 ? 06 : hours; 1078 hours = hours == 19 ? 07 : hours; 1079 hours = hours == 20 ? 08 : hours; 1080 hours = hours == 21 ? 09 : hours; 1081 hours = hours == 22 ? 10 : hours; 1082 hours = hours == 23 ? 11 : hours; 1083 hours = hours == 24 ? 12 : hours; 1084 } else { 1085 newHours = hours <= 9 ? "0" : ""; 1086 } 1087 1088 minutes = minutes.length == 1 ? "0"+minutes+dtFormat : minutes+dtFormat; 1089 newHours += hours.toString() + ":" +minutes; 1090 UI.dialogs.addEvent.find("input.end-time").val(newHours); 1091 1092 } 1093 1094 UI.dialogs.addEvent.find(".start-date").focusout(function(data){ 1095 UI.dialogs.addEvent.find(".end-date").val($(this).val()); 1096 }); 1093 1097 1094 1098 var oldTime = UI.dialogs.addEvent.find('input.start-time').val(); 1095 $(".start-time").focusout(function(data){ 1096 if($("#calendar").fullCalendar('getView').name == "month" || buttonClicked) { 1097 setTime( $(this).val() ); 1098 } 1099 }); 1100 1101 UI.dialogs.addEvent.find('input.start-time').timepicker({ 1102 ampm : ((User.preferences.hourFormat.length > 5) ? true: false), 1103 timeFormat: "hh:mm tt", 1104 onSelect: function( selectedDateTime ){ 1105 if($("#calendar").fullCalendar('getView').name == "month" || buttonClicked) { 1106 if ( selectedDateTime.indexOf("p.m.") == -1 || !selectedDateTime.indexOf("a.m.") == -1 ) { 1107 var selectedTime = selectedDateTime.split(":"); 1108 var endTime = UI.dialogs.addEvent.find(".end-time").val(); 1109 endTime = endTime.split(":"); 1110 1111 var t1 = new Date(false,false,false,selectedTime[0],selectedTime[1],false); 1112 var t2 = new Date(false,false,false,endTime[0],endTime[1],false); 1113 1114 if (t1 < t2) return true; 1115 } 1116 1117 setTime( selectedDateTime ); 1118 } 1119 }, 1120 onClose : function (selectedDateTime){ 1121 fixHour(); 1122 } 1123 1124 }); 1125 1126 1127 1099 $(".start-time").focusout(function(data){ 1100 if($("#calendar").fullCalendar('getView').name == "month" || buttonClicked) { 1101 setTime( $(this).val() ); 1102 } 1103 }); 1104 1105 UI.dialogs.addEvent.find('input.start-time').timepicker({ 1106 ampm : ((User.preferences.hourFormat.length > 5) ? true: false), 1107 timeFormat: "hh:mm tt", 1108 onSelect: function( selectedDateTime ){ 1109 if($("#calendar").fullCalendar('getView').name == "month" || buttonClicked) { 1110 if ( selectedDateTime.indexOf("p.m.") == -1 || !selectedDateTime.indexOf("a.m.") == -1 ) { 1111 var selectedTime = selectedDateTime.split(":"); 1112 var endTime = UI.dialogs.addEvent.find(".end-time").val(); 1113 endTime = endTime.split(":"); 1114 1115 var t1 = new Date(false,false,false,selectedTime[0],selectedTime[1],false); 1116 var t2 = new Date(false,false,false,endTime[0],endTime[1],false); 1117 1118 if (t1 < t2) return true; 1119 } 1120 1121 setTime( selectedDateTime ); 1122 } 1123 }, 1124 onClose : function (selectedDateTime){ 1125 fixHour(); 1126 } 1127 1128 }); 1129 1130 1131 1128 1132 UI.dialogs.addEvent.find('input.end-time').timepicker({ 1129 1133 closeText: 'Ok', … … 1138 1142 $(this).val(selectedDateTime.replace(/[\.]/gi, "")); 1139 1143 updateMap(); 1140 1141 if ( selectedDateTime.indexOf("p.m.") == -1 || !selectedDateTime.indexOf("a.m.") == -1 ) { 1142 var startT = UI.dialogs.addEvent.find('input.start-time'); 1143 1144 var lessZeroTime = function( sTime ) { 1145 sTime = sTime.split(":"); 1146 sTime = new Date(false,false,false,sTime[0],sTime[1],false); 1147 sTimeReady = parseInt(sTime.getHours() - (User.preferences.defaultDuration / 60)); 1148 1149 if( sTimeReady < 0 ) 1150 return false; // If the value is less than 0, return false. 1151 1152 return sTimeReady.toString().length == 1 ? "0"+sTimeReady+":00" : sTimeReady+":00"; 1153 } 1154 1155 var hEnd = new Date(false,false,false,selectedDateTime.split(":")[0],selectedDateTime.split(":")[1],false); 1156 var hStart = new Date(false,false,false,startT.val().split(":")[0],startT.val().split(":")[1],false); 1157 1158 if ( hEnd <= hStart ){ 1159 var lessTime = lessZeroTime( selectedDateTime ); 1160 if ( !lessTime ){ 1161 startT.val( "00:00" ); 1162 return true; 1163 } 1164 startT.val( lessTime ); 1165 } 1166 } 1144 1145 if ( selectedDateTime.indexOf("p.m.") == -1 || !selectedDateTime.indexOf("a.m.") == -1 ) { 1146 var startT = UI.dialogs.addEvent.find('input.start-time'); 1147 1148 var lessZeroTime = function( sTime ) { 1149 sTime = sTime.split(":"); 1150 sTime = new Date(false,false,false,sTime[0],sTime[1],false); 1151 sTimeReady = parseInt(sTime.getHours() - (User.preferences.defaultDuration / 60)); 1152 1153 if( sTimeReady < 0 ) 1154 return false; // If the value is less than 0, return false. 1155 1156 return sTimeReady.toString().length == 1 ? "0"+sTimeReady+":00" : sTimeReady+":00"; 1157 } 1158 1159 var hEnd = new Date(false,false,false,selectedDateTime.split(":")[0],selectedDateTime.split(":")[1],false); 1160 var hStart = new Date(false,false,false,startT.val().split(":")[0],startT.val().split(":")[1],false); 1161 1162 if ( hEnd <= hStart ){ 1163 var lessTime = lessZeroTime( selectedDateTime ); 1164 if ( !lessTime ){ 1165 startT.val( "00:00" ); 1166 return true; 1167 } 1168 startT.val( lessTime ); 1169 } 1170 } 1167 1171 }, 1168 1172 onClose : function (selectedDateTime){ 1169 1173 if(!(User.preferences.hourFormat.length == 5)) 1170 1174 $(this).val(selectedDateTime.replace(/[\.]/gi, "")); 1171 fixHour(); 1175 fixHour(); 1172 1176 }, 1177 1173 1178 beforeShow: function (selectedDateTime) { 1174 1179 if ((selectedDateTime.value == '__:__') || (selectedDateTime.value == '__:__ __')) … … 1216 1221 var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', { 1217 1222 event:objEvent 1218 }); 1223 }); 1219 1224 1220 1225 // load template of attendees 1221 1226 var blkAddAtendee = UI.dialogs.addEvent.find('#calendar_addevent_details6').append(attendeeHtml); 1222 if(objEvent.attendee.length) 1227 if(objEvent.attendee.length) 1223 1228 callbackAttendee(); 1224 1229 /** … … 1598 1603 if ($(event.target).is('input')) { 1599 1604 old_item = $(event.target).parents('li'); 1600 1601 var userId = old_item.find('.id').html(); 1602 1603 if(userId == '') 1604 { 1605 var userId = DataLayer.put('user', { 1606 name: old_item.find('.name').html(), 1607 mail: old_item.find('.mail').html(), 1608 isExternal: '1' 1609 }); 1610 } 1611 1605 1606 var userId = old_item.find('.id').html(); 1607 1608 if(userId == '') 1609 { 1610 var userId = DataLayer.put('user', { 1611 name: old_item.find('.name').html(), 1612 mail: old_item.find('.mail').html(), 1613 isExternal: '1' 1614 }); 1615 } 1616 1612 1617 newAttendeeId = DataLayer.put('participant', { 1613 1618 user: userId, … … 1768 1773 DataLayer.render( 'templates/preferences_calendar.ejs', { 1769 1774 preferences:User.preferences, 1770 calendars: Calendar.calendars, 1771 signatureOf : Calendar.signatureOf 1775 calendars: Calendar.calendars, 1776 signatureOf : Calendar.signatureOf 1772 1777 }, function( template ){ 1773 1778 var tabPrefCalendar = jQuery('#preference_tab').html( template ).find('.preferences-win'); 1774 1779 1775 1780 tabPrefCalendar.find('select[name="defaultCalendar"] option[value="'+User.preferences.defaultCalendar+'"]').attr('selected','selected').trigger('change'); 1776 1781 tabPrefCalendar.find('select[name="dafaultImportCalendar"] option[value="'+User.preferences.dafaultImportCalendar+'"]').attr('selected','selected').trigger('change'); 1777 1778 DataLayer.render( 'templates/timezone_list.ejs', {}, function( timezones_options ){ 1779 1782 1783 DataLayer.render( 'templates/timezone_list.ejs', {}, function( timezones_options ){ 1780 1784 tabPrefCalendar.find('select[name="timezone"]').html(timezones_options).find('option[value="'+User.preferences.timezone+'"]').attr('selected','selected').trigger('change'); 1781 1785 }); … … 2103 2107 2104 2108 function getSelectedCalendars( reverse, type ){ 2105 var selector = !!type ? "div.my-groups-task .calendar-view" : "div.my-calendars .calendar-view, div.signed-calendars .calendar-view"; 2106 var returns = []; 2107 2108 $.each( $(selector), function(i , c){ 2109 2110 if( reverse ? !c.checked : c.checked ) 2111 returns.push( c.value ); 2112 2109 2110 var selector = ""; 2111 2112 switch(type) 2113 { 2114 case 0: 2115 selector = "div.my-calendars .calendar-view, div.signed-calendars .calendar-view"; 2116 break; 2117 case 1: 2118 selector = "div.my-groups-task .calendar-view"; 2119 break; 2120 case 2: 2121 selector = ".calendar-view"; 2122 break; 2123 } 2124 2125 // var selector = !!type ? "div.my-groups-task .calendar-view" : "div.my-calendars .calendar-view, div.signed-calendars .calendar-view"; 2126 var returns = []; 2127 2128 $.each( $(selector), function(i , c){ 2129 2130 if( reverse ? !c.checked : c.checked ) 2131 returns.push( c.value ); 2132 2113 2133 }); 2114 2115 if (!returns.length) 2116 return false; 2117 2118 return returns; 2134 2135 if (!returns.length) 2136 return false; 2137 2138 return returns; 2119 2139 } 2120 2140 … … 2173 2193 var schudableDecode = DataLayer.encode( "schedulable:preview", schedulable); 2174 2194 var me = schudableDecode.me.user ? schudableDecode.me.user.id : schudableDecode.me.id; 2175 2176 var filter = {filter: ['AND', ['=','id',eventId], ['=','calendar',idCalendar], ['=','user', me]]}; 2177 2195 var filter = {filter: ['AND', ['=','id',eventId], ['=','calendar',idCalendar], ['=','user', me] ] }; 2178 2196 if(type) 2179 2197 filter.filter.push(['=','type',type]); 2180 2181 2198 DataLayer.removeFilter('schedulable', filter); 2182 2199 Calendar.rerenderView(true); … … 2306 2323 2307 2324 }); 2308 2309 $('ul.list-calendars .cal-list-options-btn').on('click',function(){doMenu();}); 2325 2326 $('ul.list-calendars .cal-list-options-btn').on('click',function(){doMenu();}); 2310 2327 2311 2328 … … 2479 2496 show_modal_search_shared(); 2480 2497 }); 2481 2482 2498 2499 2483 2500 meu_container.find('.title-signed-calendars').click(function(evt){ 2484 2501 var status = $(this).parent().find('.status-list-shared'); … … 2491 2508 2492 2509 $('.calendar-view').click(function(evt){ 2493 2494 var checkBox = $(this); 2495 var calendarId = $(this).val(); 2496 2497 Calendar.signatureOf[ calendarId ].hidden = (checkBox.is(':checked') ? 0 : 1 ); 2498 2499 DataLayer.put('calendarSignature', {id: Calendar.signatureOf[ calendarId ].id , hidden: Calendar.signatureOf[ calendarId ].hidden } ); 2500 DataLayer.commit(); 2501 2502 2503 if($tabs.tabs('option' ,'selected') == 0){ 2504 2505 if(Calendar.currentView && !!Calendar.currentView[ calendarId ]){ 2506 2507 Calendar.currentView[ calendarId ].hidden = !checkBox.is(':checked'); 2508 $('#calendar').fullCalendar( 'refetchEvents' ); 2509 } 2510 2511 }else{ 2512 type = $tabs.tabs('option' ,'selected'); 2513 type = type > 2 ? 2 : (type - 1) 2514 2515 pageselectCallback('', 0, false, type); 2516 } 2510 2511 var checkBox = $(this); 2512 var calendarId = $(this).val(); 2513 2514 Calendar.signatureOf[ calendarId ].hidden = (checkBox.is(':checked') ? 0 : 1 ); 2515 2516 DataLayer.put('calendarSignature', {id: Calendar.signatureOf[ calendarId ].id , hidden: Calendar.signatureOf[ calendarId ].hidden } ); 2517 DataLayer.commit(); 2518 2519 2520 if($tabs.tabs('option' ,'selected') == 0){ 2521 2522 if(Calendar.currentView && !!Calendar.currentView[ calendarId ]){ 2523 2524 Calendar.currentView[ calendarId ].hidden = !checkBox.is(':checked'); 2525 $('#calendar').fullCalendar( 'refetchEvents' ); 2526 } 2527 2528 }else{ 2529 type = $tabs.tabs('option' ,'selected'); 2530 type = type > 2 ? 2 : (type - 1) 2531 2532 pageselectCallback('', 0, false, type); 2533 } 2517 2534 }); 2518 2535 }); … … 2624 2641 $(this).addClass('fc-state-hover'); 2625 2642 }, 2626 2643 2627 2644 function(){ 2628 2645 $(this).removeClass('fc-state-hover'); … … 2658 2675 else 2659 2676 pageselectCallback($(currentView+' [name = keyword]').val(), ((parseInt($(currentView+' [name = page_index]').val())) -1), view, type); 2660 }); 2661 if (currentView == "#tab_events_list_" || currentView == "#tab_tasks_list_") 2662 $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-left').find('span.fc-button-agendaWeek, span.fc-button-agendaDay').remove();2677 }); 2678 if (currentView == "#tab_events_list_" || currentView == "#tab_tasks_list_") 2679 $(currentView+' .events-list.events-list-win.active .header-paginator .fc-header-left').find('span.fc-button-agendaWeek, span.fc-button-agendaDay').remove(); 2663 2680 } 2664 2681 … … 2725 2742 case 'agendaWeek': 2726 2743 var dateStart = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]); 2727 var dateEnd = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]); 2728 dateEnd.setHours(0,0,0); 2729 dateStart.setHours(0,0,0); 2744 var dateEnd = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]); 2745 dateEnd.setHours(0,0,0); 2746 dateStart.setHours(0,0,0); 2730 2747 rangeStart = dateStart.add({ days: (7 * page_index) }).getTime(); 2731 2748 rangeEnd = dateEnd.add({ days: (7 * page_index)+7 }).getTime(); … … 2739 2756 var dateStart = new Date().add({ years: page_index }); 2740 2757 var dateEnd = new Date().add({ years: page_index }); 2741 dateEnd.setHours(0,0,0); 2742 dateStart.setHours(0,0,0); 2758 dateEnd.setHours(0,0,0); 2759 dateStart.setHours(0,0,0); 2743 2760 if(dateStart.getMonth() != 0) 2744 2761 dateStart.moveToMonth(0, -1) … … 2804 2821 }; 2805 2822 } 2806 2823 2807 2824 var results = DataLayer.encode('schedulable:list', DataLayer.dispatch('modules/calendar/schedules', criteria)); 2808 2825 //var results = DataLayer.get('schedulable:detail', criteria); 2809 2826 keyword = ( keyword || '' ).replace( /\s+/g, "_" ); 2810 2827 } … … 2858 2875 var eventId = $(this).siblings('[name="eventid"]').val(); 2859 2876 var calendarId = $(this).siblings('[name="calendarid"]').val(); 2860 remove_event(eventId, calendarId, 2);2877 remove_event(eventId, calendarId, ( $(this).siblings('[name="eventtype"]').val() )); 2861 2878 event.stopImmediatePropagation() 2862 2879 }) … … 3131 3148 delete schedulable['historic']; 3132 3149 3133 schedulable.participants = $.map( participants, function( attendee, i ){ 3134 3135 var participant = DataLayer.get('participant', attendee, false); 3136 3137 if(typeof(participant) == 'array') 3138 participant = participant[0]; 3139 3140 if(owner.id != participant.user) 3141 delete participant.status; 3142 3143 delete participant.delegatedFrom; 3144 delete participant.id; 3145 delete participant.schedulable; 3146 3147 participant.id = DataLayer.put('participant', participant); 3148 3149 return (parseInt(type) == 3) ? participant.id : participant ; 3150 }); 3151 3150 schedulable.participants = $.map( participants, function( attendee, i ){ 3151 3152 var participant = DataLayer.get('participant', attendee, false); 3153 3154 if(typeof(participant) == 'array') 3155 participant = participant[0]; 3156 3157 if(owner.id != participant.user) 3158 delete participant.status; 3159 3160 delete participant.delegatedFrom; 3161 delete participant.id; 3162 delete participant.schedulable; 3163 3164 participant.id = DataLayer.put('participant', participant); 3165 3166 return (parseInt(type) == 3) ? participant.id : participant ; 3167 }); 3168 3152 3169 //Edit ocurrence 3153 3170 if(parseInt(type) == 3){ -
branches/2.5/prototype/modules/calendar/js/init.js
r8054 r8232 317 317 axisFormat: User.preferences.hourFormat, 318 318 eventSources: Calendar.sources, 319 319 320 320 header: { 321 321 left: 'prev,next today,agendaWeek,' + ((User.preferences.defaultCalView == "basicDay") ? "basicDay" : "agendaDay"), … … 353 353 }, 354 354 355 356 355 eventRender: function( event, element, view ){ 357 356 $('#calendar td.fc-year-have-event').removeClass('fc-year-have-event'); 358 357 359 358 var img_icon = ""; 360 361 if( !!parseInt(event.unanswered) ){ 362 363 img_icon = "mini-attention.png"; 364 365 }else{ 366 367 if(event.type == 1) 368 img_icon = "mini-event.png"; 369 if(event.type == 2) 370 img_icon = "mini-task.png"; 371 if(event.type == 3) 372 img_icon = "mini-activity.png"; 373 374 } 375 376 element.find(".fc-event-inner.fc-event-skin").prepend($('<img style="width: 11px; height: 13px;" class="" src="../prototype/modules/calendar/img/' + img_icon + '"></img>')); 359 var status_ball = ""; //nome da imagem a ser inserida 360 var status_img = ""; 361 362 if( !!parseInt(event.unanswered) && event.type == 1 ){ 363 364 img_icon = "mini-attention.png"; 365 366 }else{ 367 368 if(event.type == 1) 369 img_icon = "mini-event.png"; 370 if(event.type == 2) 371 img_icon = "mini-task.png"; 372 if(event.type == 3) 373 img_icon = "mini-activity.png"; 374 375 //se for diferente de evento(type 1). 376 if(event.type != 1){ 377 if(event.status == "1"){ 378 status_ball = "gray.png"; 379 }else if(event.status == "2"){ 380 status_ball = "yellow.png"; 381 }else if(event.status == "3"){ 382 status_ball = "green.png"; 383 }else if(event.status == "4"){ 384 status_ball = "red.png"; 385 } 386 387 status_img = '<img style="width: 8px; height: 8px; margin-bottom: 2px;" src="../prototype/modules/calendar/img/' + status_ball + '"></img>'; 388 } 389 390 } 391 392 393 //html que exibe a imagem do type e do status 394 element.find(".fc-event-inner.fc-event-skin").prepend($('<img style="width: 11px; height: 13px;" class="" src="../prototype/modules/calendar/img/' + img_icon + '"></img>' + status_img)); 377 395 }, 378 396 … … 477 495 'type': 'question', 478 496 'overlay_opacity': '0.5', 479 'custom_class': 'occurrence-zebra', 497 'custom_class': 'occurrence-zebra', 480 498 'width': 427, 481 499 'buttons': ['Editar todas ocorrências', 'Editar essa ocorrência', 'Cancelar'], 482 500 'onClose': function(clicked) { 483 501 if(clicked == 'Editar todas ocorrências') { 484 var schedule = getSchedulable(evt.id, ''); 485 schedule.calendar = evt.calendar; 486 eventDetails( schedule , true); 502 var schedule = getSchedulable(evt.id, ''); 503 schedule.calendar = evt.calendar; 504 eventDetails( schedule , true); 487 505 488 506 }else if (clicked == 'Editar essa ocorrência'){ … … 493 511 */ 494 512 var repeat = mount_exception(evt.id, evt.occurrence); 495 513 496 514 $('.calendar-copy-move input[name="typeEvent"]').val("3"); 497 515 … … 513 531 break; 514 532 case 3: 533 DataLayer.remove('taskToActivity', false);//Limpa o cache 515 534 var activity = getSchedulable(evt.id, ''); 516 535 activity.group = evt.calendar; … … 565 584 566 585 if( $.browser.msie ){ 567 568 $('#divAppbox').css('width', $(window).width());586 //$('#divAppbox').css('width', $(window).width()); 587 $('#divAppbox').css({'height':'600px','max-width':'100%'}); 569 588 } 570 589 -
branches/2.5/prototype/modules/calendar/schedules.php
r8049 r8232 18 18 class Schedule{ 19 19 20 function findEventsRange( $start, $end, $calendars, $timezones ){20 function findEventsRange( $start, $end, $calendars, $timezones ){ 21 21 22 22 $sql = … … 31 31 .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", ' 32 32 .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", ' 33 33 34 .'count(calendar_task_to_activity_object.id) as "tasks", ' 35 34 36 .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as ' 35 37 .'calendar FROM calendar_object left join calendar_task_to_activity_object on ( calendar_object.id = calendar_task_to_activity_object.calendar_object_activity_id ), calendar_to_calendar_object ' 38 36 39 .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $calendars) . '\')) ' 37 40 .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id ' … … 54 57 .'AND calendar_object.dtstart NOT IN (SELECT calendar_repeat_occurrence.occurrence from calendar_repeat_occurrence, ' 55 58 .'calendar_repeat where (calendar_repeat_occurrence.repeat_id = calendar_repeat.id) ' 56 .'AND (calendar_repeat.object_id = calendar_object.id)) ' 57 .'group by 58 calendar_object.id, calendar_object.cal_uid, calendar_object.type_id, 59 calendar_object.dtstart, calendar_object.summary, calendar_object.description, 60 calendar_object.dtend, calendar_object.priority, calendar_object.due, calendar_object.percentage, 61 calendar_object.status, calendar_object.location, calendar_object.allday, calendar_object.transp, 62 calendar_object.class_id, calendar_object.repeat, calendar_object.range_start, calendar_object.range_end, 63 calendar_object.last_update, calendar_object.dtstamp, calendar_object.sequence, 64 calendar_object.tzid, calendar_to_calendar_object.calendar_id 65 ORDER BY 66 calendar_object.dtstart'; 59 .'AND (calendar_repeat.object_id = calendar_object.id)) ' 60 .'group by 61 calendar_object.id, calendar_object.cal_uid, calendar_object.type_id, 62 calendar_object.dtstart, calendar_object.summary, calendar_object.description, 63 calendar_object.dtend, calendar_object.priority, calendar_object.due, calendar_object.percentage, 64 calendar_object.status, calendar_object.location, calendar_object.allday, calendar_object.transp, 65 calendar_object.class_id, calendar_object.repeat, calendar_object.range_start, calendar_object.range_end, 66 calendar_object.last_update, calendar_object.dtstamp, calendar_object.sequence, 67 calendar_object.tzid, calendar_to_calendar_object.calendar_id 68 ORDER BY 69 calendar_object.dtstart'; 67 70 68 71 $params = Controller::service('PostgreSQL')->execResultSql($sql.$where); … … 84 87 .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", ' 85 88 .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", ' 89 86 90 .'count(calendar_task_to_activity_object.id) as "tasks", ' 91 87 92 .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as ' 88 93 .'calendar FROM calendar_object left join calendar_task_to_activity_object on ( calendar_object.id = calendar_task_to_activity_object.calendar_object_activity_id ), calendar_to_calendar_object ' … … 92 97 93 98 94 $where = 'AND (((upper("summary") like upper(\'%'.$summary.'%\') OR upper("description") like upper(\'%'.$description.'%\')))) 95 group by 96 calendar_object.id, calendar_object.cal_uid, calendar_object.type_id, 97 calendar_object.dtstart, calendar_object.summary, calendar_object.description, 98 calendar_object.dtend, calendar_object.priority, calendar_object.due, calendar_object.percentage, 99 calendar_object.status, calendar_object.location, calendar_object.allday, calendar_object.transp, 100 calendar_object.class_id, calendar_object.repeat, calendar_object.range_start, calendar_object.range_end, 101 calendar_object.last_update, calendar_object.dtstamp, calendar_object.sequence, 102 calendar_object.tzid, calendar_to_calendar_object.calendar_id 103 ORDER BY 104 dtstart LIMIT '.$limit.' OFFSET '.$offset.' '; 105 99 $where = 'AND (((upper("summary") like upper(\'%'.$summary.'%\') OR upper("description") like upper(\'%'.$description.'%\')))) 100 group by 101 calendar_object.id, calendar_object.cal_uid, calendar_object.type_id, 102 calendar_object.dtstart, calendar_object.summary, calendar_object.description, 103 calendar_object.dtend, calendar_object.priority, calendar_object.due, calendar_object.percentage, 104 calendar_object.status, calendar_object.location, calendar_object.allday, calendar_object.transp, 105 calendar_object.class_id, calendar_object.repeat, calendar_object.range_start, calendar_object.range_end, 106 calendar_object.last_update, calendar_object.dtstamp, calendar_object.sequence, 107 calendar_object.tzid, calendar_to_calendar_object.calendar_id 108 ORDER BY 109 dtstart LIMIT '.$limit.' OFFSET '.$offset.' '; 110 106 111 $params = Controller::service('PostgreSQL')->execResultSql($sql.$where); 107 112 108 109 110 113 return $this->normalizeEvents( $params, $timezones ); 111 114 } … … 113 116 function normalizeEvents( &$result, $timezones ){ 114 117 115 $mySig = Controller::find(array('concept' => 'calendarSignature') , array('calendar') , array('filter' => array( 'AND' , array('=' , 'type' , '0' ) , array( '=' , 'user' ,Config::me('uidNumber') ) , array('=' , 'isOwner' , '0' )))); 116 117 $signedCalendars = array(); 118 if(is_array($mySig)) 119 foreach($mySig as $v) 120 { 121 $tmp = Controller::find(array('concept' => 'calendarToPermission') , array('acl' ,'owner') , array('filter' => array( 'AND' ,array( '=' , 'calendar' , $v['calendar'] ) , array( '=' , 'user' , Config::me('uidNumber') ) ))); 122 $signedCalendars[$v['calendar']] = $tmp[0]; 123 } 124 118 $mySig = Controller::find(array('concept' => 'calendarSignature') , array('calendar') , array('filter' => array( 'AND' , array('=' , 'type' , '0' ) , array( '=' , 'user' ,Config::me('uidNumber') ) , array('=' , 'isOwner' , '0' )))); 119 120 $signedCalendars = array(); 121 if(is_array($mySig)) 122 foreach($mySig as $v) 123 { 124 $tmp = Controller::find(array('concept' => 'calendarToPermission') , array('acl' ,'owner') , array('filter' => array( 'AND' ,array( '=' , 'calendar' , $v['calendar'] ) , array( '=' , 'user' , Config::me('uidNumber') ) ))); 125 $signedCalendars[$v['calendar']] = $tmp[0]; 126 } 127 125 128 $date = new DateTime('now', new DateTimeZone('UTC')); 126 129 $DayLigth = array(); … … 156 159 if(isset( $v['occurrences'] ) && count( $v['occurrences'] ) > 0){ 157 160 158 $date->setTimestamp((int) ($v['startTime'] / 1000)); 159 $date->setTimezone( new DateTimeZone( $currentTimezone )); 160 161 $date->setTimestamp((int) ($v['startTime'] / 1000)); 162 $date->setTimezone( new DateTimeZone( $currentTimezone )); 163 161 164 foreach( $result[$i]['occurrences'] as &$o){ 162 165 163 $o = ((int) ($o / 1000) + $date->getOffset()).'000'; 166 $o = ((int) ($o / 1000) + $date->getOffset()).'000'; 164 167 165 168 } 166 169 } 167 170 168 $attend = (isset($signedCalendars[$result[$i]['calendar']])) ? 169 Controller::read(array('concept' => 'participant'), null, array('filter' => array('AND', array('=','schedulable',$v['id']), array('=','user', $signedCalendars[$result[$i]['calendar']]['owner'] ) ))): 170 Controller::read(array('concept' => 'participant'), null, array('filter' => array('AND', array('=','schedulable',$v['id']), array('=','user', Config::me('uidNumber')) ))); 171 172 $result[$i]['unanswered'] = 0; 173 171 $attend = (isset($signedCalendars[$result[$i]['calendar']])) ? 172 Controller::read(array('concept' => 'participant'), null, array('filter' => array('AND', array('=','schedulable',$v['id']), array('=','user', $signedCalendars[$result[$i]['calendar']]['owner'] ) ))): 173 Controller::read(array('concept' => 'participant'), null, array('filter' => array('AND', array('=','schedulable',$v['id']), array('=','user', Config::me('uidNumber')) ))); 174 175 $result[$i]['unanswered'] = 0; 176 174 177 if(count($attend) > 0 && !empty($attend)){ 175 if(array_key_exists(0, $attend)) 176 $attend = $attend[0]; 177 178 if(isset($signedCalendars[$result[$i]['calendar']])) //Caso agenda compartilhada verificar tmb se tem compartilhamento de escrita 179 $result[$i]['editable'] = (strpos($signedCalendars[$result[$i]['calendar']]['acl'],"w") >=0 && (strstr($attend['acl'],"w") || strstr($attend['acl'],"o") || $attend['isOrganizer'] == '1') ) ? 1 : 0; 180 else 181 $result[$i]['editable'] = (strstr($attend['acl'],"w") || strstr($attend['acl'],"o") || $attend['isOrganizer'] == '1') ? 1 : 0; 182 183 if($attend['status'] == STATUS_UNANSWERED && !isset($signedCalendars[$result[$i]['calendar']]) ) 184 $result[$i]['unanswered'] = 1; 178 if(array_key_exists(0, $attend)) 179 $attend = $attend[0]; 180 181 if(isset($signedCalendars[$result[$i]['calendar']])) //Caso agenda compartilhada verificar tmb se tem compartilhamento de escrita 182 $result[$i]['editable'] = (strpos($signedCalendars[$result[$i]['calendar']]['acl'],"w") >=0 && (strstr($attend['acl'],"w") || strstr($attend['acl'],"o") || $attend['isOrganizer'] == '1') ) ? 1 : 0; 183 else 184 $result[$i]['editable'] = (strstr($attend['acl'],"w") || strstr($attend['acl'],"o") || $attend['isOrganizer'] == '1') ? 1 : 0; 185 186 if($attend['status'] == STATUS_UNANSWERED && !isset($signedCalendars[$result[$i]['calendar']]) ) 187 $result[$i]['unanswered'] = 1; 185 188 186 189 }else{ -
branches/2.5/prototype/modules/calendar/templates/attendee_add.ejs
r7982 r8232 11 11 <option value="3" <%= data.event.status=='3' ? 'selected="selected"':'' %>>Eu não vou</option> 12 12 <option value="2" <%= data.event.status=='2' ? 'selected="selected"':'' %>>Talvez</option> 13 <option value="4" <%= data.event.status=='4' ? 'selected="selected"':'' %>>Sem resposta </option> 14 <option class="hidden" value="5" >Delegado</option> 13 <option value="4" <%= data.event.status=='4' ? 'selected="selected"':'' %>>Sem resposta </option> 14 <option class="hidden" value="5" >Delegado</option> 15 15 <%}%> 16 16 <%}else{%> -
branches/2.5/prototype/modules/calendar/templates/event_add.ejs
r8050 r8232 78 78 continue; 79 79 %> 80 <% if( data.event.isShared ){ %> 81 <% if(data.event.calendars[i].id == data.event.calendar){ %> 82 <option value="<%= data.event.calendars[i].id %>"><%= data.event.calendars[i].name %></option> 83 <%}%> 84 85 <% }else { %> 86 87 <option value="<%= data.event.calendars[i].id %>" <%= data.event.calendars[i].id == data.event.calendar ? 'selected="selected"':'' %>><%= data.event.calendars[i].name %></option> 88 <% } %> 89 90 80 <% if( data.event.isShared ){ %> 81 <% if(data.event.calendars[i].id == data.event.calendar){ %> 82 <option value="<%= data.event.calendars[i].id %>"><%= data.event.calendars[i].name %></option> 83 <%}%> 84 85 <% }else { %> 86 87 <option value="<%= data.event.calendars[i].id %>" <%= data.event.calendars[i].id == data.event.calendar ? 'selected="selected"':'' %>><%= data.event.calendars[i].name %></option> 88 <% } %> 89 90 91 91 <% } %> 92 92 </select> 93 <span class="creation-date-label">Evento criado em <%= data.event.creationDate[0] %> às 94 <%= data.event.creationDate[1] %> horas e <%= data.event.creationDate[2] %> minutos. 95 </span> 96 </p> 97 98 93 <span class="creation-date-label">Evento criado em <%= data.event.creationDate[0] %> às 94 <%= data.event.creationDate[1] %> horas e <%= data.event.creationDate[2] %> minutos. 95 </span> 96 </p> 97 98 99 99 <fieldset class="hidden"> 100 100 <legend class="hidden">Publicidade</legend> -
branches/2.5/prototype/modules/calendar/templates/event_repeat.ejs
r7978 r8232 32 32 <label for="repeatweekly[]">Domingo</label> 33 33 34 <input type="checkbox" name="repeatweekly[]" value="MO" 34 <input type="checkbox" name="repeatweekly[]" value="MO" <%= ((data.event.acl.write || data.event.acl.organization) && data.event.isAttendee) ? '' : 'disabled="disabled"'%>> 35 35 <label for="repeatweekly[]">Segunda</label> 36 36 37 <input type="checkbox" name="repeatweekly[]" value="TU" 37 <input type="checkbox" name="repeatweekly[]" value="TU" <%= ((data.event.acl.write || data.event.acl.organization) && data.event.isAttendee) ? '' : 'disabled="disabled"'%>> 38 38 <label for="repeatweekly[]">Terça</label> 39 39 -
branches/2.5/prototype/modules/calendar/templates/preferences_calendar.ejs
r8021 r8232 36 36 <label for="defaultCalView">Visualização padrão do calendário:</label> 37 37 <select name="defaultCalView" > 38 <option value="agendaDay" <%= data.preferences.defaultCalView =='agendaDay' ? 'selected="selected"':'' %>>Diária com horário</option> 39 <option value="basicDay" <%= data.preferences.defaultCalView =='basicDay' ? 'selected="selected"':'' %>>Diária sem horário</option> 38 <option value="agendaDay" <%= data.preferences.defaultCalView =='agendaDay' ? 'selected="selected"':'' %>>Diária com horário</option> 39 <option value="basicDay" <%= data.preferences.defaultCalView =='basicDay' ? 'selected="selected"':'' %>>Diária sem horário</option> 40 40 <option value="agendaWeek" <%= data.preferences.defaultCalView =='agendaWeek' ? 'selected="selected"':'' %>>Semanal</option> 41 41 <option value="month" <%= data.preferences.defaultCalView =='month' ? 'selected="selected"':'' %>>Mensal</option> … … 72 72 73 73 <p class="input-group"> 74 <label for="defaultCalendar">Agenda padrão para Criação de Eventos:</label> 74 <label for="defaultCalendar">Agenda padrão para Criação de Eventos:</label> 75 75 <select name="defaultCalendar" > 76 76 <%for(var i = 0; i < data.calendars.length; i++){%> … … 79 79 </select> 80 80 </p> 81 82 <p class="input-group"> 83 <label for="dafaultImportCalendar">Agenda padrão para Importação de Eventos :</label> 84 <select name="dafaultImportCalendar" > 85 <option value=""> </option> 86 <%for(var i = 0; i < data.calendars.length; i++){ 87 if(data.signatureOf[data.calendars[i].id].isOwner == '1'){ 88 %> 89 <option value="<%=data.calendars[i].id%>"> <%= data.calendars[i].name %></option> 90 <%}}%> 91 </select> 92 </p> 81 82 <p class="input-group"> 83 <label for="dafaultImportCalendar">Agenda padrão para Importação de Eventos :</label> 84 <select name="dafaultImportCalendar" > 85 <option value=""> </option> 86 <%for(var i = 0; i < data.calendars.length; i++){ 87 if(data.signatureOf[data.calendars[i].id].isOwner == '1'){ 88 %> 89 <option value="<%=data.calendars[i].id%>"> <%= data.calendars[i].name %></option> 90 <%}}%> 91 </select> 92 </p> 93 93 94 94 <p class="input-group"> -
branches/2.5/prototype/modules/calendar/templates/shared_calendar.ejs
r7019 r8232 7 7 <dd class="calendar"> 8 8 <select class="calendar" name="calendar"> 9 <% 10 for(var i = 0; i < data.calendar.length; i++){ 11 if(data.signature[i].permission){ 12 if(data.signature[i].permission.acl.shared == false) 13 continue; 14 } 15 %> 16 <option value="<%=data.calendar[i].id%>"><%=data.calendar[i].name%></option> 9 <% 10 for(var i = 0; i < data.calendar.length; i++) 11 { 12 for(var ii = 0; ii < data.signature.length; ii++) 13 { 14 if(data.signature[ii].calendar.id === data.calendar[i].id && data.signature[ii].permission) 15 { 16 if(data.signature[ii].permission.acl.shared == false) 17 continue; 18 } 19 } 20 %> 21 <option value="<%=data.calendar[i].id%>"><%=data.calendar[i].name%></option> 17 22 18 23 <% … … 24 29 <dd class="<%=data.calendar ? "user-list" : "calendar-list"%>"> 25 30 <ul class="user-list"> 26 <% if (false) {27 for (var i=0; i< data.event.user.length; i++) {%>28 <li class="user">29 <div style="overflow:hidden; width:100%; display:table;">30 <input type="checkbox" value="">31 <input type="hidden" name="user[]" value="">32 <label class="name"></label>33 <label class="mail"></label>34 </div>35 <div class="shared-acl">36 <a class="button edit user-options-button-edit new">Editar permissões</a>37 <a class="button close new">Remover</a>38 </div>39 </li>40 <%}41 } else { %>42 31 <li class="not-user"><%=data.calendar ? "Não compartilhado." : "Nenhuma agenda selecionada"%></li> 43 <% } %>44 32 </ul> 45 33 </dd> -
branches/2.5/prototype/modules/filters/edit-filter.ejs
r7703 r8232 28 28 29 29 </select> 30 <input type="text" name="criteriaValue[]" />30 <input type="text" name="criteriaValue[]" value="<%= data.from %>" /> 31 31 <input type="hidden" name="criteriaType[]" value="from"/> 32 32 </fieldset> … … 53 53 54 54 </select> 55 <input type="text" name="criteriaValue[]" />55 <input type="text" name="criteriaValue[]" value="<%= data.subject %>" /> 56 56 <input type="hidden" name="criteriaType[]" value="subject"/> 57 57 </fieldset> … … 128 128 %> 129 129 </select> 130 <input type="checkbox" name="actionType[]" value="alertMessage" class="alertMessage"/> 131 <label><%= get_lang("Alert message filter by sender")%></label> 130 <% 131 if(preferences['use_alert_filter_criteria'] == "1") 132 {%> 133 <input type="checkbox" name="actionType[]" value="alertMessage" class="alertMessage"/> 134 <label><%= get_lang("Alert message filter by sender")%></label> 135 <%}%> 132 136 </fieldset> 133 137 <fieldset> -
branches/2.5/prototype/modules/filters/filters.css
r7612 r8232 47 47 48 48 .rule-list .rule .menu-control { 49 max-width: 100px;49 max-width: 80px; 50 50 float: right; 51 margin -top: -50px;51 margin: -50px 5px; 52 52 white-space: nowrap; 53 53 } 54 54 55 .rule-list .rule .menu-control .select { vertical-align: bottom; } 55 56 .rule-list .rule .menu-control .select input { margin: 5px 0 0 1px; } … … 122 123 } 123 124 .rule .menu-control .ui-button.disable,.rule .menu-control .ui-button.enable, .rule .menu-control .ui-button.update, .rule .menu-control .ui-button.close { top:5px; } 125 126 .rule .menu-control .ui-button.hidden { display: none; } 127 124 128 .filter-manager-window .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } 125 129 -
branches/2.5/prototype/modules/filters/filters.js
r7863 r8232 2 2 * Retorna as regras por remetente e que o usuário deseja ser avisado 3 3 */ 4 function getFromAlertRules() { 5 var filters = DataLayer.get("filter"); 6 fromRules = []; 7 var alertMessage; 8 var active; 9 for (var index in filters) { 10 alertMessage = filters[index]['alertMessage']; 11 active = filters[index]['enabled']; 12 for(var criterias in filters[index]['actions']) { 13 if (filters[index]['actions'][criterias]['type'] == 'fileinto' && alertMessage == 'true' && active == 'true') 14 fromRules[fromRules.length] = filters[index]['actions'][criterias]['parameter']; 15 } 16 } 17 return fromRules; 4 function getFromAlertRules() { 5 fromRules = []; 6 if(preferences['use_alert_filter_criteria'] == "1") 7 { 8 var filters = DataLayer.get("filter"); 9 var alertMessage; 10 var active; 11 for (var index in filters) { 12 alertMessage = filters[index]['alertMessage']; 13 active = filters[index]['enabled']; 14 for(var criterias in filters[index]['actions']) { 15 if (filters[index]['actions'][criterias]['type'] == 'fileinto' && alertMessage == 'true' && active == 'true') 16 fromRules[fromRules.length] = filters[index]['actions'][criterias]['parameter']; 17 } 18 } 19 20 } 21 return fromRules; 18 22 } 19 23 … … 401 405 }); 402 406 403 404 fromRules = getFromAlertRules(); 407 if(preferences['use_alert_filter_criteria'] == "1") 408 { 409 fromRules = getFromAlertRules(); 410 } 405 411 406 412 var BASE_PATH = '../prototype/'; … … 439 445 } 440 446 if(confirm(get_lang("Want to block the user") + " " + email + "?")){ 447 var has_folder_spam = false; 448 var folder_spam = "INBOX"+cyrus_delimiter+"Spam"; 449 $.each(cp_tree1, function(index, value){ 450 if(value.id == folder_spam){ 451 has_folder_spam = true; 452 return; 453 } 454 }); 455 if(!has_folder_spam){ 456 connector.loadScript('TreeS'); 457 create_new_folder("Spam","INBOX"); 458 } 441 459 DataLayer.put( 'filter', idd, 442 460 { name: email, isExact: false, 443 461 criteria:{ 0: {value: email, operator: "=", field: "from"} }, 444 actions: { 0: {parameter: "INBOX" + cyrus_delimiter + "Spam", type: "fileinto"}},462 actions: { 0: {parameter: folder_spam, type: "fileinto"}}, 445 463 enabled: true, 446 464 id: email, … … 461 479 462 480 DataLayer.codec( 'message', 'jqGrid', { 481 482 encoder: function( data ){ 483 484 return( data ); 485 486 } 487 }); 488 489 DataLayer.codec( 'message', 'jqGridSearch', { 463 490 464 491 encoder: function( data ){ … … 491 518 var criterias_ = new Array(); 492 519 493 var isExact = (list_container.find('[name="isExact"]:checked').val() == 'and') ? 'yes' : 'no'; 494 520 var isExact = (list_container.find('[name="isExact"]:checked').val() == 'and') ? 'yes' : 'no'; 521 495 522 for (i in criteria_) 496 523 if(criteria_[i] != "") … … 605 632 * Lista os filtros para o usuário 606 633 */ 607 function list_filters(html) {634 function list_filters(html) { 608 635 outOfficeVerify(); 609 for (var index in selectedMessages) { 636 for (var index in selectedMessages) 637 { 610 638 delete selectedMessages[index]; 611 639 } 612 if(html){ 613 if( ! $(".filters-windows").length ) 614 container = $('.expressomail-module-container').append("<div class='filters-windows'></div>").find(".filters-windows").html( html ).find(".expresso-window-container"); 615 list_container = $('.expressomail-module-container').find(".rule-list-container"); 616 } 617 list_container = $(".expresso-window-filters").dialog({ 618 title: get_lang('Filters'), 619 width:700, 620 modal: true, 621 resizable: false, 622 closeOnEscape:true, 623 close:function(event, ui) { 624 event.stopPropagation(); 625 if(list_container.find(".cancel").length) 626 list_container.find(".cancel").trigger('click'); 627 $(".dialog-head-buttonpane").hide(); 628 }, 629 open: function () { 630 $(".ui-dialog .ui-dialog-titlebar") 631 .append('<a href="#" class="ui-dialog-titlebar-minimize ui-corner-all" role="button"><span class="ui-icon ui-icon-minusthick">minimize</span></a>') 632 .find('.ui-dialog-titlebar-minimize').click(function() { 633 $(".ui-dialog-buttonpane, .ui-dialog-content").toggle(); 634 $(".ui-icon-minusthick, .ui-icon-newwin").toggleClass('ui-icon-minusthick').toggleClass('ui-icon-newwin'); 635 }); 636 $(".dialog-head-buttonpane").show(); 637 }, 638 autoOpen: false, 639 buttons: [{ 640 text : get_lang("Close"), 641 click : function() { 642 $( this ).dialog( "close" ); 643 } 644 }] 645 }); 646 $(".ui-dialog-titlebar").after("<div class='dialog-head-buttonpane ui-dialog-buttonpane ui-widget-content ui-helper-clearfix' style='background-color: rgb(224, 238, 238); '><div class='ui-dialog-buttonset header-buttonpane'></div></div>"); 647 $(".dialog-head-buttonpane").css("padding", "5px"). 648 find(".header-buttonpane").html("<a href='#' class='button add' title='"+get_lang("Add new rule")+"'>"+get_lang("New rule")+"</a>"+(!outoffice ? "<a href='#' class='button add vacation' title='"+get_lang("Add rule out of office")+"'>"+get_lang("Out of office")+"</a>" : "")).find(".button").button(); 649 650 $(".ui-dialog-buttonpane.ui-widget-content").css("background-color", "#E0EEEE"); 640 641 initialize_container(html); // Inicializa o container do diálogo de filtros 642 643 list_container = create_filter_dialog(); // Cria a estrutura básica do diálogo 644 651 645 var list = DataLayer.render( BASE_PATH + 'modules/filters/filter-list.ejs', DataLayer.get("filter:detail", true)); 652 646 list_container.html(list).find(".button").button(); 653 647 list_container.find(".alldelete").button("disable"); 648 list_container.find(".alldisable").button("disable"); 649 list_container.find(".allenable").button("disable"); 650 654 651 list_container.find(".rule-list").selectable({ 655 652 selecting: function(event, ui) { … … 660 657 } 661 658 }); 659 660 list_container.find(".rule-list li").click(function(){ 661 if(list_container.find(".select").children("input:checked").length){ 662 list_container.find(".alldelete").button("enable"); 663 list_container.find(".alldisable").button("enable"); 664 list_container.find(".allenable").button("enable"); 665 } else { 666 list_container.find(".alldelete").button("disable"); 667 list_container.find(".alldisable").button("disable"); 668 list_container.find(".allenable").button("disable"); 669 } 670 }); 662 671 663 672 list_container.find( ".menu-control .button" ).filter(".update").button({ … … 716 725 DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 717 726 getFromAlertRules(); 727 if (get_current_folder() == "INBOX") 728 cExecute ("$this.imap_functions.get_range_msgs2&folder=INBOX&msg_range_begin=1&msg_range_end="+preferences.max_email_per_page+"&sort_box_type=SORTARRIVAL&search_box_type=ALL&sort_box_reverse=1", handler_draw_box); 718 729 }); 719 730 … … 868 879 869 880 list_container.parent().find(".button.add:first").click(function(){ 870 list_container.parent().find(".dialog-head-buttonpane").addClass("hidden"); 871 DataLayer.render( BASE_PATH + 'modules/filters/edit-filter.ejs', {folders : DataLayer.get("folder", true), delimiter: cyrus_delimiter},function(html){ 872 list_container.html(html); 873 var accord = list_container.find(".rule-details-container").accordion({autoHeight: false}); 874 list_container.find(".button").button().filter(".forth").click(function(){ 875 accord.accordion('activate',1); 876 }).end().filter(".forth2").click(function(){ 877 accord.accordion('activate',2); 878 }).end().filter(".back").click(function(){ 879 accord.accordion('activate',0); 880 }).end().filter(".back2").click(function(){ 881 accord.accordion('activate',1); 882 }).end().filter(".cancel").click(function(){ 883 DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 884 }).end().filter(".submit").click(function() { 885 if(valid_save()) 886 $(this).submit(); 887 else 888 return; 889 DataLayer.commit( 'filter',false,function(){ 890 if($('#gbox_fields-search-messages-grid').length > 0 && action != '') { 891 for (var index in selectedMessages) { 892 set_message_flag(index, action, false); 893 } 894 } 895 DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters); 896 getFromAlertRules(); 897 }); 898 }).end().filter('.button.search').click(function() { 899 if(valid_save()) 900 showGridMessages($(this)); 901 else 902 return; 903 }); // end function click 904 }); // end DataLayer.render 881 render_new_rule(); // Renderiza a tela de criação de nova regra de filtragem. 905 882 }); 906 883 list_container.parent().find(".button.add.vacation").click(function(){ … … 932 909 } 933 910 911 /* 912 Inicializa o container do diálogo de gerenciamento de filtros. 913 */ 914 function initialize_container (html) { 915 if(html) 916 { 917 if(!$(".filters-windows").length) 918 { 919 container = $('.expressomail-module-container').append("<div class='filters-windows'></div>").find(".filters-windows").html(html).find(".expresso-window-container"); 920 } 921 } 922 } 923 924 /* 925 Cria a estrutura básica do diálogo de gerenciamento de filtros. 926 */ 927 function create_filter_dialog () { 928 var dialog = $(".expresso-window-filters").dialog( 929 { 930 title: get_lang('Filters'), 931 width: 700, 932 modal: true, 933 resizable: false, 934 closeOnEscape: true, 935 close: function(event, ui) 936 { 937 event.stopPropagation(); 938 if(list_container.find(".cancel").length) list_container.find(".cancel").trigger('click'); 939 $(".dialog-head-buttonpane").hide(); 940 }, 941 open: function() 942 { 943 $(".ui-dialog .ui-dialog-titlebar").append('<a href="#" class="ui-dialog-titlebar-minimize ui-corner-all" role="button"><span class="ui-icon ui-icon-minusthick">minimize</span></a>').find('.ui-dialog-titlebar-minimize').click(function() 944 { 945 $(".ui-dialog-buttonpane, .ui-dialog-content").toggle(); 946 $(".ui-icon-minusthick, .ui-icon-newwin").toggleClass('ui-icon-minusthick').toggleClass('ui-icon-newwin'); 947 }); 948 $(".dialog-head-buttonpane").show(); 949 }, 950 autoOpen: false, 951 buttons: [ 952 { 953 text: get_lang("Close"), 954 click: function() 955 { 956 $(this).dialog("close"); 957 } 958 }] 959 }); 960 961 $(".ui-dialog-titlebar").after("<div class='dialog-head-buttonpane ui-dialog-buttonpane ui-widget-content ui-helper-clearfix' style='background-color: rgb(224, 238, 238); '><div class='ui-dialog-buttonset header-buttonpane'></div></div>"); 962 $(".dialog-head-buttonpane").css("padding", "5px"). 963 find(".header-buttonpane").html("<a href='#' class='button add' title='" + get_lang("Add new rule") + "'>" + get_lang("New rule") + "</a>" + (!outoffice ? "<a href='#' class='button add vacation' title='" + get_lang("Add rule out of office") + "'>" + get_lang("Out of office") + "</a>" : "")).find(".button").button(); 964 $(".ui-dialog-buttonpane.ui-widget-content").css("background-color", "#E0EEEE"); 965 966 return dialog; 967 } 968 969 /* 970 Renderiza a tela de adição de uma nova regra de filtragem, 971 dentro do diálogo de gerenciamento de filtros. 972 */ 973 function render_new_rule (from, subject) { 974 list_container.parent().find(".dialog-head-buttonpane").addClass("hidden"); 975 var data = { 976 folders: DataLayer.get("folder", true), 977 delimiter: cyrus_delimiter, 978 from: from, 979 subject: subject ? html_entities(subject) : subject 980 } 981 982 DataLayer.render(BASE_PATH + 'modules/filters/edit-filter.ejs', data, function(html) 983 { 984 list_container.html(html); 985 var accord = list_container.find(".rule-details-container").accordion( 986 { 987 autoHeight: false 988 }); 989 list_container.find(".button").button().filter(".forth").click(function() 990 { 991 accord.accordion('activate', 1); 992 }).end().filter(".forth2").click(function() 993 { 994 accord.accordion('activate', 2); 995 }).end().filter(".back").click(function() 996 { 997 accord.accordion('activate', 0); 998 }).end().filter(".back2").click(function() 999 { 1000 accord.accordion('activate', 1); 1001 }).end().filter(".cancel").click(function() 1002 { 1003 DataLayer.render(BASE_PATH + 'modules/filters/init.ejs', {}, list_filters); 1004 }).end().filter(".submit").click(function() 1005 { 1006 if(valid_save()) $(this).submit(); 1007 else return; 1008 DataLayer.commit('filter', false, function() 1009 { 1010 if($('#gbox_fields-search-messages-grid').length > 0 && action != '') 1011 { 1012 for(var index in selectedMessages) 1013 { 1014 set_message_flag(index, action, false); 1015 } 1016 } 1017 DataLayer.render(BASE_PATH + 'modules/filters/init.ejs', {}, list_filters); 1018 getFromAlertRules(); 1019 }); 1020 }).end().filter('.button.search').click(function() 1021 { 1022 if(valid_save()) showGridMessages($(this)); 1023 else return; 1024 }); // end function click 1025 }); // end DataLayer.render 1026 } 934 1027 935 1028 /* Inicializa os filtros e chama o list_filters … … 955 1048 } 956 1049 } 957 $.each(fromRules, function(index, value) { 958 if(value == folder){ 959 for(var i=0; i < filters_c['criteria'].length; i++){ 960 if(filters_c['criteria'][i].field == 'from'){ 961 from = filters_c['criteria'][i].value; 962 } 963 } 964 cExecute ("$this.imap_functions.removeFlagMessagesFilter&folder="+folder+"&from="+from, function(){}); 965 return false; 966 } 967 }); 968 } 1050 1051 if(preferences['use_alert_filter_criteria'] == "1") 1052 { 1053 $.each(fromRules, function(index, value) { 1054 if(value == folder){ 1055 for(var i=0; i < filters_c['criteria'].length; i++){ 1056 if(filters_c['criteria'][i].field == 'from'){ 1057 from = filters_c['criteria'][i].value; 1058 } 1059 } 1060 cExecute ("$this.imap_functions.removeFlagMessagesFilter&folder="+folder+"&from="+from, function(){}); 1061 return false; 1062 } 1063 }); 1064 } 1065 } -
branches/2.5/prototype/modules/filters/interceptors/FilterMapping.php
r7726 r8232 550 550 $actions['type'] = $rule_apply['actions'][0]['type']; 551 551 $actions['parameter'] = $rule_apply['actions'][0]['parameter']; 552 /* Hardcoded */ 553 $actions['keep'] = false; 552 553 $actions['keep'] = is_array($rule_apply['actions'][1]); 554 if ($actions['keep']) 555 $actions['value'] = $rule_apply['actions'][0]['parameter']; 554 556 555 557 //$messages = $rule_apply['applyMessages']; -
branches/2.5/prototype/modules/mail/css/followupflag.css
r6996 r8232 242 242 .alert-options { 243 243 border: none; 244 min-width:80%; 244 245 } 245 246 .confirm-alarm { -
branches/2.5/prototype/modules/mail/js/foldertree.js
r8117 r8232 108 108 } 109 109 110 function draw_new_tree_folder(callback, force){ 111 112 var folders = normalizeFolder( Folder.get( false, force ) ); 113 114 if(preferences.use_local_messages == 1){ 115 116 if(expresso_mail_archive.folders && !expresso_offline && expresso_mail_archive.enabled == true) { //MailArchive 117 //pega pastas locais do mailarchiver e insere no array de pastas 110 function refreshTreeview(){ 111 //Atualização e correção dos ícones expandir/contrair 112 $.each($('.treeview').find('.expandable, .collapsable').filter(':not(.lastExpandable,.lastCollapsable)'),function(i,v){ 113 if ( $(v).find('ul').css('display') == "block" ){ 114 $(v).removeClass().addClass('collapsable'); 115 $(v).find('.hitarea:first').removeClass().addClass('hitarea collapsable-hitarea') 116 } 117 }); 118 //Última árvore de pastas 119 $.each($('.treeview').find('.lastExpandable,.lastCollapsable'),function(i,v){ 120 if ( $(v).find('ul').css('display') == "block" ){ 121 $(v).removeClass().addClass('collapsable lastCollapsable'); 122 $(v).find('.hitarea:first').removeClass('expandable-hitarea').addClass('collapsable-hitarea'); 123 $(v).find('.hitarea:first').removeClass('lastExpandable-hitarea').addClass('lastCollapsable-hitarea'); 124 } 125 }); 126 } 127 128 function draw_new_tree_folder(callback, force) 129 { 130 131 var folders = normalizeFolder(Folder.get(false, force)); 132 133 if(preferences.use_local_messages == 1) 134 { 135 136 if(expresso_mail_archive.folders && !expresso_offline && expresso_mail_archive.enabled == true) 137 { //MailArchive 138 //pega pastas locais do mailarchiver e insere no array de pastas 118 139 expresso_mail_archive.getFoldersList("home"); 119 140 treeFolders = expresso_mail_archive.folders; 120 141 121 for(var i=0; i<treeFolders.length; i++ ){ 142 for(var i = 0; i < treeFolders.length; i++) 143 { 122 144 mount_children_localfolders_list(treeFolders[i]); 123 145 } 124 125 for(var i = 0; i < treeFolders.length; i++){ 146 147 for(var i = 0; i < treeFolders.length; i++) 148 { 126 149 folders.push(treeFolders[i]); 127 150 } 128 129 } 130 } 131 132 if(!selected){ 151 152 } 153 } 154 155 if(!selected) 156 { 133 157 selected = "INBOX"; 134 158 } … … 137 161 var tree2 = new Array(); 138 162 var tree3 = new Array(); 139 140 for (var i=0; i<folders.length; i++) { 141 142 if(/*/^INBOX/.test(folders[i].id)*/folders[i].id.substr(0,5) == "INBOX") { 143 if (!unorphanize(tree1, folders[i])) { 163 164 for(var i = 0; i < folders.length; i++) 165 { 166 167 if(/*/^INBOX/.test(folders[i].id)*/folders[i].id.substr(0,5) == "INBOX") 168 { 169 if(!unorphanize(tree1, folders[i])) 170 { 144 171 folders[i].children = new Array(); 145 172 … … 147 174 } 148 175 } 149 else if (/*/^user/.test(folders[i].id)*/folders[i].id.substr(0,4) == "user") { 150 if (!unorphanize(tree2, folders[i])) { 176 else if(/*/^user/.test(folders[i].id)*/folders[i].id.substr(0,4) == "user") 177 { 178 if(!unorphanize(tree2, folders[i])) 179 { 151 180 folders[i].children = new Array(); 152 181 tree2.push(folders[i]); 153 182 } 154 183 } 155 else if (/*/^local_messages/.test(folders[i].id)*/folders[i].id.substr(0,14) == "local_messages") { 156 157 tree3.push(folders[i]); 158 159 } 160 } 161 162 for(var i =0; i<tree1.length; i++){ 184 else if(/*/^local_messages/.test(folders[i].id)*/folders[i].id.substr(0,14) == "local_messages") 185 { 186 187 tree3.push(folders[i]); 188 189 } 190 } 191 192 for(var i = 0; i < tree1.length; i++) 193 { 163 194 count_unseen_children(tree1[i]); 164 195 } 165 for(var i =0; i<tree2.length; i++){ 196 for(var i = 0; i < tree2.length; i++) 197 { 166 198 count_unseen_children(tree2[i]); 167 199 } 168 for(var i =0; i<tree3.length; i++){ 200 for(var i = 0; i < tree3.length; i++) 201 { 169 202 count_unseen_children(tree3[i]); 170 203 } … … 174 207 var shared_acls = {}; 175 208 176 $.each(cp_tree2, function(index, value){ 209 $.each(cp_tree2, function(index, value) 210 { 177 211 shared_acls[value.id] = value.acl_share; 178 212 }); 179 180 if(preferences.use_local_messages == 1){ 181 $("#content_folders").removeClass("menu-degrade").parent().removeClass("image-menu"); 182 mail_archive_url = mail_archive_protocol + "://" + mail_archive_host + ":" + mail_archive_port + "/admin"; 183 } 184 185 var html = DataLayer.render('../prototype/modules/mail/templates/detailedfoldertree.ejs', {folders: [tree1, tree2, tree3]}); 186 var folders_html = $("#content_folders").html(html).find(".mainfoldertree").treeview({ 187 persist: "cookie", 188 animated: "fast" 189 }).find(".folder").unbind("click").click(function(event){ 190 191 if ($(this).next().hasClass("local-connect")) { 213 214 if(preferences.use_local_messages == 1) 215 { 216 $("#content_folders").removeClass("menu-degrade").parent().removeClass("image-menu"); 217 mail_archive_url = mail_archive_protocol + "://" + mail_archive_host + ":" + mail_archive_port + "/admin"; 218 } 219 220 var html = DataLayer.render('../prototype/modules/mail/templates/detailedfoldertree.ejs', { 221 folders: [tree1, tree2, tree3] 222 }); 223 var folders_html = $("#content_folders").html(html).find(".mainfoldertree").treeview( 224 { 225 persist: "cookie", 226 animated: "fast" 227 }).find(".folder").unbind("click").click(function(event) 228 { 229 230 if($(this).next().hasClass("local-connect")) 231 { 192 232 return; 193 233 } 194 234 195 if ($(this).hasClass("local-folder")) { 235 if($(this).hasClass("local-folder")) 236 { 196 237 return; 197 238 } 198 239 199 240 // MUDANÇA DE PASTAS! 200 var target = $(this); 201 241 var target = $(this); 242 202 243 if($(".folders-loading").length) 244 { 203 245 return; 204 246 } 247 205 248 if($(event.target).parent().is(".float-menu")) 249 { 206 250 return; 207 208 if( target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable-hitarea, .lastExpandable-hitarea, .treeview ,.folder_unseen,.ui-icon, .float-menu, .new_folder, .folders-loading, .head_folder, .shared-folders') ) 251 } 252 253 if(target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable-hitarea, .lastExpandable-hitarea, .treeview ,.folder_unseen,.ui-icon, .float-menu, .new_folder, .folders-loading, .head_folder, .shared-folders')) 254 { 209 255 return; 210 211 if( target.parent().find(".new_folder").length) 256 } 257 258 if(target.parent().find(".new_folder").length) 259 { 212 260 return; 213 214 if( !target.attr('id') ) 261 } 262 263 if(!target.attr('id')) 264 { 215 265 target = target.parent(); 216 if (target[0] == $(".mainfoldertree")[0]) return; 266 } 267 if(target[0] == $(".mainfoldertree")[0]) 268 { 269 return; 270 } 271 217 272 var uiId = target.attr('id'); 218 273 var child = target.find('.folder'); 219 220 if(!target.is('.mainfoldertree > .expandable-hitarea, .mainfoldertree > .collapsable-hitarea')){ 274 275 if(!target.is('.mainfoldertree > .expandable-hitarea, .mainfoldertree > .collapsable-hitarea')) 276 { 221 277 $('.filetree span.folder.selected').removeClass('selected'); 222 278 $(target).children('.folder').addClass('selected'); … … 224 280 $(this).addClass("folders-loading"); 225 281 selected = target.attr('id'); 226 change_folder(target.attr('id'), child.attr('title')); 227 228 $.ajax({ 229 url : "controller.php?"+ $.param( { action: "$this.imap_functions.get_folders_list", folder: target.attr('id') } ), 230 success : function(data){ 231 data = connector.unserialize(data); 232 233 if(data) 282 change_folder(target.attr('id'), child.attr('title')); 283 284 $.ajax( 285 { 286 url: "controller.php?" + $.param( 287 { 288 action: "$this.imap_functions.get_folders_list", 289 folder: target.attr('id') 290 }), 291 success: function(data) 292 { 293 data = connector.unserialize(data); 294 295 if(data) 296 { 234 297 build_quota(data); 235 } 298 } 299 } 236 300 }); 237 301 238 }).filter('.followup-messages').click(function(event, ui){ 302 }).filter('.followup-messages').click(function(event, ui) 303 { 239 304 search_emails("UNDELETED KEYWORD \"$Followupflagged\""); 240 305 }).end().end(); 241 242 $('.upper').droppable({ 243 over: function(event, ui){ 244 $('#content_folders').autoscroll({ 306 307 refreshTreeview(); 308 309 $('.upper').droppable( 310 { 311 over: function(event, ui) 312 { 313 $('#content_folders').autoscroll( 314 { 245 315 direction: 'up', 246 316 step: 150, … … 248 318 }); 249 319 }, 250 out: function(event, ui){ 320 out: function(event, ui) 321 { 251 322 $('#content_folders').autoscroll('destroy'); 252 323 } 253 324 }); 254 325 255 $('.lower').droppable({ 256 over: function(event, ui){ 257 $('#content_folders').autoscroll({ 326 $('.lower').droppable( 327 { 328 over: function(event, ui) 329 { 330 $('#content_folders').autoscroll( 331 { 258 332 direction: 'down', 259 333 step: 150, … … 261 335 }); 262 336 }, 263 out: function(event, ui){ 337 out: function(event, ui) 338 { 264 339 $('#content_folders').autoscroll('destroy'); 265 340 } … … 268 343 269 344 270 folders_html.find('[id="'+selected+'"]').children().addClass("selected"); 271 $(".folder").not(".head_folder").not(".shared-folders").not(".shared-folders + ul .folder").parent().find(".folder").not(".head_folder,.inbox,.drafts,.sent,.spam,.trash").draggable({ 345 folders_html.find('[id="' + selected + '"]').children().addClass("selected"); 346 $(".folder") 347 .not(".head_folder") 348 .not(".shared-folders") 349 .not(".shared-folders + ul .folder") 350 .parent() 351 .find(".folder") 352 .not(".head_folder,.inbox,.drafts,.sent,.spam,.trash") 353 .draggable( 354 { 272 355 // DRAG DE PASTAS 273 start : function(){ 356 start: function() 357 { 274 358 $(this).css("color", "gray"); 275 359 $('.upper, .lower').show(); 276 $(".lower").css("top", ($("#content_folders").height() -18) + $("#content_folders").offset().top);360 $(".lower").css("top", ($("#content_folders").height() - 18) + $("#content_folders").offset().top); 277 361 }, 278 stop : function(){ 362 stop: function() 363 { 279 364 $(this).css("color", ""); 280 365 $('.upper, .lower').hide(); 281 366 }, 282 367 revert: "invalid", 283 helper: function(event){ 284 if($.trim(($(this).text().split("["))[0]).length > 18) 285 return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]).substring(0,18) + "...", type: "folder"})); 286 return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', {texto : (($(this).text().split("["))[0]), type: "folder"})); 368 helper: function(event) 369 { 370 if($.trim(($(this).text().split("["))[0]).length > 18) return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', { 371 texto: (($(this).text().split("["))[0]).substring(0, 18) + "...", 372 type: "folder" 373 })); 374 return $(DataLayer.render('../prototype/modules/mail/templates/draggin_box.ejs', { 375 texto: (($(this).text().split("["))[0]), 376 type: "folder" 377 })); 287 378 }, 288 379 delay: 150, 289 380 refreshPositions: true, 290 zIndex 381 zIndex: 2700, 291 382 //scroll: true, 292 383 //scrollSensitivity: 100, … … 294 385 containment: $("#divAppbox") 295 386 }); 296 $(".folder").not(".head_folder").not(".shared-folders").parent().find(".folder").not(".head_folder,.inbox,.drafts,.sent,.spam,.trash").end().droppable({ 387 $(".folder") 388 .not(".head_folder") 389 .not(".shared-folders") 390 .parent() 391 .find(".folder") 392 .not(".head_folder,.inbox,.drafts,.sent,.spam,.trash") 393 .end() 394 .droppable( 395 { 297 396 //DROP DE PASTAS 298 over : function(a, b){ 397 over: function(a, b) 398 { 299 399 //INICIO : SE A PASTA CONTER FILHAS EXPANDE 400 $(b.helper).find(".draggin-folder,.draggin-mail").css("color", "green"); 300 401 over = $(this); 301 402 $(this).addClass("folder-over"); 302 if(($(this)[0] != $(this).parent().find(".head_folder")[0])) 303 if($(this).prev()[0]) 304 if($(this).parent().find(".expandable-hitarea")[0] == $(this).prev()[0]){ 305 setTimeout(function(){ 306 if(over.hasClass("folder-over")){ 307 over.prev().trigger("click"); 308 } 309 }, 500); 310 403 if(($(this)[0] != $(this).parent().find(".head_folder")[0])) if($(this).prev()[0]) if($(this).parent().find(".expandable-hitarea")[0] == $(this).prev()[0]) 404 { 405 setTimeout(function() 406 { 407 if(over.hasClass("folder-over")) 408 { 409 over.prev().trigger("click"); 311 410 } 411 }, 500); 412 413 } 312 414 //FIM : SE A PASTA CONTER FILHAS EXPANDE 313 //$("#content_folders").stop().scrollTo($(this), {axis:'y', margin:true, offset:-50, duration:400});314 415 //SETA BORDA EM VOLTA DA PASTA 315 416 // 316 417 }, 317 out : function(){ 418 out: function(a, b) 419 { 318 420 //RETIRA BORDA EM VOLTA DA PASTA 421 $(b.helper).find(".draggin-folder,.draggin-mail").css("color", ""); 319 422 $(this).removeClass("folder-over"); 320 423 }, 321 drop : function(event, ui){ 424 drop: function(event, ui) 425 { 322 426 $(this).removeClass("folder-over"); 323 427 324 if($(this).parent().attr('id') == undefined){ 428 if($(this).parent().attr('id') == undefined) 429 { 325 430 var folder_to = 'INBOX'; 326 431 var to_folder_title = get_lang("Inbox"); 327 }else{ 432 } 433 else 434 { 328 435 var folder_to = $(this).parent().attr('id'); 329 436 var to_folder_title = $(this).attr('title'); 330 } 437 } 331 438 var folder_to_move = ui.draggable.parent().attr('id'); 332 439 var border_id = ui.draggable.find("input[type=hidden]").attr("name"); 333 440 // eventnsagens : SE O DROP VIER DA LISTA DE eventNSAGENS : 334 if(folder_to_move == "tbody_box"){ 335 move_msgs2(get_current_folder(), 'selected', 0, folder_to, to_folder_title,true); 441 if(folder_to_move == "tbody_box") 442 { 443 move_msgs2(get_current_folder(), 'selected', 0, folder_to, to_folder_title, true); 336 444 //Correção para realinhamento da grid de mensagens no navegador Chrome. 337 if(is_webkit){ 445 if(is_webkit) 446 { 338 447 var table = $('#table_box'); 339 448 $('#divScrollMain_0').html(''); … … 344 453 } 345 454 //SE FOR DE UMA PESQUISA RAPIDA 346 else if(ui.draggable.parents('[id^="content_id_"]')[0]){ 347 move_search_msgs("content_id_"+border_id, folder_to, to_folder_title); 455 else if(ui.draggable.parents('[id^="content_id_"]')[0]) 456 { 457 move_search_msgs("content_id_" + border_id, folder_to, to_folder_title); 348 458 return; 349 459 } 350 460 // eventnsagens : SE O DROP VIER DE UMA ABA ABERTA 351 else if(folder_to_move == "border_tr"){ 461 else if(folder_to_move == "border_tr") 462 { 352 463 var id_msg = border_id.split("_")[0]; 353 folder = $("#input_folder_" +border_id+"_r")[0] ? $("#input_folder_"+border_id+"_r").val() : (openTab.imapBox[border_id] ? openTab.imapBox[border_id]:get_current_folder());464 folder = $("#input_folder_" + border_id + "_r")[0] ? $("#input_folder_" + border_id + "_r").val() : (openTab.imapBox[border_id] ? openTab.imapBox[border_id] : get_current_folder()); 354 465 alternate_border(border_id); 355 move_msgs2(folder, id_msg, border_id, folder_to, to_folder_title, true);466 move_msgs2(folder, id_msg, border_id, folder_to, to_folder_title, true); 356 467 return; 357 468 } 358 469 // SE O DROP VIER DA LISTA DE PASTAS 359 else{ 360 if($(ui.draggable[0]).parent().find("input").val() == "localFolder" && $(this).parents("li").find("input").first().val() != "localFolder") 361 { 362 return write_msg(get_lang("It isn't possible to send a folder by Archiver to My folders")); 363 } 364 else if(!$(ui.draggable[0]).parent().find("input").val() && $(this).parents("li").find("input").first().val() == "localFolder") 365 { 366 return write_msg(get_lang("It isn't possible to send a folder by My folders to Archiver")); 367 } 368 var folder_to_exist = folder_to_move.split(cyrus_delimiter); 369 folder_to_exist = folder_to+cyrus_delimiter+folder_to_exist[folder_to_exist.length-1]; 370 470 else 471 { 472 if($(ui.draggable[0]).parent().find("input").val() == "localFolder" && $(this).parents("li").find("input").first().val() != "localFolder") 473 { 474 return write_msg(get_lang("It isn't possible to send a folder by Archiver to My folders")); 475 } 476 else if(!$(ui.draggable[0]).parent().find("input").val() && $(this).parents("li").find("input").first().val() == "localFolder") 477 { 478 return write_msg(get_lang("It isn't possible to send a folder by My folders to Archiver")); 479 } 480 var folder_to_exist = folder_to_move.split(cyrus_delimiter); 481 folder_to_exist = folder_to + cyrus_delimiter + folder_to_exist[folder_to_exist.length - 1]; 482 371 483 //VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS 372 373 if(valid_tabs(ui.draggable.parent().find("li"), folder_to_move)){484 if(valid_tabs(ui.draggable.parent().find("li"), folder_to_move)) 485 { 374 486 return; 375 487 } 376 488 //FIM : VERIFICA SE EXISTE UMA eventNSAGENS ABERTA NESTA PASTA E NAS SUAS FILHAS; 377 378 489 // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA PARA O eventSMO LOCAL 379 if(folder_to_exist == folder_to_move){ 490 if(folder_to_exist == folder_to_move) 491 { 380 492 return write_msg(get_lang("Thie folder is already in this place")); 381 493 } 382 494 383 495 // VALIDA SE O USUARIO ESTA TENTANDO MOVER A PASTA ABERTA NO momentO 384 if(folder_to_move == get_current_folder()){ 496 if(folder_to_move == get_current_folder()) 497 { 385 498 return write_msg(get_lang("It's not possible move this folder, because it is being used in the moment!")); 386 499 } 387 500 388 501 // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA FILHA DA PASTA ABERTA NO momentO 389 if(ui.draggable.parent().find(".selected")[0]){ 502 if(ui.draggable.parent().find(".selected")[0]) 503 { 390 504 return write_msg(get_lang("It's not possible move this folder, because its subfolder is being used in the moment!")); 391 505 } 392 506 393 507 // VALIDA SE O USUARIO ESTA TENTANDO MOVER UMA PASTA PAI PARA DENTRO DE UMA FILHA 394 if(ui.draggable.parent().find('[id="'+folder_to+'"]')[0]){ 508 if(ui.draggable.parent().find('[id="' + folder_to + '"]')[0]) 509 { 395 510 return write_msg(get_lang("It's not possible to move this folder to its subfolders!")); 396 } 397 398 if($('[id="'+folder_to_exist+'"]').length){ 511 } 512 513 if($('[id="' + folder_to_exist + '"]').length) 514 { 399 515 return write_msg(get_lang("Can not move this folder to this location, because the target has already a folder with this name")); 400 516 } 401 517 402 518 $(this).addClass("folders-loading"); 403 519 404 520 405 if($(this).parents("li").find("input").first().val() == "localFolder"){ 521 if($(this).parents("li").find("input").first().val() == "localFolder") 522 { 406 523 var idFolder = $(this).parent().attr("id").split("_")[2]; 407 524 408 525 expresso_mail_archive.moveFolder(idFolder, folder_to_move.split("_")[2]); 409 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 410 } else { 411 $.ajax({ 412 url : "controller.php?"+ $.param( { action: "$this.imap_functions.move_folder", folder_to_move: folder_to_move, folder_to: folder_to } ), 413 success : function(data){ 526 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 527 } 528 else 529 { 530 $.ajax( 531 { 532 url: "controller.php?" + $.param( 533 { 534 action: "$this.imap_functions.move_folder", 535 folder_to_move: folder_to_move, 536 folder_to: folder_to 537 }), 538 success: function(data) 539 { 414 540 cExecute("$this.imap_functions.get_folders_list&onload=true", force_update_menu); 415 541 data = connector.unserialize(data); 416 if(data == "Permission denied"){ 542 if(data == "Permission denied") 543 { 417 544 write_msg(get_lang("Permission denied")); 418 }else if(data){ 545 } 546 else if(data) 547 { 419 548 write_msg(get_lang("The folder was successfully moved")); 420 } else { 549 } 550 else 551 { 421 552 write_msg(get_lang("ERROR moving your folder.")); 422 553 } … … 427 558 } 428 559 }); 429 $(".folder").not(".shared-folders, .followup-messages").parent().find(".folder").hover( 430 function(){ 431 //CASO A LI NÃO TENHA UM eventNU FLUTUANTE AINDA, O eventNU É ADICIONADO! 432 if(!$(this).children(":last").hasClass("float-menu") && !$(this).children(":last").hasClass("new_folder") && !($(this).next().hasClass("local-connect"))){ /*se houver a classe local-connect, não adiciona o botão de conectar*/ 433 var folder_ = $(this); 434 var folder_name; 435 var shared = { 436 head : false, 437 valid : false 438 }; 439 if(folder_.parent().attr('id')){ 440 folder_name = folder_.parent().attr('id').split(cyrus_delimiter); 441 folder_name = folder_name[folder_name.length -1]; 442 shared.valid = folder_.parent().attr('id').search("user/") == 0 ? true : false; 443 }else 444 folder_name = "Root"; 445 446 if(shared.valid){ 447 shared.head = folder_.parent().attr('id').split(cyrus_delimiter).length == 2 ? true : false; 448 var folder_name_parts = folder_.parent().attr('id').split(cyrus_delimiter); 449 var acls = shared_acls[folder_name_parts[0]+cyrus_delimiter+folder_name_parts[1]]; 450 } 451 452 html = DataLayer.render("../prototype/modules/mail/templates/float_folder_menu.ejs", {name_folder : folder_name, flag : shared, acl : acls}); 453 //FUNÇÃO DO eventNU FLUTUANTE EDITAR < BEGIN 454 var esc = false; 455 $(folder_).append(html).find(".float-menu-edit").click(function(){ 456 var folder_id = $(this).parents(".closed:first").attr('id'); 457 var name = $.trim($(this).parents(".closed:first").find("span:first").text().split("[")[0]); 458 if($(this).parents(".closed:first").find("span:first").hasClass("selected")) 459 return write_msg(get_lang("It's not possible rename this folder, because it is being used in the moment!")); 460 if($(this).parents(".closed:first").find("span.selected").length) 461 return write_msg(get_lang("It's not possible rename this folder, because its subfolder is being used in the moment!")); 462 if(valid_tabs($(this).parents("li:first").find("li"), folder_id)) 463 return; 464 $(this).parents(".closed:first").find("span:first").empty().append("<input class='new_folder folder' type='text' maxlength='100'></input>"); 465 $(".new_folder").focus().keydown(function(event){ 466 event.stopPropagation(); 467 if(event.keyCode == 13){ 468 if($(this).val() != ""){ 469 /* Verifica se existe caracteres especiais no nome da pasta ou se existe "local_" 470 * em parte do nome (palavra reservada para pastas locais) */ 471 if($(this).val().match(/[\`\~\^\<\>\|\\\"\!\@\#\$\%\&\*\+\(\)\[\]\{\}\?;:]/gi) || $(this).val().indexOf("local_") != -1){ 472 return write_msg(get_lang("cannot create folder. try other folder name")); 473 } 474 var new_name = folder_id.replace(/[a-zA-Z0-9á-úÁ-Ú,=^\s_-]+$/, $(this).val()); 475 if($('[id="'+new_name+'"]').length){ 476 $(".folders-loading").removeClass("folders-loading"); 477 write_msg(get_lang("Mailbox already exists")); 478 return draw_new_tree_folder(); 479 } 480 $(".new_folder").parent().addClass("folders-loading"); 481 482 if($(this).parents("li").first().attr("id").indexOf("local_messages_") != -1){ 483 var idFolder = $(this).parents("li").first().attr("id").split("_")[2]; 484 expresso_mail_archive.renameFolder(idFolder, new_name); 485 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 486 } else { 487 488 $.ajax({ 489 url : "controller.php?action=$this.imap_functions.ren_mailbox", 490 type : "POST", 491 data : "current="+folder_id+"&rename="+new_name, 492 success : function(data){ 560 $(".folder") 561 .not(".shared-folders, .followup-messages") 562 .parent() 563 .find(".folder") 564 .not($('#message-attach-dialog').find('.folder')) 565 .hover( 566 function() 567 { 568 //CASO A LI NÃO TENHA UM eventNU FLUTUANTE AINDA, O eventNU É ADICIONADO! 569 if(!$(this).children(":last").hasClass("float-menu") && !$(this).children(":last").hasClass("new_folder") && !($(this).next().hasClass("local-connect"))) 570 { /*se houver a classe local-connect, não adiciona o botão de conectar*/ 571 var folder_ = $(this); 572 var folder_name; 573 var shared = { 574 head: false, 575 valid: false 576 }; 577 if(folder_.parent().attr('id')) 578 { 579 folder_name = folder_.parent().attr('id').split(cyrus_delimiter); 580 folder_name = folder_name[folder_name.length - 1]; 581 shared.valid = folder_.parent().attr('id').search("user"+cyrus_delimiter) == 0 ? true : false; 582 } 583 else folder_name = "Root"; 584 585 if(shared.valid) 586 { 587 shared.head = folder_.parent().attr('id').split(cyrus_delimiter).length == 2 ? true : false; 588 var folder_name_parts = folder_.parent().attr('id').split(cyrus_delimiter); 589 var acls = shared_acls[folder_name_parts[0] + cyrus_delimiter + folder_name_parts[1]]; 590 } 591 592 html = DataLayer.render("../prototype/modules/mail/templates/float_folder_menu.ejs", { 593 name_folder: folder_name, 594 flag: shared, 595 acl: acls 596 }); 597 //FUNÇÃO DO eventNU FLUTUANTE EDITAR < BEGIN 598 var esc = false; 599 $(folder_).append(html).find(".float-menu-edit").click(function() 600 { 601 var folder_id = $(this).parents(".closed:first").attr('id'); 602 var name = $.trim($(this).parents(".closed:first").find("span:first").text().split("[")[0]); 603 if($(this).parents(".closed:first").find("span:first").hasClass("selected")) 604 { 605 return write_msg(get_lang("It's not possible rename this folder, because it is being used in the moment!")); 606 } 607 if($(this).parents(".closed:first").find("span.selected").length) 608 { 609 return write_msg(get_lang("It's not possible rename this folder, because its subfolder is being used in the moment!")); 610 } 611 if(valid_tabs($(this).parents("li:first").find("li"), folder_id)) 612 { 613 return; 614 } 615 $(this).parents(".closed:first").find("span:first").empty().append("<input class='new_folder folder' type='text' maxlength='100'></input>"); 616 $(".new_folder").focus().keydown(function(event) 617 { 618 event.stopPropagation(); 619 if(event.keyCode == 13) 620 { 621 if($(this).val() != "") 622 { 623 /* Verifica se existe caracteres especiais no nome da pasta ou se existe "local_" 624 * em parte do nome (palavra reservada para pastas locais) */ 625 if($(this).val().match(/[\`\~\^\<\>\|\\\"\!\@\#\$\%\&\*\+\(\)\[\]\{\}\?;:]/gi) || $(this).val().indexOf("local_") != -1) 626 { 627 return write_msg(get_lang("cannot create folder. try other folder name")); 628 } 629 var new_name = folder_id.replace(/[a-zA-Z0-9á-úÁ-Ú,=^\s_-]+$/, $(this).val()); 630 if($('[id="' + new_name + '"]').length) 631 { 632 $(".folders-loading").removeClass("folders-loading"); 633 write_msg(get_lang("Mailbox already exists")); 634 return draw_new_tree_folder(); 635 } 636 $(".new_folder").parent().addClass("folders-loading"); 637 638 if($(this).parents("li").first().attr("id").indexOf("local_messages_") != -1) 639 { 640 var idFolder = $(this).parents("li").first().attr("id").split("_")[2]; 641 expresso_mail_archive.renameFolder(idFolder, new_name); 642 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 643 } 644 else 645 { 646 $.ajax( 647 { 648 url: "controller.php?action=$this.imap_functions.ren_mailbox", 649 type: "POST", 650 data: "current=" + folder_id + "&rename=" + new_name, 651 success: function(data) 652 { 493 653 data = connector.unserialize(data); 494 if(data == "Permission denied"){ 654 if(data == "Permission denied") 655 { 495 656 $(".folders-loading").removeClass("folders-loading"); 496 657 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); … … 502 663 }); 503 664 504 } 505 }else{ 506 $(".new_folder").focusout(); 507 } 508 }else if( event.keyCode == 27){ 509 draw_new_tree_folder(); 510 } 511 }).focusout(function(){ 665 } 666 } 667 else 668 { 669 $(".new_folder").focusout(); 670 } 671 } 672 else if(event.keyCode == 27) 673 { 512 674 draw_new_tree_folder(); 513 }).val(name);514 })515 //FUNÇÃO DO eventNU FLUTUANTE EDITAR < END516 //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < BEGIN517 .end().find(".float-menu-remove").click(function(){518 519 var folder_id = $(this).parents(".closed:first").attr('id');520 var folder_name = "<strong>"+$.trim($(this).parents(".closed:first").find(".folder").text().split("[")[0])+"</strong>";521 522 if(valid_tabs($(this).parents("li:first").find("li"), folder_id))523 return;524 $(this).parents(".closed:first").find(".folder").addClass("folders-loading");525 526 if($(this).parents(".closed:first").find("ul").length){527 $(this).parents(".closed:first").find(".folder").removeClass("folders-loading");528 return write_msg(get_lang("Delete/move subfolders first"));529 675 } 530 if($(this).parents(".closed:first").find("span.selected").length){ 531 $(this).parents(".closed:first").find(".folder").removeClass("folders-loading"); 532 return write_msg(get_lang("It's not possible delete this folder, because it is being used in the moment!")); 533 } 534 var folder_span = $(this); 535 var confirm_text = get_lang("Do you wish to exclude the folder "); 536 537 $.Zebra_Dialog(confirm_text+folder_name, { 538 'type': 'question', 539 'overlay_opacity': '0.5', 540 'custom_class': 'custom-zebra-filter', 541 'buttons': [get_lang('Yes'), get_lang('No')], 542 'onClose': function(caption) { 543 544 if(caption == get_lang('Yes')){ 545 if(folder_span.parents("li").find("input").first().val() == "localFolder"){ 546 var idFolder = folder_span.parents("li").first().attr("id").split("_")[2]; 547 expresso_mail_archive.deleteFolder(idFolder, folder_name); 548 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 549 } else { 550 $.ajax({ 551 url : "controller.php?action=$this.imap_functions.delete_mailbox", 676 }).focusout(function() 677 { 678 draw_new_tree_folder(); 679 }).val(name); 680 }) 681 //FUNÇÃO DO eventNU FLUTUANTE EDITAR < END 682 //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < BEGIN 683 .end().find(".float-menu-remove").click(function() 684 { 685 686 var folder_id = $(this).parents(".closed:first").attr('id'); 687 var folder_name = "<strong>" + $.trim($(this).parents(".closed:first").find(".folder").text().split("[")[0]) + "</strong>"; 688 689 if(valid_tabs($(this).parents("li:first").find("li"), folder_id)) 690 { 691 return; 692 } 693 $(this).parents(".closed:first").find(".folder").addClass("folders-loading"); 694 695 if($(this).parents(".closed:first").find("ul").length) 696 { 697 $(this).parents(".closed:first").find(".folder").removeClass("folders-loading"); 698 return write_msg(get_lang("Delete/move subfolders first")); 699 } 700 if($(this).parents(".closed:first").find("span.selected").length) 701 { 702 $(this).parents(".closed:first").find(".folder").removeClass("folders-loading"); 703 return write_msg(get_lang("It's not possible delete this folder, because it is being used in the moment!")); 704 } 705 var folder_span = $(this); 706 var confirm_text = get_lang("Do you wish to exclude the folder "); 707 708 $.Zebra_Dialog(confirm_text + folder_name, { 709 'type': 'question', 710 'overlay_opacity': '0.5', 711 'custom_class': 'custom-zebra-filter', 712 'buttons': [get_lang('Yes'), get_lang('No')], 713 'onClose': function(caption) 714 { 715 716 if(caption == get_lang('Yes')) 717 { 718 if(folder_span.parents("li").find("input").first().val() == "localFolder") 719 { 720 var idFolder = folder_span.parents("li").first().attr("id").split("_")[2]; 721 expresso_mail_archive.deleteFolder(idFolder, folder_name); 722 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 723 } 724 else 725 { 726 $.ajax( 727 { 728 url: "controller.php?action=$this.imap_functions.delete_mailbox", 552 729 type: "POST", 553 data : "del_past="+folder_id, 554 success : function(data){ 730 data: "del_past=" + folder_id, 731 success: function(data) 732 { 555 733 data = connector.unserialize(data); 556 if(data == "Mailbox does not exist"){ 734 if(data == "Mailbox does not exist") 735 { 557 736 $(".folders-loading").removeClass("folders-loading"); 558 737 return write_msg(get_lang("Mailbox does not exist")); 559 }else if(data == "Permission denied"){ 738 } 739 else if(data == "Permission denied") 740 { 560 741 $(".folders-loading").removeClass("folders-loading"); 561 742 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); … … 566 747 } 567 748 }); 749 } 750 } 751 else 752 { 753 folder_span.parents(".closed:first").find(".folder").removeClass("folders-loading"); 754 return; 755 } 756 } 757 }); 758 }) 759 //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < END 760 //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < BEGIN 761 .end().find(".float-menu-new").click(function() 762 { 763 $(this).parents(".float-menu").hide(); 764 var selected_li = $(this).parents(".closed:first"); 765 if(selected_li.find("ul:first").length) 766 { 767 var new_folder = $("<li><input class='new_folder folder' type='text' maxlength='100'></input></li>").appendTo(selected_li.find("ul:first")); 768 if(selected_li.find(".expandable-hitarea").length) 769 { 770 selected_li.find(".expandable-hitarea").trigger('click'); 771 } 772 selected_li.find("ul:first").treeview( 773 { 774 add: new_folder 775 }); 776 } 777 else if(selected_li.length) 778 { 779 var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li); 780 selected_li.treeview( 781 { 782 add: new_folder 783 }); 784 } 785 else 786 { 787 selected_li = $(this).parents("li:first"); 788 if($(this).parents(".head_folder").parent().find(".expandable-hitarea").length) 789 { 790 $(this).parents(".head_folder").parent().find(".expandable-hitarea").trigger('click'); 791 } 792 var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li); 793 selected_li.treeview( 794 { 795 add: new_folder 796 }); 797 } 798 var existsIdenticalFolder = false; 799 selected_li.find(".new_folder").Watermark("Nova Pasta").focus().keydown(function(event) 800 { 801 event.stopPropagation(); 802 803 existsIdenticalFolder = false; 804 805 var ok = false; 806 var makeChildren = function(auxNameFolder, father) 807 { 808 if(auxNameFolder.length == 0) return true; 809 810 811 if(auxNameFolder[0] == "") 812 { 813 auxNameFolder.shift(); 814 makeChildren(auxNameFolder, father); 815 return true; 816 } 817 if(ok == false) 818 { 819 expresso_mail_archive.createFolder((father ? father : "inbox"), auxNameFolder[0]); 820 } 821 822 expresso_mail_archive.getFoldersList(father); 823 824 for(var ii = 0; ii < expresso_mail_archive.folders.length; ii++) 825 { 826 if(auxNameFolder[0] == expresso_mail_archive.folders[ii].name) 827 { 828 auxNameFolder.shift(); 829 save = expresso_mail_archive.folders; 830 expresso_mail_archive.createFolder(expresso_mail_archive.folders[ii].id, auxNameFolder[0]); 831 expresso_mail_archive.folders = save; 832 ok = true; 833 makeChildren(auxNameFolder, expresso_mail_archive.folders[ii].id); 834 return true; 568 835 } 569 }else{ 570 folder_span.parents(".closed:first").find(".folder").removeClass("folders-loading"); 571 return; 572 } 573 } 574 }); 575 /* if(!confirm(confirm_text + folder_name)){ 576 $(this).parents(".closed:first").find(".folder").removeClass("folders-loading"); 577 return; 578 } */ 579 }) 580 //FUNÇÃO DO eventNU FLUTUANTE EXCLUIR < END 581 //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < BEGIN 582 .end().find(".float-menu-new").click(function(){ 583 $(this).parents(".float-menu").hide(); 584 var selected_li = $(this).parents(".closed:first"); 585 if(selected_li.find("ul:first").length){ 586 var new_folder = $("<li><input class='new_folder folder' type='text' maxlength='100'></input></li>").appendTo(selected_li.find("ul:first")); 587 if(selected_li.find(".expandable-hitarea").length){ 588 selected_li.find(".expandable-hitarea").trigger('click'); 589 } 590 selected_li.find("ul:first").treeview({ 591 add: new_folder 592 }); 593 }else if(selected_li.length){ 594 var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li); 595 selected_li.treeview({ 596 add: new_folder 597 }); 598 }else{ 599 selected_li = $(this).parents(".head_folder").parent(); 600 if($(this).parents(".head_folder").parent().find(".expandable-hitarea").length){ 601 $(this).parents(".head_folder").parent().find(".expandable-hitarea").trigger('click'); 602 } 603 var new_folder = $("<ul><li><input class='new_folder folder' type='text' maxlength='100'></input></li></ul>").appendTo(selected_li); 604 selected_li.treeview({ 605 add: new_folder 606 }); 836 } 837 } 838 839 840 if(event.keyCode == 13) 841 { 842 /* Verifica se existe caracteres especiais no nome da pasta ou se existe "local_" 843 * em parte do nome (palavra reservada para pastas locais) */ 844 if($(this).val().match(/[\`\~\^\<\>\|\\\"\!\@\#\$\%\&\*\+\(\)\[\]\{\}\?;:]/gi) || $(this).val().indexOf("local_") != -1) 845 { 846 return write_msg(get_lang("cannot create folder. try other folder name")); 847 } 848 if($(this).parents("li").find("input[type=hidden]").val() == "localFolder") 849 { 850 851 $(".new_folder").parent().addClass("folders-loading"); 852 853 var folderName = $(this).val(); 854 var folder = (folderName != "" ? folderName : get_lang("New Folder")); 855 var father = typeof(selected_li.attr('id')) != "undefined" ? selected_li.attr('id').split("_")[2] : "home"; 856 857 $(this).parents(".treeview:first").find("li").each(function() 858 { 859 var eachFolder = $(this).find("span:first").text().trim(); 860 if(folder == eachFolder) 861 { 862 existsIdenticalFolder = true; 863 return false; 864 } 865 }); 866 867 if(existsIdenticalFolder) 868 { 869 event.stopPropagation(); 870 write_msg(get_lang("Mailbox already exists")); 871 draw_new_tree_folder(); 872 return false; 873 } 874 875 if(folderName.indexOf("/") != -1) 876 { 877 auxNameFolder = folderName.split("/"); 878 879 makeChildren(auxNameFolder, father); 880 } 881 else 882 { 883 var folder = (folderName != "" ? folderName : get_lang("New Folder")); 884 create_new_local_folder((selected_li.attr('id') ? selected_li.attr('id') : "inbox"), folder); 885 } 886 887 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 888 } 889 else 890 { 891 if($('[id="' + (selected_li.attr('id') ? selected_li.attr('id') : "INBOX") + cyrus_delimiter + $(this).val() + '"]').length) 892 { 893 $(".folders-loading").removeClass("folders-loading"); 894 write_msg(get_lang("Mailbox already exists")); 895 return draw_new_tree_folder(); 896 } 897 $(".new_folder").parent().addClass("folders-loading"); 898 create_new_folder(($(this).val() != "" ? $(this).val() : get_lang("New Folder")), (selected_li.attr('id') ? selected_li.attr('id') : "INBOX")); 899 } 900 607 901 } 608 var existsIdenticalFolder = false; 609 selected_li.find(".new_folder").Watermark("Nova Pasta").focus().keydown(function(event){ 610 event.stopPropagation(); 611 612 existsIdenticalFolder = false; 613 614 var ok = false; 615 var makeChildren = function(auxNameFolder, father){ 616 if(auxNameFolder.length == 0) return true; 617 618 619 if(auxNameFolder[0] == ""){ 620 auxNameFolder.shift(); 621 makeChildren(auxNameFolder, father); 622 return true; 623 } 624 if(ok == false) 625 expresso_mail_archive.createFolder((father ? father : "inbox"), auxNameFolder[0]); 626 627 expresso_mail_archive.getFoldersList(father); 628 629 for(var ii =0; ii<expresso_mail_archive.folders.length; ii++){ 630 if(auxNameFolder[0] == expresso_mail_archive.folders[ii].name){ 631 auxNameFolder.shift(); 632 save = expresso_mail_archive.folders; 633 expresso_mail_archive.createFolder(expresso_mail_archive.folders[ii].id, auxNameFolder[0]); 634 expresso_mail_archive.folders = save; 635 ok = true; 636 makeChildren(auxNameFolder, expresso_mail_archive.folders[ii].id); 637 return true; 638 } 639 } 902 else if(event.keyCode == 27) 903 { 904 draw_new_tree_folder(); 640 905 } 641 906 642 643 if(event.keyCode == 13){ 644 /* Verifica se existe caracteres especiais no nome da pasta ou se existe "local_" 645 * em parte do nome (palavra reservada para pastas locais) */ 646 if($(this).val().match(/[\`\~\^\<\>\|\\\"\!\@\#\$\%\&\*\+\(\)\[\]\{\}\?;:]/gi) || $(this).val().indexOf("local_") != -1){ 647 return write_msg(get_lang("cannot create folder. try other folder name")); 648 } 649 if($(this).parents("li").find("input[type=hidden]").val() == "localFolder"){ 650 651 $(".new_folder").parent().addClass("folders-loading"); 652 653 var folderName = $(this).val(); 654 var folder = (folderName != "" ? folderName : get_lang("New Folder")); 655 var father = typeof(selected_li.attr('id')) != "undefined" ? selected_li.attr('id').split("_")[2] : "home"; 656 657 $(this).parents(".treeview:first").find("li").each(function(){ 658 var eachFolder = $(this).find("span:first").text().trim(); 659 if(folder == eachFolder){ 660 existsIdenticalFolder = true; 661 return false; 662 } 663 }); 664 665 if(existsIdenticalFolder){ 666 event.stopPropagation(); 667 write_msg(get_lang("Mailbox already exists")); 668 draw_new_tree_folder(); 669 return false; 670 } 671 672 if(folderName.indexOf("/") != -1){ 673 auxNameFolder = folderName.split("/"); 674 675 makeChildren(auxNameFolder, father); 676 } else { 677 var folder = (folderName != "" ? folderName : get_lang("New Folder")); 678 create_new_local_folder((selected_li.attr('id') ? selected_li.attr('id') : "inbox") , folder); 679 } 680 681 cExecute("$this.imap_functions.get_folders_list&onload=true", update_menu); 682 } else { 683 if($('[id="'+ (selected_li.attr('id')? selected_li.attr('id') : "INBOX") + cyrus_delimiter + $(this).val()+'"]').length){ 684 $(".folders-loading").removeClass("folders-loading"); 685 write_msg(get_lang("Mailbox already exists")); 686 return draw_new_tree_folder(); 687 } 688 $(".new_folder").parent().addClass("folders-loading"); 689 create_new_folder(($(this).val() != "" ? $(this).val() : get_lang("New Folder")), (selected_li.attr('id')? selected_li.attr('id') : "INBOX")); 690 } 691 692 }else if( event.keyCode == 27){ 693 draw_new_tree_folder(); 694 } 695 696 }).focusout(function(){ 697 if(!existsIdenticalFolder){ 698 draw_new_tree_folder(); 699 } 700 701 }); 702 }).end().find(".float-menu-export").click(function(){ 703 //proxy_mensagens.export_all_messages($(this).parents("li:first").attr("id")) 704 705 var name_box = $(this).parents("li:first").attr("id"); 706 707 var name_folder = name_box.split(cyrus_delimiter)[name_box.split(cyrus_delimiter).length-1]; 708 709 710 var hand_export = function(data){ 711 clean_msg(); 712 if(!data){ 907 }).focusout(function() 908 { 909 if(!existsIdenticalFolder) 910 { 911 draw_new_tree_folder(); 912 } 913 914 }); 915 }).end().find(".float-menu-export").click(function() 916 { 917 var name_box = $(this).parents("li:first").attr("id"); 918 919 var name_folder = name_box.split(cyrus_delimiter)[name_box.split(cyrus_delimiter).length - 1]; 920 921 922 var hand_export = function(data) 923 { 924 clean_msg(); 925 if(!data) 926 { 713 927 write_msg(get_lang('Error compressing messages (ZIP). Contact the administrator.')) 714 }else if(data["empty_folder"] || data == "empty_folder"){ 928 } 929 else if(data["empty_folder"] || data == "empty_folder") 930 { 715 931 write_msg(get_lang("The selected folder is empty.")); 716 } else717 download_attachments(null, null, data, null,null, name_folder +'.zip'); 932 } 933 else download_attachments(null, null, data, null, null, name_folder + '.zip'); 718 934 } 719 if($(this).parents("li:first").find("input[type=hidden]:first").val() == "localFolder"){ 720 expresso_mail_archive.listMessages(name_box.split("_")[2]); 721 var msgsArchive = expresso_mail_archive.messageslisted; 722 723 buildExportArchiver(msgsArchive, name_box); 724 725 } else { 726 cExecute("$this.exporteml.export_all",hand_export,"folder="+name_box); 727 } 728 write_msg(get_lang('You must wait while the messages will be exported...'),true); 729 }); 730 //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < END 731 } 732 if(!$(".new_folder").length){ 733 $(this).find(".float-menu:first").css("display", ""); 734 } 735 }, 736 function(){ 737 $(this).find(".float-menu:first").hide(); 738 } 739 ); 740 $("#new_m").html($('.selected').find(".folder_unseen").html() ? $('.selected').find(".folder_unseen").html() : "0").css("color", "red"); 935 if($(this).parents("li:first").find("input[type=hidden]:first").val() == "localFolder") 936 { 937 expresso_mail_archive.listMessages(name_box.split("_")[2]); 938 var msgsArchive = expresso_mail_archive.messageslisted; 939 940 buildExportArchiver(msgsArchive, name_box); 941 942 } 943 else 944 { 945 cExecute("$this.exporteml.export_all", hand_export, "folder=" + name_box); 946 } 947 write_msg(get_lang('You must wait while the messages will be exported...'), true); 948 }); 949 //FUNÇÃO DO eventNU FLUTUANTE NOVA PASTA < END 950 } 951 if(!$(".new_folder").length) 952 { 953 $(this).find(".float-menu:first").css("display", ""); 954 } 955 }, function() 956 { 957 $(this).find(".float-menu:first").hide(); 958 }); 959 $("#new_m") 960 .html($('.selected .message_unseen_count:first .folder_unseen').html() ? $('.selected .message_unseen_count:first .folder_unseen').html() : "0") 961 .css("color", "red"); 741 962 } -
branches/2.5/prototype/modules/mail/js/followupflag.js
r7780 r8232 73 73 winElement.dialog("close"); 74 74 $.each(selectedMessageIds, function(index, value){ 75 $('tr#' + value + ' .td-followup-flag') .find('img').remove();75 $('tr#' + value + ' .td-followup-flag')//.find('img').remove(); 76 76 }); 77 77 … … 173 173 alert('Uma ou mais mensagens não puderam ser sinalizadas. \nDetalhes do erro: limite de flags atingido para esta pasta.'); 174 174 } 175 $.each(selectedMessageIds,function(index,value){ 176 var flagged = DataLayer.get('followupflagged', {filter: [ 177 'AND', 178 ['=', 'messageNumber', value], 179 ['=', 'folderName', folder_name] 180 ]}); 181 if (!flagged) 182 $('#td_message_followup_'+value).find(".flag-edited").css("background","#cccccc").find('img').remove(); 183 184 $('tr#' + value + ' .td-followup-flag').find('img').remove(); 185 }); 175 /*DIVIDE O ARRAY EM ARRAYS MENORES*/ 176 var splice = function(arr){ 177 var newArray = []; 178 while (arr.length > 500){ 179 newArray[newArray.length] = arr.splice(0,500); 180 } 181 if (arr.length) 182 newArray[newArray.length] = arr; 183 return newArray; 184 } 185 if (selectedMessageIds.length > 500){ 186 var arrayIndex = selectedMessageIds; 187 $.each(splice(arrayIndex),function(iterator,subarray){ 188 var flaggeds = DataLayer.get('followupflagged', {filter: [ 189 'AND', 190 ['IN', 'messageNumber', subarray], 191 ['IN', 'folderName', folder_name] 192 ]}); 193 $.each(subarray,function(index,value){ 194 var flagged = false; 195 $.each(flaggeds,function(i,v){ 196 if (v.messageNumber == value) 197 flagged = true; 198 }); 199 if (!flagged) 200 $('#td_message_followup_'+value).find(".flag-edited").css("background","#cccccc").find('img').remove(); 201 $('tr#' + value + ' .td-followup-flag').find('img').remove(); 202 }); 203 }); 204 } 186 205 }); 187 206 winElement.find('.menu-configure-followupflag .save').button("option", "disabled", true); … … 267 286 268 287 $.each(selectedMessageIds, function(index, value){ 269 $('tr#' + value + ' .td-followup-flag').find('img') .remove();288 $('tr#' + value + ' .td-followup-flag').find('img')//.remove(); 270 289 }); 271 290 … … 756 775 757 776 } 758 759 $('#main_table').ready(function(){ 760 handlerMessageFilter = function (data) { 761 alarmFollowupflagged(null, data); 762 } 763 /* Busca nas pastas indexadas para ver se há novas mensagens com a flag $FilteredMessage */ 764 cExecute ("$this.imap_functions.getFlaggedAlertMessages&folders="+fromRules, handlerMessageFilter); 765 }); 766 777 778 if(preferences['use_alert_filter_criteria'] == "1") 779 { 780 $('#main_table').ready(function(){ 781 handlerMessageFilter = function (data) { 782 alarmFollowupflagged(null, data); 783 } 784 /* Busca nas pastas indexadas para ver se há novas mensagens com a flag $FilteredMessage */ 785 cExecute ("$this.imap_functions.getFlaggedAlertMessages&folders="+fromRules, handlerMessageFilter); 786 }); 787 } 788 789 -
branches/2.5/prototype/modules/mail/js/label.js
r7750 r8232 83 83 } 84 84 85 function returnLabels(msgsReference){ 86 var folderIndex = {}; 87 for (var i=0; i < msgsReference.length; i++) { 88 if( folderIndex[ msgsReference[i].folderName] ){ 89 folderIndex[ msgsReference[i].folderName].push( msgsReference[i].messageNumber ); 90 }else{ 91 folderIndex[ msgsReference[i].folderName] = [ msgsReference[i].messageNumber ]; 92 } 93 } 94 var labels = []; 95 for(var folder in folderIndex){ 96 var currentLabes = DataLayer.get('labeled',{ filter:[ 97 'AND', 98 ['=', 'folderName', folder ], 99 ['IN', 'messageNumber', folderIndex[ folder ] ] 100 ], criteria: {deepness: '2'}}); 101 102 if( $.isArray( currentLabes ) ) 103 labels = labels.concat( currentLabes ); 104 } 105 var labelsIndex = {}; 106 $.each( labels, function(i, e){ 107 if( labelsIndex[ e.messageNumber ] ){ 108 labelsIndex[ e.messageNumber ][ 'labels' ].push( e.label ); 109 }else{ 110 labelsIndex[ e.messageNumber ] = e; 111 labelsIndex[ e.messageNumber ][ 'labels' ] = []; 112 labelsIndex[ e.messageNumber ][ 'labels' ].push( e.label ); 113 } 114 }); 115 return labelsIndex; 116 } 117 118 85 119 function updateMessageLabels(msgsReference){ 86 for(var i = 0; i < msgsReference.length; i++){ 87 updateLabelsColumn({msg_number: msgsReference[i].messageNumber, boxname: msgsReference[i].folderName}); 88 } 120 var labelsIndex = returnLabels(msgsReference); 121 $.each(labelsIndex,function(index,e){ 122 updateLabelsColumn({msg_number: e.messageNumber, boxname: e.folderName,labels: e.labels, forceIcon: true}); 123 }); 89 124 } 90 125 … … 164 199 winElement.find('.edit').unbind("click").click(editLabel); 165 200 winElement.find('.close').click(deleteLabel); 166 167 draw_tree_labels();201 if( preferences['use_followupflags_and_labels'] == "1" ) 202 draw_tree_labels(); 168 203 var msgsReference = DataLayer.get('labeled', {filter: ['=', 'labelId', ''+labelEdited.id]}, true); 169 204 updateMessageLabels(msgsReference); … … 291 326 .find("li:first") 292 327 .fadeIn("slow").click(configureLabel); 293 294 draw_tree_labels();328 if( preferences['use_followupflags_and_labels'] == "1" ) 329 draw_tree_labels(); 295 330 296 331 $(".label-list-container .label-list li").not(".empty-item").click(function(){ -
branches/2.5/prototype/modules/mail/templates/attachment.ejs
r7697 r8232 1 <div id="fileupload_msg<%=data.ID%>" class="fileupload" style="margin : 5px 0px 0px 0px; padding-bottom : 5px;"> 2 <div class="button-files-upload"> 3 <button class="fileUploadButton">Anexar Arquivos</button> 4 <INPUT type="file" id="fileInput<%=data.ID%>" name="files[]" style="display:none;" multiple></INPUT> 1 <div id="fileupload_msg<%=data.ID%>" class="fileupload" style="margin : 15px 0px -5px -10px; padding-bottom : 5px;"> 2 <div class="row fileupload-buttonbar"> 3 <div class="button-files-upload"> 4 <<%= is_webkit ? 'button' : 'span style="height: 22px; cursor:pointer;"' %> class="fileinput-button button small"> 5 <span style="margin-top: 4px; cursor:pointer;"><i class="icon-plus icon-white"></i>Anexar arquivos</span> 6 <INPUT type="file" id="fileInput<%=data.ID%>" name="files[]" multiple></INPUT> 5 7 </<%= is_webkit ? 'button' : 'span' %>> 6 <button class="message-attach-link button -small">8 <button class="message-attach-link button small"> 7 9 <span>Anexar mensagens</span> 8 10 </button> 9 </div> 10 <div class="files-list"> 11 </div> 12 </div> 13 <br /> 14 <div class="files-list"> 11 15 <div class="attachments-list ui-corner-all" style="display:none;"></div> 12 16 </div> -
branches/2.5/prototype/modules/mail/templates/detailedfoldertree.ejs
r8113 r8232 5 5 Inbox: {name:'Caixa de Entrada', classe:'inbox'}, 6 6 }; 7 specialFolders[outboxfolder] = {name: 'Caixa de Sa ída', classe:'outbox'};7 specialFolders[outboxfolder] = {name: 'Caixa de Saï¿œda', classe:'outbox'}; 8 8 specialFolders[trashfolder] = {name:'Lixeira', classe:'trash'}; 9 9 specialFolders[draftsfolder] = {name:'Rascunhos', classe:'drafts'}; … … 26 26 %><li id="<%= array_trees[i].id %>" class="closed"><span class="folder <%= folder_class %>" title="<%= folder_name %>" style="text-align : left; position : static;"><%= folder_name %> 27 27 <% if(array_trees[i].messageCount.unseen > 0){ %> 28 <span style="text-align : left;">[<label id="dftree_<%= array_trees[i].id%>_unseen" class="folder_unseen" style="color : red; text-align : left;"><%= array_trees[i].messageCount.unseen %></label>]</span>29 28 <span class="message_unseen_count" style="text-align : left;">[<label id="dftree_<%= array_trees[i].id%>_unseen" class="folder_unseen" style="color : red; text-align : left;"><%= array_trees[i].messageCount.unseen %></label>]</span> 29 <% } %> 30 30 <% if(array_trees[i].children_unseen > 0){ %> 31 <span style="text-align : left;">[<label id="dftree_<%= array_trees[i].id%>_children_unseen" class="folder_ unseen" style="color : blue; text-align : left;"><%= array_trees[i].children_unseen %></label>]</span>31 <span style="text-align : left;">[<label id="dftree_<%= array_trees[i].id%>_children_unseen" class="folder_children_unseen" style="color : blue; text-align : left;"><%= array_trees[i].children_unseen %></label>]</span> 32 32 <% } %> 33 33 </span> … … 67 67 68 68 <%}%> 69 <% if(preferences['use_followupflags_and_labels'] == "1"){%> 69 70 <li><span class="folder head_folder all_accomp followup-messages">Para acompanhamento</span> 71 <%}%> 70 72 </li> 71 73 </ul>
Note: See TracChangeset
for help on using the changeset viewer.