From 42426121abf948918d18597c4224fac928b10737 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 9 Apr 2013 14:43:55 +0000 Subject: [PATCH] adapt AppJS usage in mail app, to get back to the state of usability before introducing it --- mail/inc/class.mail_bo.inc.php | 155 +++++++++++++++++++++++++++++- mail/inc/class.mail_hooks.inc.php | 2 +- mail/inc/class.mail_ui.inc.php | 68 ++++++------- mail/js/app.js | 37 +++---- mail/setup/etemplates.inc.php | 6 +- mail/templates/default/app.css | 15 +++ 6 files changed, 225 insertions(+), 58 deletions(-) diff --git a/mail/inc/class.mail_bo.inc.php b/mail/inc/class.mail_bo.inc.php index dab100ce75..2fb1dd715c 100644 --- a/mail/inc/class.mail_bo.inc.php +++ b/mail/inc/class.mail_bo.inc.php @@ -108,7 +108,9 @@ class mail_bo 'balance'=>1,//turn off tag-balancing (config['balance']=>0). That will not introduce any security risk; only standards-compliant tag nesting check/filtering will be turned off (basic tag-balance will remain; i.e., there won't be any unclosed tag, etc., after filtering) 'direct_list_nest' => 1, 'allow_for_inline' => array('table','div','li','p'),//block elements allowed for nesting when only inline is allowed; Example span does not allow block elements as table; table is the only element tested so far - 'tidy'=>1, + // tidy eats away even some wanted whitespace, so we switch it off; + // we used it for its compacting and beautifying capabilities, which resulted in better html for further processing + 'tidy'=>0, 'elements' => "* -script", 'deny_attribute' => 'on*', 'schemes'=>'href: file, ftp, http, https, mailto; src: cid, data, file, ftp, http, https; *:file, http, https, cid, src', @@ -820,7 +822,7 @@ class mail_bo $retval = true; if($folderToSelect && ($folderStatus = $this->getFolderStatus($folderToSelect,false,true))) { if ($folderStatus instanceof PEAR_Error) return false; - if (stripos(array2string($folderStatus['attributes']),'noselect')!==false) + if (!empty($folderStatus['attributes']) && stripos(array2string($folderStatus['attributes']),'noselect')!==false) { $retval = false; } @@ -2749,7 +2751,7 @@ class mail_bo /** * _getStructure - * fetc the structure of a mail, represented by uid + * fetch the structure of a mail, represented by uid * @param string/int $_uid the messageuid, * @param boolean $byUid=true, is the messageuid given by UID or ID * @param boolean $_ignoreCache=false, use or disregard cache, when fetching @@ -2779,6 +2781,74 @@ class mail_bo return $structure[$this->icServer->ImapServerId][$_folder][$_uid]; } + /** + * _getSubStructure + * fetch the substructure of a mail, by given structure and partid + * @param array $_structure='', if given use structure for parsing + * @param string/int $_partID the partid, + * @return array an structured array of information about the mail + */ + function _getSubStructure($_structure, $_partID) + { + $tempID = ''; + $structure = $_structure; + if (empty($_partID)) $_partID=1; + $imapPartIDs = explode('.',$_partID); + #error_log(print_r($structure,true)); + #error_log(print_r($_partID,true)); + + if($_partID != 1) { + foreach($imapPartIDs as $imapPartID) { + if(!empty($tempID)) { + $tempID .= '.'; + } + $tempID .= $imapPartID; + #error_log(print_r( "TEMPID: $tempID
",true)); + //_debug_array($structure); + if($structure->subParts[$tempID]->type == 'MESSAGE' && $structure->subParts[$tempID]->subType == 'RFC822' && + count($structure->subParts[$tempID]->subParts) == 1 && + $structure->subParts[$tempID]->subParts[$tempID]->type == 'MULTIPART' && + ($structure->subParts[$tempID]->subParts[$tempID]->subType == 'MIXED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'ALTERNATIVE' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'RELATED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'REPORT')) + { + $structure = $structure->subParts[$tempID]->subParts[$tempID]; + } else { + $structure = $structure->subParts[$tempID]; + } + } + } + + if($structure->partID != $_partID) { + foreach($imapPartIDs as $imapPartID) { + if(!empty($tempID)) { + $tempID .= '.'; + } + $tempID .= $imapPartID; + //print "TEMPID: $tempID
"; + //_debug_array($structure); + if($structure->subParts[$tempID]->type == 'MESSAGE' && $structure->subParts[$tempID]->subType == 'RFC822' && + count($structure->subParts[$tempID]->subParts) == 1 && + $structure->subParts[$tempID]->subParts[$tempID]->type == 'MULTIPART' && + ($structure->subParts[$tempID]->subParts[$tempID]->subType == 'MIXED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'ALTERNATIVE' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'RELATED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'REPORT')) { + $structure = $structure->subParts[$tempID]->subParts[$tempID]; + } else { + $structure = $structure->subParts[$tempID]; + } + } + if($structure->partID != $_partID) { + error_log(__METHOD__."(". __LINE__ .") partID's don't match"); + return false; + } + } + + return $structure; + } + /** * getMimePartCharset - fetches the charset mimepart if it exists * @param $_mimePartObject structure object @@ -3636,6 +3706,11 @@ class mail_bo //if ( $_uid && $partID) error_log(__METHOD__.__LINE__.array2string($structure).' Uid:'.$_uid.' PartID:'.$partID.' -> '.array2string($this->icServer->getParsedHeaders($_uid, true, $partID, true))); if(isset($structure->parameters['NAME'])) { + //error_log(__METHOD__.__LINE__.array2string(substr($structure->parameters['NAME'],0,strlen('data:')))); + if (!is_array($structure->parameters['NAME']) && substr($structure->parameters['NAME'],0,strlen('data:'))==='data:') { + $namecounter++; + return lang("unknown").$namecounter.($structure->subType ? ".".$structure->subType : ""); + } if (is_array($structure->parameters['NAME'])) $structure->parameters['NAME'] = implode(' ',$structure->parameters['NAME']); return rawurldecode(self::decode_header($structure->parameters['NAME'])); } elseif(isset($structure->dparameters['FILENAME'])) { @@ -3731,6 +3806,80 @@ class mail_bo } } + /** + * retrieve a attachment + * + * @param int _uid the uid of the message + * @param string _partID the id of the part, which holds the attachment + * @param int _winmail_nr winmail.dat attachment nr. + * + * @return array + */ + function getAttachment($_uid, $_partID, $_winmail_nr=0) + { + // parse message structure + $structure = $this->_getStructure($_uid, true); + if($_partID != '') { + $structure = $this->_getSubStructure($structure, $_partID); + } + $filename = $this->getFileNameFromStructure($structure, $_uid, $structure->partID); + $attachment = $this->icServer->getBodyPart($_uid, $_partID, true, true); + if (PEAR::isError($attachment)) + { + error_log(__METHOD__.__LINE__.' failed:'.$attachment->message); + return array('type' => 'text/plain', + 'filename' => 'error.txt', + 'attachment' =>__METHOD__.' failed:'.$attachment->message + ); + } + + if (PEAR::isError($attachment)) + { + error_log(__METHOD__.__LINE__.' failed:'.$attachment->message); + return array('type' => 'text/plain', + 'filename' => 'error.txt', + 'attachment' =>__METHOD__.' failed:'.$attachment->message + ); + } + switch ($structure->encoding) { + case 'BASE64': + // use imap_base64 to decode + $attachment = imap_base64($attachment); + break; + case 'QUOTED-PRINTABLE': + // use imap_qprint to decode + #$attachment = imap_qprint($attachment); + $attachment = quoted_printable_decode($attachment); + break; + default: + // it is either not encoded or we don't know about it + } + if ($structure->type === 'TEXT' && isset($structure->parameters['CHARSET']) && stripos('UTF-16',$structure->parameters['CHARSET'])!==false) + { + $attachment = translation::convert($attachment,$structure->parameters['CHARSET'],self::$displayCharset); + } + + $attachmentData = array( + 'type' => $structure->type .'/'. $structure->subType, + 'filename' => $filename, + 'attachment' => $attachment + ); + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($attachmentData['type']) == 'application/octet-stream') $attachmentData['type'] = mime_magic::filename2mime($attachmentData['filename']); + # if the attachment holds a winmail number and is a winmail.dat then we have to handle that. + if ( $filename == 'winmail.dat' && $_winmail_nr > 0 && + ( $wmattach = $this->decode_winmail( $_uid, $_partID, $_winmail_nr ) ) ) + { + $attachmentData = array( + 'type' => $wmattach['type'], + 'filename' => $wmattach['name'], + 'attachment' => $wmattach['attachment'], + ); + } + return $attachmentData; + } + + /** * functions to allow access to mails through other apps to fetch content * used in infolog, tracker diff --git a/mail/inc/class.mail_hooks.inc.php b/mail/inc/class.mail_hooks.inc.php index 2e5917629f..d3c94bf2db 100644 --- a/mail/inc/class.mail_hooks.inc.php +++ b/mail/inc/class.mail_hooks.inc.php @@ -69,7 +69,7 @@ class mail_hooks } /** - * Hook called by link-class to include calendar in the appregistry of the linkage + * Hook called by link-class to include mail in the appregistry of the linkage * * @param array/string $location location and other parameters (not used) * @return array with method-names diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php index 658b7aa00b..e21b9cf1f7 100644 --- a/mail/inc/class.mail_ui.inc.php +++ b/mail/inc/class.mail_ui.inc.php @@ -636,7 +636,7 @@ class mail_ui 'open' => array( 'caption' => lang('Open'), 'group' => ++$group, - 'onExecute' => 'javaScript:app.mail.open', + 'onExecute' => 'javaScript:app.mail.open', //dummy by nathan 'allowOnMultiple' => false, 'default' => true, ), @@ -644,14 +644,14 @@ class mail_ui 'caption' => 'Reply', 'icon' => 'mail_reply', 'group' => ++$group, - 'onExecute' => 'javaScript:mail_compose', + 'onExecute' => 'javaScript:app.mail.mail_compose', 'allowOnMultiple' => false, ), 'reply_all' => array( 'caption' => 'Reply All', 'icon' => 'mail_replyall', 'group' => $group, - 'onExecute' => 'javaScript:mail_compose', + 'onExecute' => 'javaScript:app.mail.mail_compose', 'allowOnMultiple' => false, ), 'forward' => array( @@ -663,14 +663,14 @@ class mail_ui 'caption' => 'forward inline', 'icon' => 'mail_forward', 'group' => $group, - 'onExecute' => 'javaScript:mail_compose', + 'onExecute' => 'javaScript:app.mail.mail_compose', 'allowOnMultiple' => false, ), 'forwardasattach' => array( 'caption' => 'forward as attachment', 'icon' => 'mail_forward', 'group' => $group, - 'onExecute' => 'javaScript:mail_compose', + 'onExecute' => 'javaScript:app.mail.mail_compose', ), ), ), @@ -678,14 +678,14 @@ class mail_ui 'caption' => 'Compose as new', 'icon' => 'new', 'group' => $group, - 'onExecute' => 'javaScript:mail_compose', + 'onExecute' => 'javaScript:app.mail.mail_compose', 'allowOnMultiple' => false, ), $moveaction => array( 'caption' => lang('Move selected to').': '.(isset($lastFolderUsedForMove['shortDisplayName'])?$lastFolderUsedForMove['shortDisplayName']:''), 'icon' => 'move', 'group' => ++$group, - 'onExecute' => 'javaScript:mail_move2folder', + 'onExecute' => 'javaScript:app.mail.mail_move2folder', 'allowOnMultiple' => true, ), 'infolog' => array( @@ -693,7 +693,7 @@ class mail_ui 'hint' => 'Save as InfoLog', 'icon' => 'infolog/navbar', 'group' => ++$group, - 'onExecute' => 'javaScript:mail_infolog', + 'onExecute' => 'javaScript:app.mail.mail_infolog', 'url' => 'menuaction=infolog.infolog_ui.import_mail', 'popup' => egw_link::get_registry('infolog', 'add_popup'), 'allowOnMultiple' => false, @@ -703,7 +703,7 @@ class mail_ui 'hint' => 'Save as ticket', 'group' => $group, 'icon' => 'tracker/navbar', - 'onExecute' => 'javaScript:mail_tracker', + 'onExecute' => 'javaScript:app.mail.mail_tracker', 'url' => 'menuaction=tracker.tracker_ui.import_mail', 'popup' => egw_link::get_registry('tracker', 'add_popup'), 'allowOnMultiple' => false, @@ -711,7 +711,7 @@ class mail_ui 'print' => array( 'caption' => 'Print', 'group' => ++$group, - 'onExecute' => 'javaScript:mail_print', + 'onExecute' => 'javaScript:app.mail.mail_print', 'allowOnMultiple' => false, ), 'save' => array( @@ -724,7 +724,7 @@ class mail_ui 'hint' => 'Save message to disk', 'group' => $group, 'icon' => 'fileexport', - 'onExecute' => 'javaScript:mail_save', + 'onExecute' => 'javaScript:app.mail.mail_save', 'allowOnMultiple' => false, ), 'save2filemanager' => array( @@ -732,7 +732,7 @@ class mail_ui 'hint' => 'Save message to filemanager', 'group' => $group, 'icon' => 'filemanager/navbar', - 'onExecute' => 'javaScript:mail_save2fm', + 'onExecute' => 'javaScript:app.mail.mail_save2fm', 'allowOnMultiple' => false, ), ), @@ -747,7 +747,7 @@ class mail_ui 'hint' => 'View header lines', 'group' => $group, 'icon' => 'kmmsgread', - 'onExecute' => 'javaScript:mail_header', + 'onExecute' => 'javaScript:app.mail.mail_header', 'allowOnMultiple' => false, ), 'mailsource' => array( @@ -755,7 +755,7 @@ class mail_ui 'hint' => 'View full Mail Source', 'group' => $group, 'icon' => 'fileexport', - 'onExecute' => 'javaScript:mail_mailsource', + 'onExecute' => 'javaScript:app.mail.mail_mailsource', 'allowOnMultiple' => false, ), ), @@ -777,27 +777,27 @@ class mail_ui 'label1' => array( 'caption' => "".lang('urgent')."", 'icon' => 'mail_label1', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'label2' => array( 'caption' => "".lang('job')."", 'icon' => 'mail_label2', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'label3' => array( 'caption' => "".lang('personal')."", 'icon' => 'mail_label3', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'label4' => array( 'caption' => "".lang('to do')."", 'icon' => 'mail_label4', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'label5' => array( 'caption' => "".lang('later')."", 'icon' => 'mail_label5', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), ), ), @@ -810,27 +810,27 @@ class mail_ui 'unlabel1' => array( 'caption' => "".lang('urgent')."", 'icon' => 'mail_unlabel1', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'unlabel2' => array( 'caption' => "".lang('job')."", 'icon' => 'mail_unlabel2', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'unlabel3' => array( 'caption' => "".lang('personal')."", 'icon' => 'mail_unlabel3', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'unlabel4' => array( 'caption' => "".lang('to do')."", 'icon' => 'mail_unlabel4', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), 'unlabel5' => array( 'caption' => "".lang('later')."", 'icon' => 'mail_unlabel5', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', ), ), ), @@ -838,7 +838,7 @@ class mail_ui 'group' => ++$group, 'caption' => 'Flagged', 'icon' => 'unread_flagged_small', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', //'disableClass' => 'flagged', //'enabled' => "javaScript:mail_disabledByClass", 'shortcut' => egw_keymanager::shortcut(egw_keymanager::F, true, true), @@ -847,7 +847,7 @@ class mail_ui 'group' => $group, 'caption' => 'Unflagged', 'icon' => 'read_flagged_small', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', //'enableClass' => 'flagged', //'enabled' => "javaScript:mail_enabledByClass", 'shortcut' => egw_keymanager::shortcut(egw_keymanager::U, true, true), @@ -856,7 +856,7 @@ class mail_ui 'group' => $group, 'caption' => 'Read', 'icon' => 'read_small', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', //'enableClass' => 'unseen', //'enabled' => "javaScript:mail_enabledByClass", ), @@ -864,7 +864,7 @@ class mail_ui 'group' => $group, 'caption' => 'Unread', 'icon' => 'unread_small', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', //'disableClass' => 'unseen', //'enabled' => "javaScript:mail_disabledByClass", ), @@ -872,7 +872,7 @@ class mail_ui 'group' => $group, 'caption' => 'Undelete', 'icon' => 'revert', - 'onExecute' => 'javaScript:mail_flag', + 'onExecute' => 'javaScript:app.mail.mail_flag', 'enableClass' => 'deleted', 'enabled' => "javaScript:mail_enabledByClass", ), @@ -882,12 +882,12 @@ class mail_ui 'caption' => 'Delete', 'hint' => $deleteOptions[$this->mail_bo->mailPreferences->preferences['deleteOptions']], 'group' => ++$group, - 'onExecute' => 'javaScript:mail_delete', + 'onExecute' => 'javaScript:app.mail.mail_delete', ), 'drag_mail' => array( 'dragType' => 'mail', 'type' => 'drag', - 'onExecute' => 'javaScript:mail_dragStart', + 'onExecute' => 'javaScript:app.mail.mail_dragStart', ), ); // save as tracker, save as infolog, as this are actions that are either available for all, or not, we do that for all and not via css-class disabling @@ -1510,7 +1510,7 @@ unset($query['actions']); */ function ajax_setFolderStatus($_folder) { - //error_log(__METHOD__.__LINE__.array2string($_folder)); + error_log(__METHOD__.__LINE__.array2string($_folder)); if ($_folder) { $del = $this->mail_bo->getHierarchyDelimiter(false); @@ -1533,11 +1533,11 @@ unset($query['actions']); } } } - //error_log(__METHOD__.__LINE__.array2string($oA)); + error_log(__METHOD__.__LINE__.array2string($oA)); if ($oA) { $response = egw_json_response::get(); - $response->call('mail_setFolderStatus',$oA,'mail'); + $response->call('app.mail.mail_setFolderStatus',$oA,'mail'); } } } diff --git a/mail/js/app.js b/mail/js/app.js index 50a1fe0545..fa9425693a 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -30,7 +30,7 @@ init: function() { this.mail_startTimerFolderStatusUpdate(this.mail_refreshTimeOut); //inital call of refresh folderstatus var self = this; - window.setTimeout(function() {self.mail_refreshFolderStatus();},1000); + window.setTimeout(function() {self.mail_refreshFolderStatus.apply(self);},1000); }, open: function(action, senders, ids) { @@ -54,7 +54,7 @@ mail_startTimerFolderStatusUpdate: function(_refreshTimeOut) { } if(_refreshTimeOut > 9999) {//we do not set _refreshTimeOut's less than 10 seconds var self = this; - this.mail_doTimedRefresh = window.setInterval(self.mail_refreshFolderStatus, _refreshTimeOut); + this.mail_doTimedRefresh = window.setInterval(function() {self.mail_refreshFolderStatus.apply(self)}, _refreshTimeOut); } }, @@ -92,12 +92,13 @@ mail_queueRefreshFolderList: function(_folders) // Copy idx onto the anonymous function scope var idx = this.mail_queuedFoldersIndex; + var self = this; window.setTimeout(function() { - if (idx == this.mail_queuedFoldersIndex) + if (idx == self.mail_queuedFoldersIndex) { //var folders = mail_queuedFolders.join(","); - this.mail_queuedFoldersIndex = 0; - this.mail_queuedFolders = []; + self.mail_queuedFoldersIndex = 0; + self.mail_queuedFolders = []; var request = new egw_json_request('mail.mail_ui.ajax_setFolderStatus',[_folders]); request.sendRequest(); @@ -134,7 +135,7 @@ mail_refreshMessageGrid: function() { app_refresh: function(_msg, _app, _id, _type) { var bufferExists = false; - window.clearInterval(this.doStatus); // whatever message was up to be activated + window.clearInterval(app.mail.doStatus); // whatever message was up to be activated //alert("app_refresh(\'"+_msg+"\',\'"+_app+"\',\'"+_id+"\',\'"+_type+"\')"); //myCurrentMsg = mail_getMsg(); //if (myCurrentMsg.length) { @@ -142,7 +143,7 @@ app_refresh: function(_msg, _app, _id, _type) myMessageBuffer = ""; //myCurrentMsg; bufferExists = true; //} - mail_setMsg('' +_msg+ ''); + app.mail.mail_setMsg('' +_msg+ ''); if (_app=='mail') { //we may want to trigger some actions, like modifying the grid, disable preview and stuff @@ -151,7 +152,7 @@ app_refresh: function(_msg, _app, _id, _type) } if (bufferExists) { - this.doStatus = window.setInterval("egw_appWindow('mail').mail_setMsg(myMessageBuffer);", 10000); + this.doStatus = window.setInterval("app.mail.mail_setMsg(myMessageBuffer);", 10000); } }, @@ -191,13 +192,13 @@ mail_setMsg: function(myMsg) */ mail_delete: function(_action,_elems) { - var msg = mail_getFormData(_elems); + var msg = this.mail_getFormData(_elems); //alert(_action.id+','+ msg); app_refresh(egw.lang('delete messages'), 'mail'); - mail_setRowClass(_elems,'deleted'); + this.mail_setRowClass(_elems,'deleted'); var request = new egw_json_request('mail.mail_ui.ajax_deleteMessages',[msg]); request.sendRequest(false); - mail_refreshMessageGrid() + this.mail_refreshMessageGrid() }, /** @@ -248,7 +249,7 @@ mail_changeProfile: function(folder,_widget) { // alert(folder); var request = new egw_json_request('mail.mail_ui.ajax_changeProfile',[folder]); request.sendRequest(false); - mail_refreshMessageGrid(); + this.mail_refreshMessageGrid(); return true; }, @@ -266,7 +267,7 @@ mail_changeFolder: function(folder,_widget) { { if (!(img.search(eval('/'+'thunderbird'+'/'))<0)) { - rv = mail_changeProfile(folder,_widget); + rv = this.mail_changeProfile(folder,_widget); if (rv) { return rv; @@ -313,9 +314,9 @@ mail_changeFolder: function(folder,_widget) { mail_flag: function(_action, _elems) { //alert(_action.id+' - '+_elems[0].id); - var msg = mail_getFormData(_elems); + var msg = this.mail_getFormData(_elems); // - mail_flagMessages(_action.id,msg); + this.mail_flagMessages(_action.id,msg); }, /** @@ -329,7 +330,7 @@ mail_flagMessages: function(_flag, _elems) app_refresh(egw.lang('flag messages'), 'mail'); var request = new egw_json_request('mail.mail_ui.ajax_flagMessages',[_flag, _elems]); request.sendRequest(false); - mail_refreshMessageGrid() + this.mail_refreshMessageGrid() }, /** @@ -354,7 +355,7 @@ mail_header: function(_action, _elems) var url = window.egw_webserverUrl+'/index.php?'; url += 'menuaction=mail.mail_ui.displayHeader'; // todo compose for Draft folder url += '&id='+_elems[0].id; - mail_displayHeaderLines(url); + this.mail_displayHeaderLines(url); }, /** @@ -370,7 +371,7 @@ mail_mailsource: function(_action, _elems) url += 'menuaction=mail.mail_ui.saveMessage'; // todo compose for Draft folder url += '&id='+_elems[0].id; url += '&location=display'; - mail_displayHeaderLines(url); + this.mail_displayHeaderLines(url); }, /** diff --git a/mail/setup/etemplates.inc.php b/mail/setup/etemplates.inc.php index d9026c742a..754eb1ded0 100644 --- a/mail/setup/etemplates.inc.php +++ b/mail/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * EGroupware - eTemplates for Application mail * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2013-02-20 14:05 + * generated by soetemplate::dump4setup() 2013-04-09 15:37 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package mail @@ -12,9 +12,11 @@ $templ_version=1; -$templ_data[] = array('name' => 'mail.index','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:3:{i:0;a:5:{s:7:"onclick";s:47:"mail_changeFolder(widget.event_args[0],widget);";s:4:"name";s:14:"nm[foldertree]";s:4:"type";s:4:"tree";s:11:"parent_node";s:11:"tree_target";s:11:"autoloading";s:28:"mail.mail_ui.ajax_foldertree";}i:1;a:2:{s:4:"type";s:4:"html";s:4:"name";s:3:"msg";}i:2;a:3:{s:4:"name";s:2:"nm";s:4:"size";s:15:"mail.index.rows";s:4:"type";s:9:"nextmatch";}}','size' => '','style' => '','modified' => '1360682502',); +$templ_data[] = array('name' => 'mail.index','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:4:{i:0;a:5:{s:7:"onclick";s:56:"app.mail.mail_changeFolder(widget.event_args[0],widget);";s:4:"name";s:14:"nm[foldertree]";s:4:"type";s:4:"tree";s:11:"parent_node";s:11:"tree_target";s:11:"autoloading";s:28:"mail.mail_ui.ajax_foldertree";}i:1;a:2:{s:4:"type";s:4:"html";s:4:"name";s:3:"msg";}i:2;a:3:{s:4:"name";s:2:"nm";s:4:"size";s:15:"mail.index.rows";s:4:"type";s:9:"nextmatch";}i:3;a:3:{s:4:"type";s:8:"template";s:4:"name";s:7:"preview";s:4:"size";s:12:"mail.preview";}}','size' => '','style' => '','modified' => '1365514624',); $templ_data[] = array('name' => 'mail.index.rows','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:9:{s:2:"c1";s:2:"th";s:1:"A";s:2:"25";s:1:"F";s:3:"120";s:1:"E";s:2:"95";s:2:"c2";s:16:"$row_cont[class]";s:1:"G";s:3:"120";s:1:"H";s:2:"50";s:1:"C";s:2:"20";s:1:"B";s:2:"20";}i:1;a:8:{s:1:"A";a:4:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:2:"ID";s:4:"name";s:3:"uid";s:8:"readonly";s:1:"1";}s:1:"B";a:4:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:6:"status";s:5:"label";s:3:"St.";s:4:"help";s:6:"Status";}s:1:"C";a:4:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:3:"...";s:4:"name";s:11:"attachments";s:4:"help";s:16:"attachments, ...";}s:1:"D";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"subject";s:5:"label";s:7:"subject";}s:1:"E";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"date";s:4:"name";s:4:"date";s:5:"align";s:6:"center";}s:1:"F";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:2:"to";s:4:"name";s:9:"toaddress";}s:1:"G";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"from";s:4:"name";s:11:"fromaddress";}s:1:"H";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"size";s:4:"name";s:4:"size";s:5:"align";s:6:"center";}}i:2;a:8:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"name";s:11:"${row}[uid]";s:8:"readonly";s:1:"1";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:4:"span";s:12:"1,status_img";}s:1:"C";a:2:{s:4:"type";s:4:"html";s:4:"name";s:19:"${row}[attachments]";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:4:"name";s:15:"${row}[subject]";}s:1:"E";a:4:{s:4:"type";s:15:"date-time_today";s:4:"name";s:12:"${row}[date]";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";}s:1:"F";a:3:{s:4:"type";s:9:"url-email";s:4:"name";s:17:"${row}[toaddress]";s:8:"readonly";s:1:"1";}s:1:"G";a:3:{s:4:"type";s:9:"url-email";s:4:"name";s:19:"${row}[fromaddress]";s:8:"readonly";s:1:"1";}s:1:"H";a:5:{s:4:"type";s:8:"vfs-size";s:4:"name";s:12:"${row}[size]";s:7:"no_lang";s:1:"1";s:8:"readonly";s:1:"1";s:5:"align";s:5:"right";}}}s:4:"rows";i:2;s:4:"cols";i:8;}}','size' => '','style' => '','modified' => '1360252030',); +$templ_data[] = array('name' => 'mail.preview','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"subject";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:7:"subject";}}}s:4:"rows";i:1;s:4:"cols";i:2;}}','size' => '','style' => '','modified' => '1363178999',); + $templ_data[] = array('name' => 'mail.TestConnection','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;}}','size' => '','style' => '','modified' => '1360585356',); diff --git a/mail/templates/default/app.css b/mail/templates/default/app.css index 7b89b24616..13507e28e0 100644 --- a/mail/templates/default/app.css +++ b/mail/templates/default/app.css @@ -268,6 +268,15 @@ pre { .dtree table, .dtree tr, .dtree td { border: none; } +.dtree table { + overflow: hidden; + width: 100%; + display: table-row; +} +.dtree tbody, .dtree tr, .dtree td, .dtree span { + width: 100%; + overflow: hidden; +} /* influence the tree display and scrolling behavior */ @@ -282,3 +291,9 @@ pre { overflow-y: auto; z-index:100; } +/* + we need the the image displayed with our buttons on the left side +*/ +input[type=button] { + background-position: left; +}