Implement full notes display and editing from mail view
This commit is contained in:
parent
e0bc40f160
commit
f0ecee1e58
6 changed files with 272 additions and 52 deletions
|
@ -34,6 +34,7 @@ class kolab_notes extends rcube_plugin
|
||||||
private $lists;
|
private $lists;
|
||||||
private $folders;
|
private $folders;
|
||||||
private $cache = array();
|
private $cache = array();
|
||||||
|
private $message_notes = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required startup method of a Roundcube plugin
|
* Required startup method of a Roundcube plugin
|
||||||
|
@ -68,6 +69,8 @@ class kolab_notes extends rcube_plugin
|
||||||
$this->rc->load_language($_SESSION['language'], array('notes.notes' => $this->gettext('navtitle'))); // add label for task title
|
$this->rc->load_language($_SESSION['language'], array('notes.notes' => $this->gettext('navtitle'))); // add label for task title
|
||||||
|
|
||||||
if ($args['task'] == 'notes') {
|
if ($args['task'] == 'notes') {
|
||||||
|
$this->add_hook('storage_init', array($this, 'storage_init'));
|
||||||
|
|
||||||
// register task actions
|
// register task actions
|
||||||
$this->register_action('index', array($this, 'notes_view'));
|
$this->register_action('index', array($this, 'notes_view'));
|
||||||
$this->register_action('fetch', array($this, 'notes_fetch'));
|
$this->register_action('fetch', array($this, 'notes_fetch'));
|
||||||
|
@ -77,6 +80,8 @@ class kolab_notes extends rcube_plugin
|
||||||
$this->register_action('dialog-ui', array($this, 'dialog_view'));
|
$this->register_action('dialog-ui', array($this, 'dialog_view'));
|
||||||
}
|
}
|
||||||
else if ($args['task'] == 'mail') {
|
else if ($args['task'] == 'mail') {
|
||||||
|
$this->add_hook('storage_init', array($this, 'storage_init'));
|
||||||
|
$this->add_hook('message_load', array($this, 'mail_message_load'));
|
||||||
$this->add_hook('message_compose', array($this, 'mail_message_compose'));
|
$this->add_hook('message_compose', array($this, 'mail_message_compose'));
|
||||||
$this->add_hook('template_object_messagebody', array($this, 'mail_messagebody_html'));
|
$this->add_hook('template_object_messagebody', array($this, 'mail_messagebody_html'));
|
||||||
|
|
||||||
|
@ -93,18 +98,35 @@ class kolab_notes extends rcube_plugin
|
||||||
))),
|
))),
|
||||||
'messagemenu');
|
'messagemenu');
|
||||||
|
|
||||||
$this->api->output->add_label('kolab_notes.appendnote', 'save', 'cancel');
|
$this->api->output->add_label('kolab_notes.appendnote', 'kolab_notes.editnote', 'kolab_notes.deletenotesconfirm', 'kolab_notes.entertitle', 'save', 'delete', 'cancel', 'close');
|
||||||
$this->include_script('notes_mail.js');
|
$this->include_script('notes_mail.js');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->rc->output->ajax_call && (!$this->rc->output->env['framed'] || in_array($args['action'], array('folder-acl','dialog-ui')))) {
|
if (!$this->rc->output->ajax_call && (!$this->rc->output->env['framed'] || in_array($args['action'], array('folder-acl','dialog-ui')))) {
|
||||||
require_once($this->home . '/kolab_notes_ui.php');
|
$this->load_ui();
|
||||||
$this->ui = new kolab_notes_ui($this);
|
|
||||||
$this->ui->init();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook into IMAP FETCH HEADER.FIELDS command and request MESSAGE-ID
|
||||||
|
*/
|
||||||
|
public function storage_init($p)
|
||||||
|
{
|
||||||
|
$p['fetch_headers'] = trim($p['fetch_headers'] . ' MESSAGE-ID');
|
||||||
|
return $p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and initialize UI class
|
||||||
|
*/
|
||||||
|
private function load_ui()
|
||||||
|
{
|
||||||
|
require_once($this->home . '/kolab_notes_ui.php');
|
||||||
|
$this->ui = new kolab_notes_ui($this);
|
||||||
|
$this->ui->init();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read available calendars for the current user and store them internally
|
* Read available calendars for the current user and store them internally
|
||||||
*/
|
*/
|
||||||
|
@ -205,8 +227,8 @@ class kolab_notes extends rcube_plugin
|
||||||
|
|
||||||
// attempt to create a default folder for this user
|
// attempt to create a default folder for this user
|
||||||
if (empty($this->lists)) {
|
if (empty($this->lists)) {
|
||||||
#if ($this->create_list(array('name' => 'Tasks', 'color' => '0000CC', 'default' => true)))
|
$folder = kolab_storage::folder_update(array('name' => 'Notes', 'type' => 'note', 'default' => true, 'subscribed' => true));
|
||||||
# $this->_read_lists(true);
|
$this->_read_lists(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->lists;
|
return $this->lists;
|
||||||
|
@ -234,10 +256,10 @@ class kolab_notes extends rcube_plugin
|
||||||
// resolve message reference
|
// resolve message reference
|
||||||
if ($msgref = rcube_utils::get_input_value('_msg', RCUBE_INPUT_GPC, true)) {
|
if ($msgref = rcube_utils::get_input_value('_msg', RCUBE_INPUT_GPC, true)) {
|
||||||
$storage = $this->rc->get_storage();
|
$storage = $this->rc->get_storage();
|
||||||
$storage->set_options(array('all_headers' => true));
|
|
||||||
list($uid, $folder) = explode('-', $msgref, 2);
|
list($uid, $folder) = explode('-', $msgref, 2);
|
||||||
if ($message = $storage->get_message_headers($msgref)) {
|
if ($message = $storage->get_message_headers($msgref)) {
|
||||||
$this->rc->output->set_env('kolab_notes_template', array(
|
$this->rc->output->set_env('kolab_notes_template', array(
|
||||||
|
'_from_mail' => true,
|
||||||
'title' => $message->get('subject'),
|
'title' => $message->get('subject'),
|
||||||
'links' => array(array(
|
'links' => array(array(
|
||||||
'uri' => $this->get_message_uri($message, $folder),
|
'uri' => $this->get_message_uri($message, $folder),
|
||||||
|
@ -346,7 +368,7 @@ class kolab_notes extends rcube_plugin
|
||||||
|
|
||||||
// encode for client use
|
// encode for client use
|
||||||
if (is_array($data)) {
|
if (is_array($data)) {
|
||||||
$this->_client_encode($data);
|
$this->_client_encode($data, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->rc->output->command('plugin.render_note', $data);
|
$this->rc->output->command('plugin.render_note', $data);
|
||||||
|
@ -393,7 +415,7 @@ class kolab_notes extends rcube_plugin
|
||||||
/**
|
/**
|
||||||
* Helper method to encode the given note record for use in the client
|
* Helper method to encode the given note record for use in the client
|
||||||
*/
|
*/
|
||||||
private function _client_encode(&$note)
|
private function _client_encode(&$note, $resolve = false)
|
||||||
{
|
{
|
||||||
foreach ($note as $key => $prop) {
|
foreach ($note as $key => $prop) {
|
||||||
if ($key[0] == '_' || $key == 'x-custom') {
|
if ($key[0] == '_' || $key == 'x-custom') {
|
||||||
|
@ -413,6 +435,14 @@ class kolab_notes extends rcube_plugin
|
||||||
$note['html'] = $this->_wash_html($note['description']);
|
$note['html'] = $this->_wash_html($note['description']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// resolve message links
|
||||||
|
if (is_array($note['links'])) {
|
||||||
|
$me = $this;
|
||||||
|
$note['links'] = array_map(function($link) use ($me, $resolve){
|
||||||
|
return $me->get_message_reference($link, $resolve) ?: array('uri' => $link);
|
||||||
|
}, $note['links']);
|
||||||
|
}
|
||||||
|
|
||||||
return $note;
|
return $note;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,11 +710,47 @@ class kolab_notes extends rcube_plugin
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for 'messagebody_html' hooks
|
* Lookup backend storage and find notes tagged with the given message-ID
|
||||||
|
*/
|
||||||
|
public function mail_message_load($p)
|
||||||
|
{
|
||||||
|
$this->message = $p['object'];
|
||||||
|
$this->message_notes = array();
|
||||||
|
|
||||||
|
// TODO: only query for notes if message was flagged with $KolabNotes ?
|
||||||
|
|
||||||
|
$message_id = trim($p['object']->headers->messageID, '<> ');
|
||||||
|
if ($message_id && $p['object']->uid) {
|
||||||
|
$query = array(array('tags','=','ref:' . $message_id));
|
||||||
|
foreach (kolab_storage::select($query, 'note') as $record) {
|
||||||
|
$record['list'] = kolab_storage::folder_id($record['_mailbox']);
|
||||||
|
$this->message_notes[] = $record;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for 'messagebody_html' hook
|
||||||
*/
|
*/
|
||||||
public function mail_messagebody_html($args)
|
public function mail_messagebody_html($args)
|
||||||
{
|
{
|
||||||
|
$html = '';
|
||||||
|
foreach ($this->message_notes as $note) {
|
||||||
|
$html .= html::a(array(
|
||||||
|
'href' => $this->rc->url(array('task' => 'notes', '_list' => $note['list'], '_id' => $note['uid'])),
|
||||||
|
'class' => 'kolabnotesref',
|
||||||
|
'rel' => $note['uid'] . '@' . $note['list'],
|
||||||
|
'target' => '_blank',
|
||||||
|
), Q($note['title']));
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepend note links to message body
|
||||||
|
if ($html) {
|
||||||
|
$this->load_ui();
|
||||||
|
$args['content'] = html::div('kolabmessagenotes', $html) . $args['content'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $args;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -714,7 +780,7 @@ class kolab_notes extends rcube_plugin
|
||||||
'Subject' => $note['title'],
|
'Subject' => $note['title'],
|
||||||
'Date' => $note['changed']->format('r'),
|
'Date' => $note['changed']->format('r'),
|
||||||
));
|
));
|
||||||
console($note);
|
|
||||||
if ($this->is_html($note)) {
|
if ($this->is_html($note)) {
|
||||||
$message->setHTMLBody($note['description']);
|
$message->setHTMLBody($note['description']);
|
||||||
|
|
||||||
|
@ -735,9 +801,79 @@ class kolab_notes extends rcube_plugin
|
||||||
return $message->getMessage();
|
return $message->getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a URI representing the given message reference
|
||||||
|
*/
|
||||||
private function get_message_uri($headers, $folder)
|
private function get_message_uri($headers, $folder)
|
||||||
{
|
{
|
||||||
return sprintf('imap://%s/%s#%s', $headers->folder ?: $folder, $headers->uid, urlencode($headers->messageID));
|
return sprintf('imap://%s/%s?message-id=%s&subject=%s',
|
||||||
|
$headers->folder ?: $folder,
|
||||||
|
$headers->uid,
|
||||||
|
urlencode($headers->messageID),
|
||||||
|
urlencode($headers->get('subject'))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract message reference components from the given URI
|
||||||
|
*/
|
||||||
|
private function parse_message_uri($uri)
|
||||||
|
{
|
||||||
|
$url = parse_url($uri);
|
||||||
|
if ($url['scheme'] == 'imap') {
|
||||||
|
parse_str($url['query'], $param);
|
||||||
|
$linkref = array(
|
||||||
|
'uri' => $uri,
|
||||||
|
'message_id' => $param['message-id'] ?: urldecode($url['fragment']),
|
||||||
|
'subject' => $param['subject'],
|
||||||
|
);
|
||||||
|
|
||||||
|
$path = explode('/', $url['host'] . $url['path']);
|
||||||
|
$linkref['msguid'] = array_pop($path);
|
||||||
|
$linkref['folder'] = join('/', $path);
|
||||||
|
|
||||||
|
return $linkref;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve the email message reference from the given URI
|
||||||
|
*/
|
||||||
|
public function get_message_reference($uri, $resolve = false)
|
||||||
|
{
|
||||||
|
if ($linkref = $this->parse_message_uri($uri)) {
|
||||||
|
// fetch message subject
|
||||||
|
if ($resolve || empty($linkref['subject'])) {
|
||||||
|
$imap = $this->rc->get_storage();
|
||||||
|
if (!($message = $imap->get_message_headers($linrkef['msguid'], $linkref['folder']))) {
|
||||||
|
// try to find message using the message_id fragment
|
||||||
|
$index = $imap->search_once($imap->list_folders_subscribed('', '*', 'mail', null, true), 'HEADER MESSAGE-ID ' . $linkref['message_id']);
|
||||||
|
if ($index->count()) {
|
||||||
|
$uid = reset($index->get());
|
||||||
|
$folder = $index->get_parameters('MAILBOX');
|
||||||
|
if ($message = $imap->get_message_headers($uid, $folder)) {
|
||||||
|
// replace metadata
|
||||||
|
$linkref['subject'] = $message->get('subject');
|
||||||
|
$linkref['msguid'] = $message->uid;
|
||||||
|
$linkref['folder'] = $message->folder;
|
||||||
|
$linkref['uri'] = $this->get_message_uri($message, $folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$linkref['mailurl'] = $this->rc->url(array(
|
||||||
|
'task' => 'mail',
|
||||||
|
'action' => 'show',
|
||||||
|
'mbox' => $linkref['folder'],
|
||||||
|
'uid' => $linkref['msguid'],
|
||||||
|
'rel' => 'note',
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $linkref;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -749,6 +885,14 @@ class kolab_notes extends rcube_plugin
|
||||||
|
|
||||||
// TODO: handle attachments
|
// TODO: handle attachments
|
||||||
|
|
||||||
|
// convert link references into simple URIs
|
||||||
|
if (array_key_exists('links', $note)) {
|
||||||
|
$object['links'] = array_map(function($link){ return is_array($link) ? $link['uri'] : strval($link); }, $note['links']);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$object['links'] = $old['links'];
|
||||||
|
}
|
||||||
|
|
||||||
// clean up HTML content
|
// clean up HTML content
|
||||||
$object['description'] = $this->_wash_html($note['description']);
|
$object['description'] = $this->_wash_html($note['description']);
|
||||||
$is_html = true;
|
$is_html = true;
|
||||||
|
|
|
@ -24,7 +24,8 @@ $labels['tabsharing'] = 'Sharing';
|
||||||
$labels['discard'] = 'Discard';
|
$labels['discard'] = 'Discard';
|
||||||
$labels['abort'] = 'Abort';
|
$labels['abort'] = 'Abort';
|
||||||
$labels['unsavedchanges'] = 'Unsaved Changes!';
|
$labels['unsavedchanges'] = 'Unsaved Changes!';
|
||||||
$labels['appendnote'] = 'Add a note';
|
$labels['appendnote'] = 'Add a Note';
|
||||||
|
$labels['editnote'] = 'Edit Note';
|
||||||
$labels['savein'] = 'Save in';
|
$labels['savein'] = 'Save in';
|
||||||
|
|
||||||
$labels['savingdata'] = 'Saving data...';
|
$labels['savingdata'] = 'Saving data...';
|
||||||
|
|
|
@ -236,6 +236,7 @@ function rcube_kolab_notes_ui(settings)
|
||||||
function init_dialog()
|
function init_dialog()
|
||||||
{
|
{
|
||||||
rcmail.register_command('save', save_note, true);
|
rcmail.register_command('save', save_note, true);
|
||||||
|
rcmail.addEventListener('plugin.render_note', render_note);
|
||||||
rcmail.addEventListener('plugin.update_note', function(data){
|
rcmail.addEventListener('plugin.update_note', function(data){
|
||||||
data.id = rcmail.html_identifier_encode(data.uid);
|
data.id = rcmail.html_identifier_encode(data.uid);
|
||||||
notesdata[data.id] = data;
|
notesdata[data.id] = data;
|
||||||
|
@ -259,19 +260,24 @@ function rcube_kolab_notes_ui(settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
init_editor();
|
init_editor();
|
||||||
setTimeout(function(){
|
if (settings.selected_uid) {
|
||||||
me.selected_note = $.extend({
|
me.selected_list = settings.selected_list;
|
||||||
list: me.selected_list,
|
edit_note(settings.selected_uid);
|
||||||
uid: null,
|
}
|
||||||
title: rcmail.gettext('newnote','kolab_notes'),
|
else {
|
||||||
description: '',
|
setTimeout(function(){
|
||||||
categories: [],
|
me.selected_note = $.extend({
|
||||||
created: rcmail.gettext('now', 'kolab_notes'),
|
list: me.selected_list,
|
||||||
changed: rcmail.gettext('now', 'kolab_notes')
|
uid: null,
|
||||||
}, rcmail.env.kolab_notes_template || {});
|
title: rcmail.gettext('newnote','kolab_notes'),
|
||||||
render_note(me.selected_note);
|
description: '',
|
||||||
|
categories: [],
|
||||||
}, 100);
|
created: rcmail.gettext('now', 'kolab_notes'),
|
||||||
|
changed: rcmail.gettext('now', 'kolab_notes')
|
||||||
|
}, rcmail.env.kolab_notes_template || {});
|
||||||
|
render_note(me.selected_note);
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.init_dialog = init_dialog;
|
this.init_dialog = init_dialog;
|
||||||
|
|
||||||
|
@ -319,16 +325,7 @@ function rcube_kolab_notes_ui(settings)
|
||||||
|
|
||||||
// register click handler for message links
|
// register click handler for message links
|
||||||
$(rcmail.gui_objects.notesattachmentslist).on('click', 'li a.messagelink', function(){
|
$(rcmail.gui_objects.notesattachmentslist).on('click', 'li a.messagelink', function(){
|
||||||
var uri = $(this).attr('rel');
|
rcmail.open_window(this.href);
|
||||||
if (uri && uri.match(/imap:\/\/.+/)) {
|
|
||||||
var path = uri.split('#')[0].substr(7).split('/'),
|
|
||||||
uid = path.pop(),
|
|
||||||
folder = path.join('/');
|
|
||||||
if (folder && uid) {
|
|
||||||
rcmail.open_window(rcmail.url('mail/show', { _mbox: folder, _uid: uid, _rel: 'note' }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -715,13 +712,14 @@ function rcube_kolab_notes_ui(settings)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var list = me.notebooks[data.list] || me.notebooks[me.selected_list];
|
var list = me.notebooks[data.list] || me.notebooks[me.selected_list] || {};
|
||||||
content = $('#notecontent').val(data.description),
|
content = $('#notecontent').val(data.description),
|
||||||
readonly = data.readonly || !list.editable,
|
readonly = data.readonly || !list.editable,
|
||||||
attachmentslist = $(rcmail.gui_objects.notesattachmentslist).html('');
|
attachmentslist = $(rcmail.gui_objects.notesattachmentslist).html('');
|
||||||
$('.notetitle', rcmail.gui_objects.noteviewtitle).val(data.title).prop('disabled', readonly);
|
$('.notetitle', rcmail.gui_objects.noteviewtitle).val(data.title).prop('disabled', readonly);
|
||||||
$('.dates .notecreated', rcmail.gui_objects.noteviewtitle).html(Q(data.created || ''));
|
$('.dates .notecreated', rcmail.gui_objects.noteviewtitle).html(Q(data.created || ''));
|
||||||
$('.dates .notechanged', rcmail.gui_objects.noteviewtitle).html(Q(data.changed || ''));
|
$('.dates .notechanged', rcmail.gui_objects.noteviewtitle).html(Q(data.changed || ''));
|
||||||
|
$(rcmail.gui_objects.notebooks).filter('select').val(list.id);
|
||||||
if (data.created || data.changed) {
|
if (data.created || data.changed) {
|
||||||
$('.dates', rcmail.gui_objects.noteviewtitle).show();
|
$('.dates', rcmail.gui_objects.noteviewtitle).show();
|
||||||
}
|
}
|
||||||
|
@ -753,15 +751,24 @@ function rcube_kolab_notes_ui(settings)
|
||||||
|
|
||||||
if (data.links) {
|
if (data.links) {
|
||||||
$.each(data.links, function(i, link){
|
$.each(data.links, function(i, link){
|
||||||
$('<li>').addClass('link')
|
var li = $('<li>').addClass('link')
|
||||||
.addClass('message eml')
|
.addClass('message eml')
|
||||||
.append($('<a>')
|
.append($('<a>')
|
||||||
.attr('href', '#show')
|
.attr('href', link.mailurl)
|
||||||
.attr('rel', link.uri)
|
|
||||||
.addClass('messagelink')
|
.addClass('messagelink')
|
||||||
.html(Q(link.subject || link.message_id || link.uri))
|
.html(Q(link.subject || link.message_id || link.uri))
|
||||||
)
|
)
|
||||||
.appendTo(attachmentslist);
|
.appendTo(attachmentslist);
|
||||||
|
/*
|
||||||
|
if (!readonly && !data._from_mail) {
|
||||||
|
$('<a>')
|
||||||
|
.attr('href', '#delete')
|
||||||
|
.attr('title', rcmail.gettext('delete'))
|
||||||
|
.addClass('delete')
|
||||||
|
.html(rcmail.gettext('delete'))
|
||||||
|
.appendTo(li);
|
||||||
|
}
|
||||||
|
*/
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -770,6 +777,9 @@ function rcube_kolab_notes_ui(settings)
|
||||||
.on('click', function(){ $('.tagline .placeholder').hide(); });
|
.on('click', function(){ $('.tagline .placeholder').hide(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!data.list)
|
||||||
|
data.list = list.id;
|
||||||
|
|
||||||
me.selected_note = data;
|
me.selected_note = data;
|
||||||
me.selected_note.id = rcmail.html_identifier_encode(data.uid);
|
me.selected_note.id = rcmail.html_identifier_encode(data.uid);
|
||||||
rcmail.enable_command('save', list.editable && !data.readonly);
|
rcmail.enable_command('save', list.editable && !data.readonly);
|
||||||
|
@ -781,7 +791,7 @@ function rcube_kolab_notes_ui(settings)
|
||||||
html = text2html(html);
|
html = text2html(html);
|
||||||
}
|
}
|
||||||
|
|
||||||
var node, editor = tinyMCE.get('notecontent');
|
var node, editor = tinyMCE.get('notecontent'), is_html = false;
|
||||||
if (!readonly && editor) {
|
if (!readonly && editor) {
|
||||||
$(rcmail.gui_objects.notesdetailview).hide();
|
$(rcmail.gui_objects.notesdetailview).hide();
|
||||||
$(rcmail.gui_objects.noteseditform).show();
|
$(rcmail.gui_objects.noteseditform).show();
|
||||||
|
@ -795,13 +805,17 @@ function rcube_kolab_notes_ui(settings)
|
||||||
$('.notetitle', rcmail.gui_objects.noteviewtitle).focus().select();
|
$('.notetitle', rcmail.gui_objects.noteviewtitle).focus().select();
|
||||||
|
|
||||||
// read possibly re-formatted content back from editor for later comparison
|
// read possibly re-formatted content back from editor for later comparison
|
||||||
me.selected_note.description = editor.getContent({ format:'html' })
|
me.selected_note.description = editor.getContent({ format:'html' });
|
||||||
|
is_html = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$(rcmail.gui_objects.noteseditform).hide();
|
$(rcmail.gui_objects.noteseditform).hide();
|
||||||
$(rcmail.gui_objects.notesdetailview).html(html).show();
|
$(rcmail.gui_objects.notesdetailview).html(html).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// notify subscribers
|
||||||
|
rcmail.triggerEvent('kolab_notes_render', { data:data, readonly:readonly, html:is_html });
|
||||||
|
|
||||||
// Trigger resize (needed for proper editor resizing)
|
// Trigger resize (needed for proper editor resizing)
|
||||||
$(window).resize();
|
$(window).resize();
|
||||||
}
|
}
|
||||||
|
@ -1010,6 +1024,11 @@ function rcube_kolab_notes_ui(settings)
|
||||||
if (me.selected_note.links)
|
if (me.selected_note.links)
|
||||||
savedata.links = me.selected_note.links;
|
savedata.links = me.selected_note.links;
|
||||||
|
|
||||||
|
// add reference to old list if changed
|
||||||
|
if (me.selected_note.list && savedata.list != me.selected_note.list) {
|
||||||
|
savedata._fromlist = me.selected_note.list;
|
||||||
|
}
|
||||||
|
|
||||||
// do some input validation
|
// do some input validation
|
||||||
if (savedata.title == '') {
|
if (savedata.title == '') {
|
||||||
alert(rcmail.gettext('entertitle', 'kolab_notes'));
|
alert(rcmail.gettext('entertitle', 'kolab_notes'));
|
||||||
|
@ -1032,11 +1051,12 @@ function rcube_kolab_notes_ui(settings)
|
||||||
*/
|
*/
|
||||||
function get_save_data()
|
function get_save_data()
|
||||||
{
|
{
|
||||||
var editor = tinyMCE.get('notecontent');
|
var editor = tinyMCE.get('notecontent'),
|
||||||
|
listselect = $('option:selected', rcmail.gui_objects.notebooks);
|
||||||
var savedata = {
|
var savedata = {
|
||||||
title: trim($('.notetitle', rcmail.gui_objects.noteviewtitle).val()),
|
title: trim($('.notetitle', rcmail.gui_objects.noteviewtitle).val()),
|
||||||
description: editor ? editor.getContent({ format:'html' }) : $('#notecontent').val(),
|
description: editor ? editor.getContent({ format:'html' }) : $('#notecontent').val(),
|
||||||
list: me.selected_note.list || me.selected_list,
|
list: listselect.length ? listselect.val() : me.selected_note.list || me.selected_list,
|
||||||
uid: me.selected_note.uid,
|
uid: me.selected_note.uid,
|
||||||
categories: []
|
categories: []
|
||||||
};
|
};
|
||||||
|
@ -1068,7 +1088,8 @@ function rcube_kolab_notes_ui(settings)
|
||||||
|
|
||||||
return savedata.title != me.selected_note.title
|
return savedata.title != me.selected_note.title
|
||||||
|| savedata.description != me.selected_note.description
|
|| savedata.description != me.selected_note.description
|
||||||
|| savedata.categories.join(',') != (me.selected_note.categories || []).join(',');
|
|| savedata.categories.join(',') != (me.selected_note.categories || []).join(',')
|
||||||
|
|| savedata.list != me.selected_note.list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -103,7 +103,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.notesview .toolbarmenu.iconized .selected span.icon {
|
.notesview .toolbarmenu.iconized .selected span.icon {
|
||||||
background: url(sprites.png) -5px -109px no-repeat;
|
background: url(sprites.png) -4px -110px no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notesview #notedetailsbox {
|
.notesview #notedetailsbox {
|
||||||
|
@ -137,16 +137,18 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notesdialog #noteform {
|
|
||||||
bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notesview #notedetails {
|
.notesview #notedetails {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
-moz-box-sizing: border-box;
|
-moz-box-sizing: border-box;
|
||||||
-ms-box-sizing: border-box;
|
-ms-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
border-bottom: 1px solid #dfdfdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notesdialog #noteform,
|
||||||
|
.notesdialog #notedetails {
|
||||||
|
bottom: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notesview #notedetails pre {
|
.notesview #notedetails pre {
|
||||||
|
@ -266,12 +268,16 @@
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 41px;
|
||||||
height: 27px;
|
height: 27px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notesdialog #notereferences {
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.notesview #notebooks li {
|
.notesview #notebooks li {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
@ -370,3 +376,41 @@
|
||||||
-ms-box-sizing: border-box;
|
-ms-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notesview .attachmentslist li.message.eml {
|
||||||
|
display: inline-block;
|
||||||
|
background-image: url(sprites.png);
|
||||||
|
background-position: -6px -128px;
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notesview .attachmentslist li.message a.messagelink {
|
||||||
|
padding-left: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.toolbarmenu li .appendnote span.icon {
|
||||||
|
background-image: url(sprites.png);
|
||||||
|
background-position: -4px -170px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.kolabmessagenotes {
|
||||||
|
margin: 8px 8px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border: 1px solid #dfdfdf;
|
||||||
|
background: #fafafa;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.kolabmessagenotes a.kolabnotesref {
|
||||||
|
display: inline-block;
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 3px 15px 2px 22px;
|
||||||
|
text-shadow: 0px 1px 1px #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
max-width: 12em;
|
||||||
|
background: url(sprites.png) -6px -151px no-repeat;
|
||||||
|
}
|
Binary file not shown.
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 4.6 KiB |
|
@ -60,6 +60,9 @@
|
||||||
<roundcube:object name="plugin.notetitle" id="notedetailstitle" class="boxtitle" />
|
<roundcube:object name="plugin.notetitle" id="notedetailstitle" class="boxtitle" />
|
||||||
<roundcube:object name="plugin.editform" id="noteform" />
|
<roundcube:object name="plugin.editform" id="noteform" />
|
||||||
<roundcube:object name="plugin.detailview" id="notedetails" class="scroller" />
|
<roundcube:object name="plugin.detailview" id="notedetails" class="scroller" />
|
||||||
|
<div id="notereferences">
|
||||||
|
<roundcube:object name="plugin.attachments_list" id="attachment-list" class="attachmentslist" />
|
||||||
|
</div>
|
||||||
<div class="footerleft formbuttons">
|
<div class="footerleft formbuttons">
|
||||||
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
|
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -115,9 +118,16 @@ $(document).ready(function(e){
|
||||||
var form = $('#noteform, #notedetails'),
|
var form = $('#noteform, #notedetails'),
|
||||||
content = $('#notecontent'),
|
content = $('#notecontent'),
|
||||||
header = $('#notedetailstitle'),
|
header = $('#notedetailstitle'),
|
||||||
|
footer = $('#notereferences'),
|
||||||
w, h;
|
w, h;
|
||||||
|
|
||||||
|
if ($('#attachment-list li').length)
|
||||||
|
footer.show();
|
||||||
|
else
|
||||||
|
footer.hide();
|
||||||
|
|
||||||
form.css('top', header.outerHeight()+'px');
|
form.css('top', header.outerHeight()+'px');
|
||||||
|
form.css('bottom', ((footer.is(':visible') ? footer.outerHeight()+4 : 0) + 41) + 'px');
|
||||||
|
|
||||||
w = form.outerWidth();
|
w = form.outerWidth();
|
||||||
h = form.outerHeight();
|
h = form.outerHeight();
|
||||||
|
|
Loading…
Add table
Reference in a new issue