Files
server/usr/share/psa-horde/imp/lib/Minimal/Mailbox.php
2026-01-07 20:52:11 +01:00

234 lines
8.7 KiB
PHP

<?php
/**
* Mailbox page for minimal view.
*
* Copyright 2012-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Minimal_Mailbox extends IMP_Minimal_Base
{
/**
* URL Parameters:
* - a: (string) Action ID.
* - checkbox: TODO
* - p: (integer) Page.
* - search: (sring) The search string
* - start: (integer) Start.
* - t: (string) Token.
*/
protected function _init()
{
global $injector, $notification, $prefs, $session;
$imp_imap = $this->indices->mailbox->imp_imap;
$imp_search = $injector->getInstance('IMP_Search');
/* Determine if mailbox is readonly. */
$readonly = $this->indices->mailbox->readonly;
/* Get the base URL for this page. */
$mailbox_url = self::url(array('mailbox' => $this->indices->mailbox));
/* Perform message actions (via advanced UI). */
switch ($this->vars->checkbox) {
// 'd' = delete message
// 'u' = undelete message
case 'd':
case 'u':
$imp_message = $injector->getInstance('IMP_Message');
if ($this->vars->checkbox == 'd') {
try {
$session->checkToken($this->vars->t);
$imp_message->delete($this->indices);
} catch (Horde_Exception $e) {
$notification->push($e);
}
} else {
$imp_message->undelete($this->indices);
}
break;
// 'rs' = report spam
// 'ri' = report innocent
case 'rs':
case 'ri':
$injector->getInstance('IMP_Factory_Spam')->create($this->vars->checkbox == 'rs' ? IMP_Spam::SPAM : IMP_Spam::INNOCENT)->report($this->indices);
break;
}
/* Run through the action handlers. */
switch ($this->vars->a) {
// 'm' = message missing
case 'm':
$notification->push(_("There was an error viewing the requested message."), 'horde.error');
break;
// 'e' = expunge mailbox
case 'e':
$injector->getInstance('IMP_Message')->expungeMailbox(array(strval($this->indices->mailbox) => 1));
break;
// 'ds' = do search
case 'ds':
if (!empty($this->vars->search) &&
$this->indices->mailbox->access_search) {
/* Create the search query and reset the global mailbox
* variable. */
$q_ob = $imp_search->createQuery(array(new IMP_Search_Element_Text($this->vars->search, false)), array(
'mboxes' => array($this->indices->mailbox)
));
/* Need to re-calculate these values. */
$this->indices->mailbox = IMP_Mailbox::get($q_ob);
$readonly = $this->indices->mailbox->readonly;
$mailbox_url = self::url(array('mailbox' => $this->indices->mailbox));
}
break;
}
/* Build the list of messages in the mailbox. */
$imp_mailbox = $this->indices->mailbox->list_ob;
$pageOb = $imp_mailbox->buildMailboxPage($this->vars->p, $this->vars->start);
/* Generate page title. */
$this->title = $this->indices->mailbox->display;
/* Modify title for display on page. */
if ($pageOb['msgcount']) {
$this->title .= ' (';
if ($imp_imap->access(IMP_Imap::ACCESS_UNSEEN)) {
$unseen = $imp_mailbox->unseenMessages(Horde_Imap_Client::SEARCH_RESULTS_COUNT);
$this->title .= sprintf(_("%d unseen"), $unseen) . '/';
}
$this->title .= sprintf(_("%d total"), $pageOb['msgcount']) . ')';
}
if ($pageOb['pagecount'] > 1) {
$this->title .= ' - ' . sprintf(_("%d of %d"), $pageOb['page'], $pageOb['pagecount']);
}
if ($readonly) {
$this->title .= ' [' . _("Read-Only") . ']';
}
$this->view->title = $this->title;
/* Build the array of message information. */
$imp_ui = new IMP_Mailbox_Ui($this->indices->mailbox);
$mbox_info = $imp_mailbox->getMailboxArray(range($pageOb['begin'], $pageOb['end']), array('headers' => true));
$msgs = array();
while (list(,$ob) = each($mbox_info['overview'])) {
/* Initialize the header fields. */
$msg = array(
'buid' => $imp_mailbox->getBuid($ob['mailbox'], $ob['uid']),
'status' => '',
'subject' => trim($imp_ui->getSubject($ob['envelope']->subject))
);
/* Format the from header. */
$getfrom = $imp_ui->getFrom($ob['envelope']);
$msg['from'] = $getfrom['from'];
/* Get flag information. */
$flag_parse = $injector->getInstance('IMP_Flags')->parse(array(
'flags' => $ob['flags'],
'headers' => $ob['headers'],
'personal' => $ob['envelope']->to
));
foreach ($flag_parse as $val) {
if ($abbrev = $val->abbreviation) {
$msg['status'] .= $abbrev;
} elseif ($val instanceof IMP_Flag_User) {
$msg['subject'] = '*' . Horde_String::truncate($val->label, 8) . '* ' . $msg['subject'];
}
}
/* Generate the target link. */
if ($this->indices->mailbox->templates) {
$compose = 't';
} elseif ($this->indices->mailbox->draft ||
in_array(Horde_Imap_Client::FLAG_DRAFT, $ob['flags'])) {
$compose = 'd';
} else {
$msg['target'] = IMP_Minimal_Message::url(array(
'buid' => $msg['buid'],
'mailbox' => $this->indices->mailbox
));
}
if (!isset($msg['target'])) {
$clink = new IMP_Compose_Link();
$msg['target'] = $clink->link()->add(array(
'a' => $compose,
'buid' => $msg['buid'],
'bodypart' => 1,
'mailbox' => $this->indices->mailbox
));
}
$msgs[] = $msg;
}
$this->view->msgs = $msgs;
$mailbox = $mailbox_url->copy()->add('p', $pageOb['page']);
$menu = array(array(_("Refresh"), $mailbox));
$search_mbox = $this->indices->mailbox->search;
/* Determine if we are going to show the Purge Deleted link. */
if (!$prefs->getValue('use_trash') &&
!$this->indices->mailbox->vinbox &&
$this->indices->mailbox->access_expunge) {
$menu[] = array(_("Purge Deleted"), $mailbox->copy()->add('a', 'e'));
}
/* Add search link. */
if ($this->indices->mailbox->access_search) {
if ($search_mbox) {
$mboxes = $imp_search[strval($this->indices->mailbox)]->mboxes;
$orig_mbox = IMP_Mailbox::get(reset($mboxes));
$menu[] = array(sprintf(_("New Search in %s"), $orig_mbox->label), IMP_Minimal_Search::url(array('mailbox' => $orig_mbox)));
} else {
$menu[] = array(_("Search"), IMP_Minimal_Search::url(array('mailbox' => $this->indices->mailbox)));
}
}
/* Generate page links. */
if ($pageOb['page'] != 1) {
$menu[] = array(_("First Page"), $mailbox_url->copy()->add('p', 1));
$menu[] = array(_("Previous Page"), $mailbox_url->copy()->add('p', $pageOb['page'] - 1));
}
if ($pageOb['page'] != $pageOb['pagecount']) {
$menu[] = array(_("Next Page"), $mailbox_url->copy()->add('p', $pageOb['page'] + 1));
$menu[] = array(_("Last Page"), $mailbox_url->copy()->add('p', $pageOb['pagecount']));
}
$this->view->menu = $this->getMenu('mailbox', $menu);
$this->view->checkbox = $mailbox_url->copy()->add('p', $pageOb['page']);
$this->view->delete = $this->indices->mailbox->access_deletemsgs;
$this->view->t = $session->getToken();
$this->_pages[] = 'mailbox';
$this->_pages[] = 'menu';
}
/**
* @param array $opts Options:
* - mailbox: (string) The mailbox to link to.
*/
static public function url(array $opts = array())
{
$opts = array_merge(array('mailbox' => 'INBOX'), $opts);
return IMP_Mailbox::get($opts['mailbox'])->url('minimal')->add('page', 'mailbox');
}
}