diff --git a/plugins/kolab_notes/kolab_notes.php b/plugins/kolab_notes/kolab_notes.php
index 2dd3321a..8091d2cc 100644
--- a/plugins/kolab_notes/kolab_notes.php
+++ b/plugins/kolab_notes/kolab_notes.php
@@ -308,7 +308,7 @@ class kolab_notes extends rcube_plugin
public function get_note($note)
{
if (is_array($note)) {
- $uid = $note['id'] ?: $note['uid'];
+ $uid = $note['uid'] ?: $note['id'];
$list_id = $note['list'];
}
else {
@@ -459,7 +459,7 @@ class kolab_notes extends rcube_plugin
}
// generate new note object from input
- $object = $this->_write_preprocess($note, $old);# return false;
+ $object = $this->_write_preprocess($note, $old);
$saved = $folder->save($object, 'note', $note['uid']);
if (!$saved) {
@@ -639,8 +639,13 @@ class kolab_notes extends rcube_plugin
// copy meta data (starting with _) from old object
foreach ((array)$old as $key => $val) {
- if (!isset($object[$key]) && $key[0] == '_')
- $object[$key] = $val;
+ if (!isset($object[$key]) && $key[0] == '_')
+ $object[$key] = $val;
+ }
+
+ // make list of categories unique
+ if (is_array($object['categories'])) {
+ $object['categories'] = array_unique(array_filter($object['categories']));
}
unset($object['list'], $object['tempid'], $object['created'], $object['changed'], $object['created_'], $object['changed_']);
diff --git a/plugins/kolab_notes/notes.js b/plugins/kolab_notes/notes.js
index 530b2c35..05a0ffc9 100644
--- a/plugins/kolab_notes/notes.js
+++ b/plugins/kolab_notes/notes.js
@@ -33,6 +33,7 @@ function rcube_kolab_notes_ui(settings)
var tags = [];
var search_request;
var search_query;
+ var tag_draghelper;
var me = this;
/* public members */
@@ -702,7 +703,6 @@ function rcube_kolab_notes_ui(settings)
li = $('
').attr('rel', tag).data('value', tag)
.html(Q(tag) + '')
.appendTo(widget)
-/*
.draggable({
addClasses: false,
revert: 'invalid',
@@ -712,7 +712,6 @@ function rcube_kolab_notes_ui(settings)
appendTo: 'body',
cursor: 'pointer'
});
-*/
});
update_tagcloud();
@@ -768,6 +767,9 @@ function rcube_kolab_notes_ui(settings)
render_note(data);
render_tagslist(data.categories || []);
}
+ else if (data.categories) {
+ render_tagslist(data.categories);
+ }
// add list item on top
if (is_new) {
@@ -992,6 +994,78 @@ function rcube_kolab_notes_ui(settings)
}
}
+ /* Helper functions for drag & drop functionality of tags */
+
+ function tag_draggable_helper()
+ {
+ if (!tag_draghelper)
+ tag_draghelper = $('');
+ else
+ tag_draghelper.html('');
+
+ $(this).clone().addClass('tag').appendTo(tag_draghelper);
+ return tag_draghelper;
+ }
+
+ function tag_draggable_start(event, ui)
+ {
+ // register notes list to receive drop events
+ $('li', rcmail.gui_objects.noteslist).droppable({
+ hoverClass: 'droptarget',
+ accept: tag_droppable_accept,
+ drop: tag_draggable_dropped,
+ addClasses: false
+ });
+
+ // allow to drop tags onto edit form title
+ $(rcmail.gui_objects.noteviewtitle).droppable({
+ drop: function(event, ui){
+ $('#tagedit-input').val(ui.draggable.data('value')).trigger('transformToTag');
+ },
+ addClasses: false
+ })
+ }
+
+ function tag_droppable_accept(draggable)
+ {
+ if (rcmail.busy)
+ return false;
+
+ var tag = draggable.data('value'),
+ drop_id = $(this).attr('id').replace(/^rcmrow/, ''),
+ drop_rec = notesdata[drop_id];
+
+ // target already has this tag assigned
+ if (!drop_rec || (drop_rec.categories && $.inArray(tag, drop_rec.categories) >= 0)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ function tag_draggable_dropped(event, ui)
+ {
+ var drop_id = $(this).attr('id').replace(/^rcmrow/, ''),
+ tag = ui.draggable.data('value'),
+ rec = notesdata[drop_id],
+ savedata;
+
+ if (rec && rec.id) {
+ savedata = me.selected_note && rec.uid == me.selected_note.uid ? get_save_data() : $.extend({}, rec);
+
+ if (savedata.id) delete savedata.id;
+ if (savedata.html) delete savedata.html;
+
+ if (!savedata.categories)
+ savedata.categories = [];
+ savedata.categories.push(tag);
+
+ rcmail.lock_form(rcmail.gui_objects.noteseditform, true);
+ saving_lock = rcmail.set_busy(true, 'kolab_notes.savingdata');
+ rcmail.http_post('action', { _data: savedata, _do: 'edit' }, true);
+ }
+ }
+
}
diff --git a/plugins/kolab_notes/skins/larry/notes.css b/plugins/kolab_notes/skins/larry/notes.css
index 32a37921..1ff03f2b 100644
--- a/plugins/kolab_notes/skins/larry/notes.css
+++ b/plugins/kolab_notes/skins/larry/notes.css
@@ -228,6 +228,10 @@
background: none;
}
+.notesview .tag-draghelper {
+ z-index: 1000;
+}
+
.notesview #notedetailstitle .notecreated,
.notesview #notedetailstitle .notechanged {
display: inline-block;