several stuff towards a compose window; a testhtmlarea template to test/figure out issues regarding disabled

This commit is contained in:
Klaus Leithoff 2013-08-21 10:47:20 +00:00
parent 1d9589db99
commit 102bc9d6a2
10 changed files with 664 additions and 199 deletions

View File

@ -213,7 +213,7 @@ class mail_bo
else else
{ {
// make sure the prefs are up to date for the profile to load // make sure the prefs are up to date for the profile to load
$loadfailed = false; $loadfailed = $alreadytriedreloading = false;
self::$instances[$_profileID]->mailPreferences = self::$instances[$_profileID]->bopreferences->getPreferences(true,$_profileID); self::$instances[$_profileID]->mailPreferences = self::$instances[$_profileID]->bopreferences->getPreferences(true,$_profileID);
//error_log(__METHOD__.__LINE__." ReRead the Prefs for ProfileID ".$_profileID.' called from:'.function_backtrace()); //error_log(__METHOD__.__LINE__." ReRead the Prefs for ProfileID ".$_profileID.' called from:'.function_backtrace());
if (self::$instances[$_profileID]->mailPreferences) if (self::$instances[$_profileID]->mailPreferences)
@ -228,13 +228,29 @@ class mail_bo
} }
else else
{ {
$loadfailed=true; // first try reloading without restore
if ($_restoreSession==true) self::$instances[$_profileID] = new mail_bo('utf-8',false,$_profileID);
if (!self::$instances[$_profileID]->mailPreferences) {
if (self::$debug) error_log(__METHOD__.__LINE__.' something wrong:'.array2string($_restoreSession).' mailPreferences could not be loaded!');
$loadfailed=$alreadytriedreloading=true;
}
}
if ($_profileID>0 && empty(self::$instances[$_profileID]->icServer->host)&&$alreadytriedreloading==false)
{
if ($_restoreSession==true) self::$instances[$_profileID] = new mail_bo('utf-8',false,$_profileID);
if (empty(self::$instances[$_profileID]->icServer->host))
{
if (self::$debug) error_log(__METHOD__.__LINE__.' something critically wrong for '.$_profileID.' RestoreSession:'.array2string($_restoreSession).'->'.array2string(self::$instances[$_profileID]->icServer).' No Server host set!');
$loadfailed=$alreadytriedreloading=true;
}
} }
if ($loadfailed) if ($loadfailed)
{ {
error_log(__METHOD__.__LINE__." ReRead of the Prefs for ProfileID ".$_profileID.' failed for icServer; trigger new instance. called from:'.function_backtrace()); $newprofileID = ($alreadytriedreloading ? emailadmin_bo::getUserDefaultProfileID():$_profileID);
// restore session seems to provide an incomplete session if ($alreadytriedreloading) error_log(__METHOD__.__LINE__." Loading the Profile for ProfileID ".$_profileID.' failed for icServer; trigger new instance for Default-Profile '.$newprofileID.'. called from:'.function_backtrace());
self::$instances[$_profileID] = new mail_bo('utf-8',false,$_profileID); // try loading the default profile for the user
self::$instances[$newprofileID] = new mail_bo('utf-8',false,$newprofileID);
$_profileID = $newprofileID;
} }
} }
self::$instances[$_profileID]->profileID = $_profileID; self::$instances[$_profileID]->profileID = $_profileID;
@ -571,7 +587,7 @@ class mail_bo
*/ */
function closeConnection() { function closeConnection() {
//if ($icServer->_connected) error_log(__METHOD__.__LINE__.' disconnect from Server'); //if ($icServer->_connected) error_log(__METHOD__.__LINE__.' disconnect from Server');
if ($icServer->_connected) $this->icServer->disconnect(); if ($this->icServer->_connected) $this->icServer->disconnect();
} }
/** /**
@ -1588,8 +1604,18 @@ class mail_bo
{ {
$rfcAddr = imap_rfc822_parse_adrlist($_string,''); $rfcAddr = imap_rfc822_parse_adrlist($_string,'');
if (!isset(self::$idna2)) self::$idna2 = new egw_idna; if (!isset(self::$idna2)) self::$idna2 = new egw_idna;
$stringA = array();
//$_string = str_replace($rfcAddr[0]->host,self::$idna2->decode($rfcAddr[0]->host),$_string); //$_string = str_replace($rfcAddr[0]->host,self::$idna2->decode($rfcAddr[0]->host),$_string);
$_string = imap_rfc822_write_address($rfcAddr[0]->mailbox,self::$idna2->decode($rfcAddr[0]->host),$rfcAddr[0]->personal); foreach ((array)$rfcAddr as $_rfcAddr)
{
if ($_rfcAddr->host=='.SYNTAX-ERROR.')
{
$stringA = array();
break; // skip idna conversion if we encounter an error here
}
$stringA[] = imap_rfc822_write_address($_rfcAddr->mailbox,self::$idna2->decode($_rfcAddr->host),$_rfcAddr->personal);
}
if (!empty($stringA)) $_string = implode(',',$stringA);
} }
if ($_tryIDNConversion==='FORCE') if ($_tryIDNConversion==='FORCE')
{ {
@ -3956,6 +3982,11 @@ class mail_bo
error_log(__METHOD__.__LINE__.array2string($retValue->message)); error_log(__METHOD__.__LINE__.array2string($retValue->message));
$retValue = null; $retValue = null;
} }
// if SUBJECT is an array, use thelast one, as we assume something with the unfolding for the subject did not work
if (is_array($retValue['SUBJECT']))
{
$retValue['SUBJECT'] = $retValue['SUBJECT'][count($retValue['SUBJECT'])-1];
}
return ($decode ? self::decode_header($retValue,true):$retValue); return ($decode ? self::decode_header($retValue,true):$retValue);
} }
@ -4271,7 +4302,8 @@ class mail_bo
//error_log(__METHOD__.__LINE__.array2string(substr($structure->parameters['NAME'],0,strlen('data:')))); //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:') { if (!is_array($structure->parameters['NAME']) && substr($structure->parameters['NAME'],0,strlen('data:'))==='data:') {
$namecounter++; $namecounter++;
return lang("unknown").$namecounter.($structure->subType ? ".".$structure->subType : ""); $ext = mime_magic::mime2ext($structure->Type.'/'.$structure->subType);
return lang("unknown").$namecounter.($ext?$ext:($structure->subType ? ".".$structure->subType : ""));
} }
if (is_array($structure->parameters['NAME'])) $structure->parameters['NAME'] = implode(' ',$structure->parameters['NAME']); if (is_array($structure->parameters['NAME'])) $structure->parameters['NAME'] = implode(' ',$structure->parameters['NAME']);
return rawurldecode(self::decode_header($structure->parameters['NAME'])); return rawurldecode(self::decode_header($structure->parameters['NAME']));
@ -4321,7 +4353,8 @@ class mail_bo
} }
} }
$namecounter++; $namecounter++;
return lang("unknown").$namecounter.($structure->subType ? ".".$structure->subType : ""); $ext = mime_magic::mime2ext($structure->Type.'/'.$structure->subType);
return lang("unknown").$namecounter.($ext?$ext:($structure->subType ? ".".$structure->subType : ""));
} }
} }
@ -4420,7 +4453,8 @@ class mail_bo
{ {
$attachment = translation::convert($attachment,$structure->parameters['CHARSET'],self::$displayCharset); $attachment = translation::convert($attachment,$structure->parameters['CHARSET'],self::$displayCharset);
} }
$ext = mime_magic::mime2ext($structure->type .'/'. $structure->subType);
if ($ext && stripos($filename,'.')===false && stripos($filename,$ext)===false) $filename = trim($filename).'.'.$ext;
$attachmentData = array( $attachmentData = array(
'type' => $structure->type .'/'. $structure->subType, 'type' => $structure->type .'/'. $structure->subType,
'filename' => $filename, 'filename' => $filename,
@ -4432,6 +4466,8 @@ class mail_bo
if ( $filename == 'winmail.dat' && $_winmail_nr > 0 && if ( $filename == 'winmail.dat' && $_winmail_nr > 0 &&
( $wmattach = $this->decode_winmail( $_uid, $_partID, $_winmail_nr ) ) ) ( $wmattach = $this->decode_winmail( $_uid, $_partID, $_winmail_nr ) ) )
{ {
$ext = mime_magic::mime2ext($wmattach['type']);
if ($ext && stripos($wmattach['name'],'.')===false && stripos($wmattach['name'],$ext)===false) $wmattach['name'] = trim($wmattach['name']).'.'.$ext;
$attachmentData = array( $attachmentData = array(
'type' => $wmattach['type'], 'type' => $wmattach['type'],
'filename' => $wmattach['name'], 'filename' => $wmattach['name'],
@ -4670,13 +4706,14 @@ class mail_bo
/** /**
* createHeaderInfoSection - creates a textual headersection from headerobject * createHeaderInfoSection - creates a textual headersection from headerobject
* @param array header headerarray may contain SUBJECT,FROM,SENDER,TO,CC,BCC,DATE,PRIORITY,IMPORTANCE * @param array header headerarray may contain SUBJECT,FROM,SENDER,TO,CC,BCC,DATE,PRIORITY,IMPORTANCE
* @param string headline Text tom use for headline * @param string headline Text tom use for headline, if SUPPRESS, supress headline and footerline
* @param bool createHTML do it with HTML breaks * @param bool createHTML do it with HTML breaks
* @return string a preformatted string with the information of the header worked into it * @return string a preformatted string with the information of the header worked into it
*/ */
static function createHeaderInfoSection($header,$headline='', $createHTML = false) static function createHeaderInfoSection($header,$headline='', $createHTML = false)
{ {
$headdata = null; $headdata = null;
//error_log(__METHOD__.__LINE__.array2string($header).function_backtrace());
if ($header['SUBJECT']) $headdata = lang('subject').': '.$header['SUBJECT'].($createHTML?"<br />":"\n"); if ($header['SUBJECT']) $headdata = lang('subject').': '.$header['SUBJECT'].($createHTML?"<br />":"\n");
if ($header['FROM']) $headdata .= lang('from').': '.self::convertAddressArrayToString($header['FROM'], $createHTML).($createHTML?"<br />":"\n"); if ($header['FROM']) $headdata .= lang('from').': '.self::convertAddressArrayToString($header['FROM'], $createHTML).($createHTML?"<br />":"\n");
if ($header['SENDER']) $headdata .= lang('sender').': '.self::convertAddressArrayToString($header['SENDER'], $createHTML).($createHTML?"<br />":"\n"); if ($header['SENDER']) $headdata .= lang('sender').': '.self::convertAddressArrayToString($header['SENDER'], $createHTML).($createHTML?"<br />":"\n");
@ -4689,13 +4726,13 @@ class mail_bo
//if ($mailcontent['headers']['ORGANIZATION']) $headdata .= lang('organization').': '.$mailcontent['headers']['ORGANIZATION']."\ //if ($mailcontent['headers']['ORGANIZATION']) $headdata .= lang('organization').': '.$mailcontent['headers']['ORGANIZATION']."\
if (!empty($headdata)) if (!empty($headdata))
{ {
if (!empty($headline)) $headdata = "---------------------------- $headline ----------------------------".($createHTML?"<br />":"\n").$headdata; if (!empty($headline) && $headline != 'SUPPRESS') $headdata = "---------------------------- $headline ----------------------------".($createHTML?"<br />":"\n").$headdata;
if (empty($headline)) $headdata = "--------------------------------------------------------".($createHTML?"<br />":"\n").$headdata; if (empty($headline)) $headdata = ($headline != 'SUPPRESS'?"--------------------------------------------------------".($createHTML?"<br />":"\n"):'').$headdata;
$headdata .= "--------------------------------------------------------".($createHTML?"<br />":"\n"); $headdata .= ($headline != 'SUPPRESS'?"--------------------------------------------------------".($createHTML?"<br />":"\n"):'');
} }
else else
{ {
$headdata = "--------------------------------------------------------".($createHTML?"<br />":"\n"); $headdata = ($headline != 'SUPPRESS'?"--------------------------------------------------------".($createHTML?"<br />":"\n"):'');
} }
return $headdata; return $headdata;
} }
@ -4753,6 +4790,26 @@ class mail_bo
return $returnAddr; return $returnAddr;
} }
/**
* Merges a given content with contact data
*
* @param string $content
* @param array $ids array with contact id(s)
* @param string &$err error-message on error
* @return string/boolean merged content or false on error
*/
function merge($content,$ids,$mimetype='')
{
$contacts = new addressbook_bo();
$mergeobj = new addressbook_merge();
if (empty($mimetype)) $mimetype = (strlen(strip_tags($content)) == strlen($content) ?'text/plain':'text/html');
$rv = $mergeobj->merge_string($content,$ids,$err,$mimetype, array(), self::$displayCharset);
if (empty($rv) && !empty($content) && !empty($err)) $rv = $content;
if (!empty($err) && !empty($content) && !empty($ids)) error_log(__METHOD__.__LINE__.' Merge failed for Ids:'.array2string($ids).' ContentType:'.$mimetype.' Content:'.$content.' Reason:'.array2string($err));
return $rv;
}
/** /**
* Hook stuff * Hook stuff
*/ */

View File

@ -23,6 +23,7 @@ class mail_compose
( (
'action' => True, 'action' => True,
'compose' => True, 'compose' => True,
'testhtmlarea' => True,
'composeFromDraft' => True, 'composeFromDraft' => True,
'getAttachment' => True, 'getAttachment' => True,
'fileSelector' => True, 'fileSelector' => True,
@ -198,7 +199,7 @@ class mail_compose
if (!$messageUid) { if (!$messageUid) {
print "<script type=\"text/javascript\">alert('".lang("Error: Could not save Message as Draft")." ".lang("Trying to recover from session data")."');</script>"; print "<script type=\"text/javascript\">alert('".lang("Error: Could not save Message as Draft")." ".lang("Trying to recover from session data")."');</script>";
//try to reopen the mail from session data //try to reopen the mail from session data
$this->compose('to',true); $this->compose(null,null,'to',true);
return; return;
} }
// saving as draft, does not mean closing the message // saving as draft, does not mean closing the message
@ -211,7 +212,7 @@ class mail_compose
{ {
//error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.' in folder:'.$folder); //error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.' in folder:'.$folder);
$uicompose->bocompose->getDraftData($uicompose->mail_bo->icServer, $folder, $messageUid); $uicompose->bocompose->getDraftData($uicompose->mail_bo->icServer, $folder, $messageUid);
$uicompose->compose('to',true); $uicompose->compose(null,null,'to',true);
return; return;
} }
} else { } else {
@ -258,25 +259,29 @@ class mail_compose
$this->preferencesArray['message_forwarding'] = $buff; $this->preferencesArray['message_forwarding'] = $buff;
} }
} }
$this->compose($_focusElement); $this->compose(null,null,$_focusElement);
} }
/** /**
* function compose * function compose
* this function is used to fill the compose dialog with the content provided by session data * this function is used to fill the compose dialog with the content provided by session data
* *
* @var content array the etemplate content array
* @var msg string a possible message to be passed and displayed to the userinterface
* @var _focusElement varchar subject, to, body supported * @var _focusElement varchar subject, to, body supported
* @var suppressSigOnTop boolean * @var suppressSigOnTop boolean
* @var isReply boolean * @var isReply boolean
*/ */
function compose($_focusElement='to',$suppressSigOnTop=false, $isReply=false) function compose(array $content=null,$msg=null, $_focusElement='to',$suppressSigOnTop=false, $isReply=false)
{ {
//error_log(__METHOD__.__LINE__.array2string($_REQUEST)); //error_log(__METHOD__.__LINE__.array2string($_REQUEST));
error_log(__METHOD__.__LINE__.array2string($content));
if (isset($_GET['reply_id'])) $replyID = $_GET['reply_id']; if (isset($_GET['reply_id'])) $replyID = $_GET['reply_id'];
// read the data from session // read the data from session
// all values are empty for a new compose window // all values are empty for a new compose window
$insertSigOnTop = false; $insertSigOnTop = false;
$sessionData = $this->getSessionData(); $sessionData = /*$content; // */$this->getSessionData();
$alwaysAttachVCardAtCompose = false; // we use this to eliminate double attachments, if users VCard is already present/attached $alwaysAttachVCardAtCompose = false; // we use this to eliminate double attachments, if users VCard is already present/attached
if ( isset($GLOBALS['egw_info']['apps']['stylite']) && (isset($this->preferencesArray['attachVCardAtCompose']) && if ( isset($GLOBALS['egw_info']['apps']['stylite']) && (isset($this->preferencesArray['attachVCardAtCompose']) &&
$this->preferencesArray['attachVCardAtCompose'])) $this->preferencesArray['attachVCardAtCompose']))
@ -493,9 +498,6 @@ class mail_compose
if ($_REQUEST['preset'][$name]) $sessionData[$name] = $_REQUEST['preset'][$name]; if ($_REQUEST['preset'][$name]) $sessionData[$name] = $_REQUEST['preset'][$name];
} }
} }
$etpl = new etemplate_new('mail.compose');
$content = array();
_debug_array($sessionData);
// is the to address set already? // is the to address set already?
if (!empty($_REQUEST['send_to'])) if (!empty($_REQUEST['send_to']))
{ {
@ -591,18 +593,6 @@ class mail_compose
if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['identity'])) $presetId = (int)$sessionData['identity']; if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['identity'])) $presetId = (int)$sessionData['identity'];
/* /*
$this->t->set_file(array("composeForm" => "composeForm.tpl"));
$this->t->set_block('composeForm','header','header');
$this->t->set_block('composeForm','body_input');
$this->t->set_block('composeForm','attachment','attachment');
$this->t->set_block('composeForm','attachment_row','attachment_row');
$this->t->set_block('composeForm','attachment_row_bold');
$this->t->set_block('composeForm','destination_row');
$this->t->set_block('composeForm','simple_text');
$this->translate();
// store the selected Signature
$this->t->set_var("mySigID",($presetSig ? $presetSig : $sessionData['signatureID']));
if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { if ($GLOBALS['egw_info']['user']['apps']['addressbook']) {
$this->t->set_var("link_addressbook",egw::link('/index.php',array( $this->t->set_var("link_addressbook",egw::link('/index.php',array(
@ -669,101 +659,11 @@ class mail_compose
$this->t->set_var('errorInfo','&nbsp;'); $this->t->set_var('errorInfo','&nbsp;');
} }
*/ */
// header
$allIdentities = $this->mailPreferences->getIdentity();
unset($allIdentities[0]);
//_debug_array($allIdentities);
if (is_null(mail_bo::$mailConfig)) mail_bo::$mailConfig = config::read('mail');
// not set? -> use default, means full display of all available data
if (!isset(mail_bo::$mailConfig['how2displayIdentities'])) mail_bo::$mailConfig['how2displayIdentities'] ='';
$globalIds = 0;
$defaultIds = array();
foreach($allIdentities as $key => $singleIdentity) {
if ($singleIdentity->id<0){ $globalIds++; }/*else{ unset($allIdentities[$key]);}*/
// there could be up to 2 default IDS. the activeProfile and another on marking the desired Identity to choose
if(!empty($singleIdentity->default) && $singleIdentity->default==1) $defaultIds[$singleIdentity->id] = $singleIdentity->id;
}
//error_log(__METHOD__.__LINE__.' Identities regarded/marked as default:'.array2string($defaultIds). ' MailProfileActive:'.$this->mail_bo->profileID);
// if there are 2 defaultIDs, its most likely, that the user choose to set
// the one not being the activeServerProfile to be his default Identity
if (count($defaultIds)>1) unset($defaultIds[$this->mail_bo->profileID]);
$defaultIdentity = 0;
$identities = array();
foreach($allIdentities as $key => $singleIdentity) {
//$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>';
$iS = mail_bo::generateIdentityString($singleIdentity);
if (mail_bo::$mailConfig['how2displayIdentities']=='' || count($allIdentities) ==1 || count($allIdentities) ==$globalIds)
{
$id_prepend ='';
}
else
{
$id_prepend = '('.$singleIdentity->id.') ';
}
//if ($singleIdentity->default) error_log(__METHOD__.__LINE__.':'.$presetId.'->'.$key.'('.$singleIdentity->id.')'.'#'.$iS.'#');
if (array_search($id_prepend.$iS,$identities)===false) $identities[$singleIdentity->id] = $id_prepend.$iS;
if(in_array($singleIdentity->id,$defaultIds) && $defaultIdentity==0)
{
//_debug_array($singleIdentity);
$defaultIdentity = $singleIdentity->id;
//$defaultIdentity = $key;
$sessionData['signatureID'] = (!empty($singleIdentity->signature) ? $singleIdentity->signature : $sessionData['signatureID']);
}
}
$selectFrom = html::select('identity', (!empty($presetId) ? $presetId : $defaultIdentity), $identities, true, "style='width:100%;' onchange='changeIdentity(this);'");
/* /*
$this->t->set_var('select_from', $selectFrom); $this->t->set_var('select_from', $selectFrom);
//error_log(__METHOD__.__LINE__.' DefaultIdentity:'.array2string($identities[($presetId ? $presetId : $defaultIdentity)])); //error_log(__METHOD__.__LINE__.' DefaultIdentity:'.array2string($identities[($presetId ? $presetId : $defaultIdentity)]));
// navbar(, kind of) // navbar(, kind of)
$this->t->set_var('img_clear_left', common::image('felamimail','clear_left'));
$this->t->set_var('img_fileopen', common::image('phpgwapi','fileopen'));
$this->t->set_var('img_mail_send', common::image('felamimail','mail_send'));
$this->t->set_var('img_attach_file', common::image('felamimail','attach'));
$this->t->set_var('ajax-loader', common::image('felamimail','ajax-loader'));
$this->t->set_var('img_fileexport', common::image('felamimail','fileexport'));
// prepare print url/button
$this->t->set_var('img_print_it', common::image('felamimail','print'));
$this->t->set_var('lang_print_it', lang('print it'));
$this->t->set_var('print_it', $printURL);
*/
// from, to, cc, replyto
$destinationRows = 0;
foreach(array('to','cc','bcc','replyto','folder') as $destination) {
foreach((array)$sessionData[$destination] as $key => $value) {
if ($value=="NIL@NIL") continue;
if ($destination=='replyto' && str_replace('"','',$value) == str_replace('"','',$identities[($presetId ? $presetId : $defaultIdentity)])) continue;
//error_log(__METHOD__.__LINE__.array2string(array('key'=>$key,'value'=>$value)));
$selectDestination = html::select('destination[]', $destination, $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
//$this->t->set_var('select_destination', $selectDestination);
$value = htmlspecialchars_decode($value,ENT_COMPAT);
$value = str_replace("\"\"",'"',$value);
$address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($value):$value), '');
foreach((array)$address_array as $addressObject) {
if ($addressObject->host == '.SYNTAX-ERROR.') continue;
$address = imap_rfc822_write_address($addressObject->mailbox,$addressObject->host,$addressObject->personal);
$address = mail_bo::htmlentities($address, $this->displayCharset);
//$this->t->set_var('address', ($destination=='folder'?$value:$address));
//$this->t->parse('destinationRows','destination_row',True);
$destinationRows++;
}
}
}
while($destinationRows < 3) {
// and always add one empty row
$selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
/*
$this->t->set_var('select_destination', $selectDestination);
$this->t->set_var('address', '');
$this->t->parse('destinationRows','destination_row',True);
*/
$destinationRows++;
}
// and always add one empty row
$selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
/*
$this->t->set_var('select_destination', $selectDestination);
$this->t->set_var('address', '');
$this->t->parse('destinationRows','destination_row',True);
*/ */
// handle subject // handle subject
$subject = mail_bo::htmlentities($sessionData['subject'],$this->displayCharset); $subject = mail_bo::htmlentities($sessionData['subject'],$this->displayCharset);
@ -798,11 +698,61 @@ class mail_compose
$this->t->set_var('lang_no_recipient',lang('No recipient address given!')); $this->t->set_var('lang_no_recipient',lang('No recipient address given!'));
$this->t->set_var('lang_no_subject',lang('No subject given!')); $this->t->set_var('lang_no_subject',lang('No subject given!'));
$this->t->set_var('lang_infolog_tracker_not_both',lang("You can either choose to save as infolog OR tracker, not both.")); $this->t->set_var('lang_infolog_tracker_not_both',lang("You can either choose to save as infolog OR tracker, not both."));
$this->t->pparse("out","header");
*/ */
// prepare signatures, the selected sig may be used on top of the body // prepare signatures, the selected sig may be used on top of the body
require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); //identities and signature stuff
$boSignatures = new felamimail_bosignatures(); $allIdentities = $this->preferences->getIdentity();
unset($allIdentities[0]);
//_debug_array($allIdentities);
if (is_null(mail_bo::$mailConfig)) mail_bo::$mailConfig = config::read('mail');
// not set? -> use default, means full display of all available data
if (!isset(mail_bo::$mailConfig['how2displayIdentities'])) mail_bo::$mailConfig['how2displayIdentities'] ='';
$globalIds = 0;
$defaultIds = array();
foreach($allIdentities as $key => $singleIdentity) {
if ($singleIdentity->id<0){ $globalIds++; }/*else{ unset($allIdentities[$key]);}*/
// there could be up to 2 default IDS. the activeProfile and another on marking the desired Identity to choose
if(!empty($singleIdentity->default) && $singleIdentity->default==1)
{
$defaultIds[$singleIdentity->id] = $singleIdentity->id;
$selectedSender = mail_bo::generateIdentityString($singleIdentity);
}
}
//error_log(__METHOD__.__LINE__.' Identities regarded/marked as default:'.array2string($defaultIds). ' MailProfileActive:'.$this->mail_bo->profileID);
// if there are 2 defaultIDs, its most likely, that the user choose to set
// the one not being the activeServerProfile to be his default Identity
if (count($defaultIds)>1) unset($defaultIds[$this->mail_bo->profileID]);
$defaultIdentity = 0;
$identities = array();
foreach($allIdentities as $key => $singleIdentity) {
//$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>';
$iS = mail_bo::generateIdentityString($singleIdentity);
$shortIDString = trim(mail_bo::generateIdentityString($singleIdentity,false));
if (mail_bo::$mailConfig['how2displayIdentities']=='' || count($allIdentities) ==1 || count($allIdentities) ==$globalIds)
{
$id_prepend ='';
}
else
{
$id_prepend = '('.$singleIdentity->id.') ';
}
//if ($singleIdentity->default) error_log(__METHOD__.__LINE__.':'.$presetId.'->'.$key.'('.$singleIdentity->id.')'.'#'.$iS.'#');
if (array_search($id_prepend.$iS,$identities)===false)
{
$identities[$singleIdentity->id] = $id_prepend.$iS;
$sel_options['SENDER'][$iS] = $id_prepend.$iS;
}
if(in_array($singleIdentity->id,$defaultIds) && $defaultIdentity==0)
{
//_debug_array($singleIdentity);
$defaultIdentity = $singleIdentity->id;
//$defaultIdentity = $key;
$sessionData['signatureID'] = (!empty($singleIdentity->signature) ? $singleIdentity->signature : $sessionData['signatureID']);
}
}
// fetch the signature, prepare the select box, ...
$boSignatures = new mail_signatures();
$signatures = $boSignatures->getListOfSignatures(); $signatures = $boSignatures->getListOfSignatures();
if (empty($sessionData['signatureID'])) { if (empty($sessionData['signatureID'])) {
@ -883,6 +833,7 @@ class mail_compose
$sessionData['body'] = ($font_span?$font_span:'&nbsp;').$sessionData['body']; $sessionData['body'] = ($font_span?$font_span:'&nbsp;').$sessionData['body'];
} }
//error_log(__METHOD__.__LINE__.$sessionData['body']); //error_log(__METHOD__.__LINE__.$sessionData['body']);
// prepare body // prepare body
// in a way, this tests if we are having real utf-8 (the displayCharset) by now; we should if charsets reported (or detected) are correct // in a way, this tests if we are having real utf-8 (the displayCharset) by now; we should if charsets reported (or detected) are correct
if (strtoupper($this->displayCharset) == 'UTF-8') if (strtoupper($this->displayCharset) == 'UTF-8')
@ -922,32 +873,12 @@ class mail_compose
} else { } else {
$border="1px solid gray; margin:1px"; $border="1px solid gray; margin:1px";
// initalize the CKEditor Object to enable switching back and force // initalize the CKEditor Object to enable switching back and force
$editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'500px','99%',false,$border); //$editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'500px','99%',false,$border);
/*
$this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'));
$this->t->set_var('mimeType', 'text');
*/
$ishtml=0; $ishtml=0;
} }
$bostationery = new felamimail_bostationery();
$selectStationeries = array(
'0' => lang('no stationery')
);
$showStationaries = false;
$validStationaries = $bostationery->get_valid_templates();
if (is_array($validStationaries) && count($validStationaries)>0)
{
$showStationaries = true;
$selectStationeries += $validStationaries;
}
// if ID of signature Select Box is set, we allow for changing the sig onChange of the signatueSelect
$selectBoxSignature = html::select('signatureID', ($presetSig ? $presetSig : $sessionData['signatureID']), $selectSignatures, true, ($insertSigOnTop?"id='signatureID'":"")." style='width: 35%;' onchange='fm_compose_changeInputType(this)'");
$selectBoxStationery = html::select('stationeryID', ($presetStationery ? $presetStationery : 0), $selectStationeries, true, "style='width: 35%;'");
/* /*
$this->t->set_var("select_signature", $selectBoxSignature);
$this->t->set_var("select_stationery", ($showStationaries ? $selectBoxStationery:''));
$this->t->set_var("lang_editormode",lang("Editor type")); $this->t->set_var("lang_editormode",lang("Editor type"));
if (html::htmlarea_availible()===false) if (html::htmlarea_availible()===false)
{ {
@ -958,7 +889,6 @@ class mail_compose
// IE seems to need onclick to realize there is a change // IE seems to need onclick to realize there is a change
$this->t->set_var("toggle_editormode", lang("Editor type").":&nbsp;<span><input name=\"_is_html\" value=\"".$ishtml."\" type=\"hidden\" /><input name=\"_editorselect\" onchange=\"fm_toggle_editor(this)\" onclick=\"fm_toggle_editor(this)\" ".($ishtml ? "checked=\"checked\"" : "")." id=\"_html\" value=\"html\" type=\"radio\"><label for=\"_html\">HTML</label><input name=\"_editorselect\" onchange=\"fm_toggle_editor(this)\" onclick=\"fm_toggle_editor(this)\" ".($ishtml ? "" : "checked=\"checked\"")." id=\"_plain\" value=\"plain\" type=\"radio\"><label for=\"_plain\">Plain text</label></span>"); $this->t->set_var("toggle_editormode", lang("Editor type").":&nbsp;<span><input name=\"_is_html\" value=\"".$ishtml."\" type=\"hidden\" /><input name=\"_editorselect\" onchange=\"fm_toggle_editor(this)\" onclick=\"fm_toggle_editor(this)\" ".($ishtml ? "checked=\"checked\"" : "")." id=\"_html\" value=\"html\" type=\"radio\"><label for=\"_html\">HTML</label><input name=\"_editorselect\" onchange=\"fm_toggle_editor(this)\" onclick=\"fm_toggle_editor(this)\" ".($ishtml ? "" : "checked=\"checked\"")." id=\"_plain\" value=\"plain\" type=\"radio\"><label for=\"_plain\">Plain text</label></span>");
} }
$this->t->pparse("out","body_input");
*/ */
// attachments // attachments
if (is_array($sessionData['attachments']) && count($sessionData['attachments']) > 0) if (is_array($sessionData['attachments']) && count($sessionData['attachments']) > 0)
@ -986,12 +916,89 @@ class mail_compose
// $this->t->set_var('attachment_rows',''); // $this->t->set_var('attachment_rows','');
} }
// $this->t->pparse("out","attachment"); // signature stuff set earlier
$content['is_html'] = $this->sessionData['mimeType'] == 'html'; $sel_options['signatureID'] = $selectSignatures;
$content['mailtext'] = 'garbage'; $content['signatureID'] = ($presetSig ? $presetSig : $sessionData['signatureID']);
// end signature stuff
// stationery stuff
$bostationery = new emailadmin_bostationery();
$selectStationeries = array(
'0' => lang('no stationery')
);
$showStationaries = false;
$validStationaries = $bostationery->get_valid_templates();
if (is_array($validStationaries) && count($validStationaries)>0)
{
$showStationaries = true;
$selectStationeries += $validStationaries;
}
//_debug_array($selectStationeries);
$sel_options['stationeryID'] = $selectStationeries;
// if ID of signature Select Box is set, we allow for changing the sig onChange of the signatueSelect
$content['stationeryID'] = ($presetStationery ? $presetStationery : 0);
// end stationery stuff
//$sessionData['bcc'] = array('kl@stylite.de','kl@leithoff.net');
// address stuff like from, to, cc, replyto
$destinationRows = 0;
foreach(array('to','cc','bcc','replyto','folder') as $destination) {
foreach((array)$sessionData[$destination] as $key => $value) {
if ($value=="NIL@NIL") continue;
if ($destination=='replyto' && str_replace('"','',$value) == str_replace('"','',$identities[($presetId ? $presetId : $defaultIdentity)])) continue;
//error_log(__METHOD__.__LINE__.array2string(array('key'=>$key,'value'=>$value)));
$selectDestination = html::select('destination[]', $destination, $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
//$this->t->set_var('select_destination', $selectDestination);
$value = htmlspecialchars_decode($value,ENT_COMPAT);
$value = str_replace("\"\"",'"',$value);
$address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($value):$value), '');
foreach((array)$address_array as $addressObject) {
if ($addressObject->host == '.SYNTAX-ERROR.') continue;
$address = imap_rfc822_write_address($addressObject->mailbox,$addressObject->host,$addressObject->personal);
//$address = mail_bo::htmlentities($address, $this->displayCharset);
$content[strtoupper($destination)][]=$address;
$destinationRows++;
}
}
}
if ($content)
{
}
else
{
$content['is_html'] = ($this->sessionData['mimeType'] == 'html'?true:'');
$content['is_plain'] = ($this->sessionData['mimeType'] == 'html'?'':true);
//error_log(__METHOD__.__LINE__.array2string(array($sel_options['SENDER'],$selectedSender)));
$content['SENDER'] = ($selectedSender?(array)$selectedSender:'');
//error_log(__METHOD__.__LINE__.$sessionData['body']);
$content['mail_'.($this->sessionData['mimeType'] == 'html'?'html':'plain').'text'] = $sessionData['body'];
}
$etpl = new etemplate_new('mail.compose');
$etpl->exec('mail.mail_compose.compose',$content,$sel_options,$readonlys,$preserv,2); $etpl->exec('mail.mail_compose.compose',$content,$sel_options,$readonlys,$preserv,2);
} }
function testhtmlarea($content=null)
{
error_log(__METHOD__.__LINE__.array2string($content));
if ($content)
{
$this->sessionData['mimeType'] = 'plain';
$content['is_html'] = ($this->sessionData['mimeType'] == 'html'?true:'');
$content['is_plain'] = ($this->sessionData['mimeType'] == 'html'?'':true);
}
else
{
$sessionData['body'] = 'bla bla bla';
$content['is_html'] = ($this->sessionData['mimeType'] == 'html'?true:'');
$content['is_plain'] = ($this->sessionData['mimeType'] == 'html'?'':true);
//error_log(__METHOD__.__LINE__.array2string(array($sel_options['SENDER'],$selectedSender)));
$content['SENDER'] = ($selectedSender?(array)$selectedSender:'');
//error_log(__METHOD__.__LINE__.$sessionData['body']);
$content['mail_'.($this->sessionData['mimeType'] == 'html'?'html':'plain').'text'] = $sessionData['body'];
}
$etpl = new etemplate_new('mail.testhtmlarea');
$etpl->exec('mail.mail_compose.testhtmlarea',$content,$sel_options,$readonlys,$preserv,2);
}
function composeFromDraft() { function composeFromDraft() {
$icServer = (int)$_GET['icServer']; $icServer = (int)$_GET['icServer'];
$folder = (isset($_GET['folder'])?base64_decode($_GET['folder']):base64_decode($_GET['mailbox'])); $folder = (isset($_GET['folder'])?base64_decode($_GET['folder']):base64_decode($_GET['mailbox']));
@ -2492,6 +2499,34 @@ $content['mailtext'] = 'garbage';
} }
function ajax_searchIdentities() { function ajax_searchIdentities() {
$_searchString = trim($_REQUEST['query']);
$allIdentities = $this->preferences->getIdentity();
foreach($allIdentities as $key => $singleIdentity)
{
/*
if($singleIdentity->default === true)
{
$selectedAddresses[$singleIdentity->emailAddress] = $singleIdentity->emailAddress;
}
*/
$idString = mail_bo::generateIdentityString($singleIdentity);
$shortIDString = mail_bo::generateIdentityString($singleIdentity,false);
if (empty($_searchString) || ($_searchString && stripos($idString,$_searchString)!==false))
{
//error_log(__METHOD__.__LINE__.$idString.'<->'.$shortIDString);
$predefinedAddresses[$idString] = array(
'id'=>$idString,
'label' => $idString,
// Add just name for nice display, with title for hover
'name' => $shortIDString,
'title' => $idString
);
}
}
if (is_array($predefinedAddresses)) asort($predefinedAddresses);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($predefinedAddresses);
common::egw_exit();
} }
function ajax_searchFolder() { function ajax_searchFolder() {
@ -2536,7 +2571,7 @@ $content['mailtext'] = 'garbage';
} }
public static function ajax_searchAddress() { public static function ajax_searchAddress() {
error_log(__METHOD__. "request from seachAddress" . $_REQUEST['query']); //error_log(__METHOD__. "request from seachAddress " . $_REQUEST['query']);
$_searchString = trim($_REQUEST['query']); $_searchString = trim($_REQUEST['query']);
if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { if ($GLOBALS['egw_info']['user']['apps']['addressbook']) {
//error_log(__METHOD__.__LINE__.array2string($_searchString)); //error_log(__METHOD__.__LINE__.array2string($_searchString));

View File

@ -799,6 +799,12 @@ class mail_hooks
'link'=>false, 'link'=>false,
'icon' => false 'icon' => false
); );
$file[] = array(
'no_lang' => true,
'text'=>'<span id="mail-index_buttontesthtmlarea" class="button" />',
'link'=>false,
'icon' => false
);
$file[] = array( $file[] = array(
'no_lang' => true, 'no_lang' => true,
'text'=>'<span id="mail-tree_target" class="dtree" />', 'text'=>'<span id="mail-tree_target" class="dtree" />',

View File

@ -0,0 +1,296 @@
<?php
/**
* EGroupware - Mail - interface class for compose mails in popup
*
* @link http://www.egroupware.org
* @package mail
* @author Klaus Leithoff [kl@stylite.de]
* @copyright (c) 2013 by Klaus Leithoff <kl-AT-stylite.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
class mail_signatures
{
var $tableName = 'egw_felamimail_signatures';
var $fm_signatureid = NULL;
var $fm_description = NULL;
var $fm_signature = NULL;
var $fm_defaultsignature = NULL;
var $boemailadmin;
var $profileData;
function mail_signatures($_signatureID = NULL) {
$this->accountID = $GLOBALS['egw_info']['user']['account_id'];
if($_signatureID !== NULL) {
$this->read($_signatureID);
}
$this->boemailadmin = new emailadmin_bo();
$this->profileData = $this->boemailadmin->getUserProfile('felamimail');
}
function getDefaultSignature() {
$db = clone($GLOBALS['egw']->db);
$db->set_app('felamimail');
$where = array(
'fm_accountid' => $this->accountID,
'fm_defaultsignature' => true
);
$db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature',
$where, __LINE__, __FILE__);
if(($row = $db->row(true))) {
return $row['fm_signatureid'];
}
return false;
}
function read($_signatureID) {
$db = clone($GLOBALS['egw']->db);
$db->set_app('felamimail');
$where = array(
'fm_accountid' => $this->accountID,
'fm_signatureid' => $_signatureID
);
$db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature',
$where, __LINE__, __FILE__);
if(($data = $db->row(true))) {
if (empty($data['fm_description']))
{
$buff = trim(substr(str_replace(array("\r\n","\r","\n","\t"),array(" "," "," "," "),translation::convertHTMLToText($data['fm_signature'])),0,100));
$data['fm_description'] = $buff?$buff:lang('none');
}
$this->fm_signatureid = $data['fm_signatureid'];
$this->fm_description = $data['fm_description'];
$this->fm_signature = $data['fm_signature'];
$this->fm_defaultsignature = (bool)$data['fm_defaultsignature'];
return TRUE;
}
return FALSE;
}
function deleteSignatures($_signatureID)
{
if(!is_array($_signatureID)) {
return false;
}
foreach($_signatureID as $signatureID) {
#error_log("$signatureID");
$this->delete($signatureID);
}
}
private function delete($_signatureID = FALSE) {
$db = clone($GLOBALS['egw']->db);
$db->set_app('felamimail');
if($_signatureID !== FALSE) {
$signatureID = (int)$_signatureID;
} else {
$signatureID = (int)$this->fm_signatureid;
}
$where = array(
'fm_accountid' => $this->accountID,
'fm_signatureid' => $signatureID
);
$db->delete($this->tableName, $where, __LINE__, __FILE__);
if ($db->affected_rows() === 0) {
return false;
}
return true;
}
function saveSignature($_signatureID, $_description, $_signature, $_isDefaultSignature)
{
if($_signatureID == -1) {
// the systemwide profile
// can only be made the default profile
return -1;
} else {
if($this->profileData->ea_user_defined_signatures == false) {
return false;
}
$this->fm_description = $_description;
$this->fm_signature = $_signature;
$this->fm_defaultsignature = (bool)$_isDefaultSignature;
if((int)$_signatureID > 0) {
$this->fm_signatureid = (int)$_signatureID;
}
$this->save();
return $this->fm_signatureid;
}
}
private function save() {
$db = clone($GLOBALS['egw']->db);
$db->set_app('felamimail');
// reset fm_defaultsignature in all other rows to false
if($this->fm_defaultsignature === true) {
$where = array(
'fm_accountid' => $this->accountID,
);
$data = array(
'fm_defaultsignature' => false,
);
$db->update($this->tableName, $data, $where, __LINE__, __FILE__);
}
if (empty($this->fm_description))
{
$buff = trim(substr(str_replace(array("\r\n","\r","\n","\t"),array(" "," "," "," "),translation::convertHTMLToText($this->fm_signature)),0,100));
$this->fm_description = $buff?$buff:lang('none');
}
$data = array(
'fm_accountid' => $this->accountID,
'fm_signature' => $this->fm_signature,
'fm_description' => $this->fm_description,
'fm_defaultsignature' => $this->fm_defaultsignature,
);
if($this->fm_signatureid === NULL) {
$db->insert($this->tableName, $data, '', __LINE__, __FILE__);
$this->fm_signatureid = $db->get_last_insert_id($this->tableName,'fm_signatureid');
return TRUE;
} else {
$where = array(
'fm_accountid' => $this->accountID,
'fm_signatureid' => $this->fm_signatureid,
);
$db->update($this->tableName, $data, $where, __LINE__, __FILE__);
return TRUE;
}
}
function search() {
$signatures = array();
$db = clone($GLOBALS['egw']->db);
$db->set_app('felamimail');
$where = array(
'fm_accountid' => $this->accountID
);
$db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature',
$where, __LINE__, __FILE__);
while ($data = $db->row(true)) {
if (empty($data['fm_description']))
{
$buff = trim(substr(str_replace(array("\r\n","\r","\n","\t"),array(" "," "," "," "),translation::convertHTMLToText($data['fm_signature'])),0,100));
$data['fm_description'] = $buff?$buff:lang('none');
}
$signatureData = array(
'fm_signatureid' => $data['fm_signatureid'],
'fm_description' => $data['fm_description'],
'fm_signature' => $data['fm_signature'],
'fm_defaultsignature' => (bool)$data['fm_defaultsignature'],
);
$signatures[$data['fm_signatureid']] = $signatureData;
}
return $signatures;
}
function getListOfSignatures() {
//$fmSignatures = new felamimail_signatures();
#$profileData = $boemailadmin->getUserProfile('felamimail');
$systemSignatures = array();
if(!empty($this->profileData->ea_default_signature)) {
$systemSignatures[-1] = array(
'fm_signatureid' => -1,
'fm_description' => lang('system signature'),
'fm_defaultsignature' => FALSE,
);
if($this->profileData->ea_user_defined_signatures != true) {
$systemSignatures[-1]['fm_defaultsignature'] = TRUE;
}
}
// return only systemsignature, if no user defined signatures are enabled
if($this->profileData->ea_user_defined_signatures != true) {
return $systemSignatures;
}
$signatures = $this->search();
if(count($signatures) == 0 &&
!isset($GLOBALS['egw_info']['user']['preferences']['mail']['email_sig_copied']) &&
!empty($GLOBALS['egw_info']['user']['preferences']['mail']['email_sig'])) {
$GLOBALS['egw']->preferences->read_repository();
$newSignature = new mail_signatures();
$newSignature->fm_description = lang('default signature');
$newSignature->fm_signature = nl2br($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig']);
$newSignature->fm_defaultsignature = true;
$newSignature->save();
$GLOBALS['egw']->preferences->add('mail', 'email_sig_copied', true);
$GLOBALS['egw']->preferences->save_repository();
$signatures = $this->search();
}
// make systemsignature the default, if no other signature is defined as default signature
if($this->getDefaultSignature() === false) {
$systemSignatures[-1]['fm_defaultsignature'] = TRUE;
}
$signatures = array_merge($systemSignatures, $signatures);
#_debug_array($signatures);
return $signatures;
}
function getSignature($_signatureID, $_unparsed = false)
{
if($_signatureID == -1) {
$systemSignatureIsDefaultSignature = $this->getDefaultSignature();
$signature = new mail_signatures();
$signature->fm_signatureid = -1;
$signature->fm_description = 'eGroupWare '. lang('default signature');
$signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($this->profileData->ea_default_signature));
$signature->fm_defaultsignature = $systemSignatureIsDefaultSignature;
return $signature;
} else {
$signature = new mail_signatures($_signatureID);
if($_unparsed === false) {
$signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($signature->fm_signature));
}
return $signature;
}
}
}
?>

View File

@ -51,6 +51,13 @@ class mail_ui
*/ */
static $delimiter = '::'; static $delimiter = '::';
/**
* nextMatch name for index
*
* @var string
*/
static $nm_index = 'nm';
/** /**
* instance of mail_bo * instance of mail_bo
* *
@ -157,11 +164,11 @@ class mail_ui
if (!is_array($content)) if (!is_array($content))
{ {
$content = array( $content = array(
'nm' => egw_session::appsession('index','mail'), self::$nm_index => egw_session::appsession('index','mail'),
); );
if (!is_array($content['nm'])) if (!is_array($content[self::$nm_index]))
{ {
$content['nm'] = array( $content[self::$nm_index] = array(
'get_rows' => 'mail.mail_ui.get_rows', // I method/callback to request the data for the rows eg. 'notes.bo.get_rows' 'get_rows' => 'mail.mail_ui.get_rows', // I method/callback to request the data for the rows eg. 'notes.bo.get_rows'
'filter' => 'any', // filter is used to choose the mailbox 'filter' => 'any', // filter is used to choose the mailbox
'no_filter2' => false, // I disable the 2. filter (params are the same as for filter) 'no_filter2' => false, // I disable the 2. filter (params are the same as for filter)
@ -178,10 +185,10 @@ class mail_ui
'actions' => self::get_actions(), 'actions' => self::get_actions(),
'row_id' => 'row_id', // is a concatenation of trim($GLOBALS['egw_info']['user']['account_id']):profileID:base64_encode(FOLDERNAME):uid 'row_id' => 'row_id', // is a concatenation of trim($GLOBALS['egw_info']['user']['account_id']):profileID:base64_encode(FOLDERNAME):uid
); );
//$content['nm']['path'] = self::get_home_dir(); //$content[self::$nm_index]['path'] = self::get_home_dir();
} }
} }
$content['nm']['csv_fields'] = false; $content[self::$nm_index]['csv_fields'] = false;
if ($msg) if ($msg)
{ {
$content['msg'] = $msg; $content['msg'] = $msg;
@ -195,9 +202,9 @@ class mail_ui
$this->mail_bo->restoreSessionData(); $this->mail_bo->restoreSessionData();
// filter is used to choose the mailbox // filter is used to choose the mailbox
//if (!isset($content['nm']['foldertree'])) // maybe we fetch the folder here //if (!isset($content[self::$nm_index]['foldertree'])) // maybe we fetch the folder here
/* /*
$sel_options['nm']['foldertree'] = array('id' => 0, 'item' => array( $sel_options[self::$nm_index]['foldertree'] = array('id' => 0, 'item' => array(
array('id' => '/INBOX', 'text' => 'INBOX', 'im0' => 'kfm_home.png', 'child' => '1', 'item' => array( array('id' => '/INBOX', 'text' => 'INBOX', 'im0' => 'kfm_home.png', 'child' => '1', 'item' => array(
array('id' => '/INBOX/sub', 'text' => 'sub'), array('id' => '/INBOX/sub', 'text' => 'sub'),
array('id' => '/INBOX/sub2', 'text' => 'sub2'), array('id' => '/INBOX/sub2', 'text' => 'sub2'),
@ -207,15 +214,15 @@ class mail_ui
)), )),
)); ));
$content['nm']['foldertree'] = '/INBOX/sub'; $content[self::$nm_index]['foldertree'] = '/INBOX/sub';
*/ */
$sel_options['nm']['foldertree'] = $this->getFolderTree(false); $sel_options[self::$nm_index]['foldertree'] = $this->getFolderTree(false);
$sessionFolder = $this->mail_bo->sessionData['maibox']; $sessionFolder = $this->mail_bo->sessionData['maibox'];
if ($this->mail_bo->folderExists($sessionFolder)) if ($this->mail_bo->folderExists($sessionFolder))
{ {
$content['nm']['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.$this->mail_bo->sessionData['maibox']; $content[self::$nm_index]['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.$this->mail_bo->sessionData['maibox'];
$this->mail_bo->reopen($sessionFolder); // needed to fetch full set of capabilities $this->mail_bo->reopen($sessionFolder); // needed to fetch full set of capabilities
} }
// since we are connected,(and selected the folder) we check for capabilities SUPPORTS_KEYWORDS to eventually add the keyword filters // since we are connected,(and selected the folder) we check for capabilities SUPPORTS_KEYWORDS to eventually add the keyword filters
@ -230,19 +237,18 @@ class mail_ui
)); ));
} }
if (!isset($content['nm']['foldertree'])) $content['nm']['foldertree'] = $this->mail_bo->profileID.self::$delimiter.'INBOX'; if (!isset($content[self::$nm_index]['foldertree'])) $content[self::$nm_index]['foldertree'] = $this->mail_bo->profileID.self::$delimiter.'INBOX';
if (!isset($content['nm']['selectedFolder'])) $content['nm']['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.'INBOX'; if (!isset($content[self::$nm_index]['selectedFolder'])) $content[self::$nm_index]['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.'INBOX';
$content['nm']['foldertree'] = $content['nm']['selectedFolder']; $content[self::$nm_index]['foldertree'] = $content[self::$nm_index]['selectedFolder'];
//$sel_options['cat_id'] = array(1=>'none'); //$sel_options['cat_id'] = array(1=>'none');
$sel_options['filter2'] = $this->searchTypes; $sel_options['filter2'] = $this->searchTypes;
$sel_options['filter'] = $this->statusTypes; $sel_options['filter'] = $this->statusTypes;
//if (!isset($content['nm']['cat_id'])) $content['nm']['cat_id'] = 'All'; //if (!isset($content[self::$nm_index]['cat_id'])) $content[self::$nm_index]['cat_id'] = 'All';
$etpl = new etemplate_new('mail.index'); $etpl = new etemplate_new('mail.index');
// Set tree actions // Set tree actions
$etpl->set_cell_attribute('nm[foldertree]','actions', array( $etpl->setElementAttribute(self::$nm_index.'[foldertree]','actions', array(
'drop_move_mail' => array( 'drop_move_mail' => array(
'type' => 'drop', 'type' => 'drop',
'acceptedTypes' => 'mail', 'acceptedTypes' => 'mail',
@ -277,7 +283,7 @@ class mail_ui
) )
)); ));
//error_log(__METHOD__.__LINE__.array2string($content)); //error_log(__METHOD__.__LINE__.array2string($content));
if (empty($content['nm']['filter2']) || empty($content['nm']['search'])) $content['nm']['filter2']='quick'; if (empty($content[self::$nm_index]['filter2']) || empty($content[self::$nm_index]['search'])) $content[self::$nm_index]['filter2']='quick';
$readonlys = $preserv = $sel_options; $readonlys = $preserv = $sel_options;
return $etpl->exec('mail.mail_ui.index',$content,$sel_options,$readonlys,$preserv); return $etpl->exec('mail.mail_ui.index',$content,$sel_options,$readonlys,$preserv);
} }
@ -686,7 +692,7 @@ class mail_ui
/** /**
* Get actions / context menu for index * Get actions / context menu for index
* *
* Changes here, require to log out, as $content['nm'] get stored in session! * Changes here, require to log out, as $content[self::$nm_index] get stored in session!
* @var &$action_links * @var &$action_links
* *
* @return array see nextmatch_widget::egw_actions() * @return array see nextmatch_widget::egw_actions()
@ -1593,9 +1599,13 @@ unset($query['actions']);
), ),
)); ));
*/ */
egw_framework::set_onload(""); egw_framework::set_onload('$j(document).ready(function() {
$subject = mail_bo::htmlspecialchars($this->mail_bo->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']),false), var subject = etemplate2.getByApplication(\'mail\')[0].widgetContainer.getWidgetById(\'mail_displaysubject\');
mail_bo::$displayCharset); var body = etemplate2.getByApplication(\'mail\')[0].widgetContainer.getWidgetById(\'mail_displaybody\');
body.node.parentNode.style.top=subject.node.offsetTop+40+\'px\';
});');
$subject = /*mail_bo::htmlspecialchars(*/$this->mail_bo->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']),false)/*,
mail_bo::$displayCharset)*/;
if($envelope['FROM'][0] != $envelope['SENDER'][0]) { if($envelope['FROM'][0] != $envelope['SENDER'][0]) {
$content['mail_displayfromaddress'] = self::emailAddressToHTML($envelope['SENDER'],'',false,true,false); $content['mail_displayfromaddress'] = self::emailAddressToHTML($envelope['SENDER'],'',false,true,false);
$content['mail_displayonbehalfofaddress'] = self::emailAddressToHTML($envelope['FROM'], $organization,false,true,false); $content['mail_displayonbehalfofaddress'] = self::emailAddressToHTML($envelope['FROM'], $organization,false,true,false);
@ -2158,8 +2168,22 @@ unset($query['actions']);
!fwrite($fp,$message)) !fwrite($fp,$message))
{ {
$err .= 'alert("'.addslashes(lang('Error saving %1!',$file)).'");'; $err .= 'alert("'.addslashes(lang('Error saving %1!',$file)).'");';
$succeeded = false;
}
else
{
$succeeded = true;
} }
if ($fp) fclose($fp); if ($fp) fclose($fp);
if ($succeeded)
{
translation::add_app('mail');
$headers = $this->bmail_bo->getMessageHeader($uid,$partID,true);
unset($headers['SUBJECT']);//already in filename
$infoSection = mail_bo::createHeaderInfoSection($headers, 'SUPPRESS', false);
$props = array(array('name' => 'comment','val' => $infoSection));
egw_vfs::proppatch($file,$props);
}
} }
//$this->mail_bo->closeConnection(); //$this->mail_bo->closeConnection();

View File

@ -11,6 +11,7 @@
app.mail = AppJS.extend( app.mail = AppJS.extend(
{ {
appname: 'mail', appname: 'mail',
/** /**
* et2 widget container * et2 widget container
*/ */
@ -26,6 +27,8 @@ app.mail = AppJS.extend(
mail_currentlyFocussed: '', mail_currentlyFocussed: '',
mail_previewAreaActive: true, // we start with the area active mail_previewAreaActive: true, // we start with the area active
nm_index: 'nm', // nm nome of index
/** /**
* Initialize javascript for this application * Initialize javascript for this application
* *
@ -87,7 +90,7 @@ app.mail = AppJS.extend(
{ {
if (_reset == true) if (_reset == true)
{ {
//var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); //var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(nm_index);
//if (this.mail_currentlyFocussed!='') nm.refresh([this.mail_currentlyFocussed],'delete');//egw.dataDeleteUID(this.mail_currentlyFocussed); //if (this.mail_currentlyFocussed!='') nm.refresh([this.mail_currentlyFocussed],'delete');//egw.dataDeleteUID(this.mail_currentlyFocussed);
if (this.mail_currentlyFocussed!='') egw.dataDeleteUID(this.mail_currentlyFocussed); if (this.mail_currentlyFocussed!='') egw.dataDeleteUID(this.mail_currentlyFocussed);
for(var k = 0; k < this.mail_selectedMails.length; k++) egw.dataDeleteUID(this.mail_selectedMails[k]); for(var k = 0; k < this.mail_selectedMails.length; k++) egw.dataDeleteUID(this.mail_selectedMails[k]);
@ -233,6 +236,19 @@ app.mail = AppJS.extend(
} }
}, },
/**
* Compose, reply or forward a message
*
* @param _action _action.id is 'compose', 'composeasnew', 'reply', 'reply_all' or 'forward' (forward can be multiple messages)
* @param _elems _elems[0].id is the row-id
*/
mail_testhtmlarea: function(_action, _elems)
{
var url = window.egw_webserverUrl+'/index.php?';
url += 'menuaction=mail.mail_compose.testhtmlarea';
egw_openWindowCentered(url);
},
/** /**
* Compose, reply or forward a message * Compose, reply or forward a message
* *
@ -414,7 +430,7 @@ app.mail = AppJS.extend(
} }
try try
{ {
var tree_wdg = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var tree_wdg = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
var activeFolders = tree_wdg.getTreeNodeOpenItems(nodeToRefresh,mode2use); var activeFolders = tree_wdg.getTreeNodeOpenItems(nodeToRefresh,mode2use);
//alert(activeFolders.join('#,#')); //alert(activeFolders.join('#,#'));
@ -456,7 +472,7 @@ app.mail = AppJS.extend(
* mail_setFolderStatus, function to set the status for the visible folders * mail_setFolderStatus, function to set the status for the visible folders
*/ */
mail_setFolderStatus: function(_status) { mail_setFolderStatus: function(_status) {
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
for (var i in _status) ftree.setLabel(i,_status[i]);//alert(i +'->'+_status[i]); for (var i in _status) ftree.setLabel(i,_status[i]);//alert(i +'->'+_status[i]);
}, },
@ -468,7 +484,7 @@ app.mail = AppJS.extend(
*/ */
mail_setLeaf: function(_status) { mail_setLeaf: function(_status) {
//console.log('mail_setLeaf',_status); //console.log('mail_setLeaf',_status);
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
var selectedNode = ftree.getSelectedNode(); var selectedNode = ftree.getSelectedNode();
for (var i in _status) for (var i in _status)
{ {
@ -478,7 +494,7 @@ app.mail = AppJS.extend(
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']); //alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
if (_status[i]['id']==selectedNode.id) if (_status[i]['id']==selectedNode.id)
{ {
var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index);
nm.activeFilters["selectedFolder"] = _status[i]['id']; nm.activeFilters["selectedFolder"] = _status[i]['id'];
nm.applyFilters(); nm.applyFilters();
} }
@ -493,7 +509,7 @@ app.mail = AppJS.extend(
*/ */
mail_removeLeaf: function(_status) { mail_removeLeaf: function(_status) {
//console.log('mail_removeLeaf',_status); //console.log('mail_removeLeaf',_status);
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
var selectedNode = ftree.getSelectedNode(); var selectedNode = ftree.getSelectedNode();
for (var i in _status) for (var i in _status)
{ {
@ -504,7 +520,7 @@ app.mail = AppJS.extend(
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']); //alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
if (selectedNodeAfter.id!=selectedNode.id && selectedNode.id==i) if (selectedNodeAfter.id!=selectedNode.id && selectedNode.id==i)
{ {
var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index);
nm.activeFilters["selectedFolder"] = selectedNodeAfter.id; nm.activeFilters["selectedFolder"] = selectedNodeAfter.id;
nm.applyFilters(); nm.applyFilters();
} }
@ -519,7 +535,7 @@ app.mail = AppJS.extend(
*/ */
mail_reloadNode: function(_status) { mail_reloadNode: function(_status) {
//console.log('mail_reloadNode',_status); //console.log('mail_reloadNode',_status);
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
var selectedNode = ftree.getSelectedNode(); var selectedNode = ftree.getSelectedNode();
for (var i in _status) for (var i in _status)
{ {
@ -530,7 +546,7 @@ app.mail = AppJS.extend(
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']); //alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
if (selectedNodeAfter.id!=selectedNode.id && selectedNode.id==i) if (selectedNodeAfter.id!=selectedNode.id && selectedNode.id==i)
{ {
var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index);
nm.activeFilters["selectedFolder"] = selectedNodeAfter.id; nm.activeFilters["selectedFolder"] = selectedNodeAfter.id;
nm.applyFilters(); nm.applyFilters();
} }
@ -541,7 +557,7 @@ app.mail = AppJS.extend(
* mail_refreshMessageGrid, function to call to reread ofthe current folder * mail_refreshMessageGrid, function to call to reread ofthe current folder
*/ */
mail_refreshMessageGrid: function() { mail_refreshMessageGrid: function() {
var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index);
nm.applyFilters(); // this should refresh the active folder nm.applyFilters(); // this should refresh the active folder
}, },
@ -744,7 +760,7 @@ app.mail = AppJS.extend(
_widget.set_value(''); _widget.set_value('');
} }
} }
var nm = _widget.getRoot().getWidgetById('nm'); var nm = _widget.getRoot().getWidgetById(this.nm_index);
nm.activeFilters["selectedFolder"] = folder; nm.activeFilters["selectedFolder"] = folder;
//nm.applyFilters();// its done in refrefreshMessageGrid //nm.applyFilters();// its done in refrefreshMessageGrid
var msg = _widget.getRoot().getWidgetById('msg'); var msg = _widget.getRoot().getWidgetById('msg');
@ -983,7 +999,7 @@ app.mail = AppJS.extend(
} }
else else
{ {
var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index);
var aO = nm.controller._objectManager.selectedChildren; var aO = nm.controller._objectManager.selectedChildren;
for (var i = 0; i < _actionObjects['msg'].length; i++) for (var i = 0; i < _actionObjects['msg'].length; i++)
{ {
@ -1028,7 +1044,7 @@ app.mail = AppJS.extend(
// as the "onNodeSelect" function! // as the "onNodeSelect" function!
var request = new egw_json_request('mail.mail_ui.ajax_moveMessages',[target, messages]); var request = new egw_json_request('mail.mail_ui.ajax_moveMessages',[target, messages]);
request.sendRequest(false); request.sendRequest(false);
var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index);
this.mail_setRowClass(_senders,'deleted'); this.mail_setRowClass(_senders,'deleted');
nm.refresh(messages['msg'],'delete') nm.refresh(messages['msg'],'delete')
//for (var i = 0; i < messages['msg'].length; i++) egw.dataDeleteUID(messages['msg'][i]); //for (var i = 0; i < messages['msg'].length; i++) egw.dataDeleteUID(messages['msg'][i]);
@ -1063,7 +1079,7 @@ app.mail = AppJS.extend(
//console.log(action,_senders); //console.log(action,_senders);
//action.id == 'add' //action.id == 'add'
//_senders.iface.id == target leaf / leaf to edit //_senders.iface.id == target leaf / leaf to edit
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
OldFolderName = ftree.getLabel(_senders[0].iface.id); OldFolderName = ftree.getLabel(_senders[0].iface.id);
if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text(); if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text();
OldFolderName = OldFolderName.trim(); OldFolderName = OldFolderName.trim();
@ -1090,7 +1106,7 @@ app.mail = AppJS.extend(
//console.log(action,_senders); //console.log(action,_senders);
//action.id == 'rename' //action.id == 'rename'
//_senders.iface.id == target leaf / leaf to edit //_senders.iface.id == target leaf / leaf to edit
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
OldFolderName = ftree.getLabel(_senders[0].iface.id); OldFolderName = ftree.getLabel(_senders[0].iface.id);
if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text(); if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text();
OldFolderName = OldFolderName.trim(); OldFolderName = OldFolderName.trim();
@ -1117,7 +1133,7 @@ app.mail = AppJS.extend(
//console.log(action,_senders); //console.log(action,_senders);
//action.id == 'delete' //action.id == 'delete'
//_senders.iface.id == target leaf / leaf to edit //_senders.iface.id == target leaf / leaf to edit
var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]');
OldFolderName = ftree.getLabel(_senders[0].iface.id); OldFolderName = ftree.getLabel(_senders[0].iface.id);
if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text(); if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text();
OldFolderName = OldFolderName.trim(); OldFolderName = OldFolderName.trim();

View File

@ -6,7 +6,10 @@
<vbox class="mailCompose mailComposeHeaderSection" width="100%"> <vbox class="mailCompose mailComposeHeaderSection" width="100%">
<hbox class="mailComposeHeaders" width="99%"> <hbox class="mailComposeHeaders" width="99%">
<description value="Identity"/> <description value="Identity"/>
<taglist-email id="SENDER" width="88%" allowFreeEntries="false" maxSelection="1" onclick="app.mail.address_click"/> <taglist-email id="SENDER" width="88%" allowFreeEntries="false" maxSelection="1" autocomplete_url="mail.mail_compose.ajax_searchIdentities" onclick="app.mail.address_click"/>
</hbox>
<hbox>
<button label="Submit" id="button[apply]"/><button label="Save" id="button[save]"/>
</hbox> </hbox>
<hbox class="mailComposeHeaders" width="99%"> <hbox class="mailComposeHeaders" width="99%">
<description value="To"/> <description value="To"/>
@ -22,7 +25,7 @@
</hbox> </hbox>
<hbox class="mailComposeHeaders" width="99%"> <hbox class="mailComposeHeaders" width="99%">
<description value="Reply To"/> <description value="Reply To"/>
<taglist-email id="REPLYTO" width="88%" onclick="app.mail.address_click"/> <taglist-email id="REPLYTO" width="88%" maxSelection="1" onclick="app.mail.address_click"/>
</hbox> </hbox>
<hbox class="mailComposeHeaders" width="99%"> <hbox class="mailComposeHeaders" width="99%">
<description value="Store to Folder"/> <description value="Store to Folder"/>
@ -37,12 +40,22 @@
</hbox> </hbox>
</vbox> </vbox>
<vbox class="mailComposeBodySection" width="99%"> <vbox class="mailComposeBodySection" width="99%">
<hbox disabled="!@is_html" class="mailComposeBody"> <hbox disabled="@is_plain" class="mailComposeBody">
<htmlarea span="all" id="mailtext" mode="$cont[rtfEditorFeatures]" height="320px" width="100%" toolbar="true" base_href="$cont[upload_dir]"/> <htmlarea span="all" name="mail_htmltext" id="mail_htmltext" mode="$cont[rtfEditorFeatures]" height="320px" width="100%" toolbar="true" base_href="$cont[upload_dir]"/>
</hbox> </hbox>
<hbox disabled="@is_html" class="mailComposeBody"> <hbox disabled="@is_html" class="mailComposeBody">
<textbox multiline="true" rows="15" cols="120" width="99%" span="all" id="mailtext"/> <textbox multiline="true" rows="15" cols="120" width="99%" span="all" name="mail_plaintext" id="mail_plaintext"/>
</hbox> </hbox>
<box class="mailSignature">
<menulist>
<menupopup id="signatureID"/>
</menulist>
<description value="Stationery"/>
<menulist>
<menupopup id="stationeryID"/>
</menulist>
</box>
<box class="mailComposeAttachments"> <box class="mailComposeAttachments">
<html id="mail_composeattachments"/> <html id="mail_composeattachments"/>
</box> </box>

View File

@ -40,6 +40,7 @@
<template id="mail.index" template="" lang="" group="0" version="1.9.001"> <template id="mail.index" template="" lang="" group="0" version="1.9.001">
<tree autoloading="mail.mail_ui.ajax_foldertree" id="nm[foldertree]" onclick="app.mail.mail_changeFolder(widget.event_args[0],widget);" parent_node="mail-tree_target"/> <tree autoloading="mail.mail_ui.ajax_foldertree" id="nm[foldertree]" onclick="app.mail.mail_changeFolder(widget.event_args[0],widget);" parent_node="mail-tree_target"/>
<buttononly id="button[mailcreate]" onclick="app.mail.mail_compose(false);" label="Compose" parent_node="mail-index_buttonmailcreate"/> <buttononly id="button[mailcreate]" onclick="app.mail.mail_compose(false);" label="Compose" parent_node="mail-index_buttonmailcreate"/>
<buttononly id="button[testhtmlarea]" onclick="app.mail.mail_testhtmlarea(false);" label="Test HTML Area" parent_node="mail-index_buttontesthtmlarea"/>
<html id="msg"/> <html id="msg"/>
<split dock_side="bottomDock" id="mailSplitter" orientation="h"> <split dock_side="bottomDock" id="mailSplitter" orientation="h">
<nextmatch id="nm" onselect="app.mail.mail_preview" template="mail.index.rows"/> <nextmatch id="nm" onselect="app.mail.mail_preview" template="mail.index.rows"/>

View File

@ -14,7 +14,7 @@
<description value="Status"/> <description value="Status"/>
<description value="rules"/> <description value="rules"/>
</row> </row>
<row class="mail_sieve_$row_count[status]" > <row class="tr" >
<description id="${row}[ruleID]" /> <description id="${row}[ruleID]" />
<menulist> <menulist>
<menupopup id="${row}[status]" readonly= "true"/> <menupopup id="${row}[status]" readonly= "true"/>
@ -40,4 +40,4 @@
</rows> </rows>
</grid> </grid>
</template> </template>
</overlay> </overlay>

View File

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="mail.testhtmlarea" template="" lang="" group="0" version="1.9.001">
<hbox>
<button label="Submit" id="button[apply]"/><button label="Save" id="button[save]"/>
</hbox>
<vbox class="mailComposeBodySection" width="99%">
<hbox disabled="@is_plain" class="mailComposeBody">
<htmlarea span="all" name="mail_htmltext" id="mail_htmltext" mode="$cont[rtfEditorFeatures]" height="320px" width="100%" toolbar="true" base_href="$cont[upload_dir]"/>
</hbox>
<hbox disabled="@is_html" class="mailComposeBody">
<textbox multiline="true" rows="15" cols="120" width="99%" span="all" name="mail_plaintext" id="mail_plaintext"/>
</hbox>
</vbox>
</template>
</overlay>