Fix create, delete and drop orphan tags

This commit is contained in:
Matias De lellis
2019-11-12 10:00:55 -03:00
parent 9bf99436bc
commit c69f21f524
5 changed files with 48 additions and 15 deletions

View File

@@ -145,6 +145,7 @@ class NoteController extends Controller {
* @param int $id * @param int $id
* @param string $title * @param string $title
* @param string $content * @param string $content
* @param array $tags
* @param string $color * @param string $color
*/ */
public function update($id, $title, $content, $tags, $color = "#F7EB96") { public function update($id, $title, $content, $tags, $color = "#F7EB96") {
@@ -166,24 +167,31 @@ class NoteController extends Controller {
} }
// Delete old tag relations // Delete old tag relations
$noteTags = $this->tagmapper->getTagsForNote($this->userId, $id); $dbTags = $this->tagmapper->getTagsForNote($this->userId, $id);
foreach ($noteTags as $tag) { foreach ($dbTags as $dbTag) {
if (!in_array($tag->getName(), $tags)) { $delete = true;
$hnotetag = $this->notetagmapper->findNoteTag($this->userId, $id, $tag->getId()); foreach ($tags as $tag) {
if ($dbTag->getId() == $tag['id']) {
$delete = false;
break;
}
}
if ($delete) {
$hnotetag = $this->notetagmapper->findNoteTag($this->userId, $id, $dbTag->getId());
$this->notetagmapper->delete($hnotetag); $this->notetagmapper->delete($hnotetag);
} }
} }
// Add new tags and update relations. // Add new tags and update relations.
foreach ($tags as $name) { foreach ($tags as $tag) {
if (!$this->tagmapper->tagExists($this->userId, $name)) { if (!$this->tagmapper->tagExists($this->userId, $tag['name'])) {
$htag = new Tag(); $htag = new Tag();
$htag->setName($name); $htag->setName($tag['name']);
$htag->setUserId($this->userId); $htag->setUserId($this->userId);
$htag = $this->tagmapper->insert($htag); $htag = $this->tagmapper->insert($htag);
} }
else { else {
$htag = $this->tagmapper->getTag($this->userId, $name); $htag = $this->tagmapper->getTag($this->userId, $tag['name']);
} }
if (!$this->notetagmapper->noteTagExists($this->userId, $id, $htag->getId())) { if (!$this->notetagmapper->noteTagExists($this->userId, $id, $htag->getId())) {
@@ -195,6 +203,9 @@ class NoteController extends Controller {
} }
} }
// Purge orphan tags.
$this->tagmapper->dropOld();
// Set new info on Note // Set new info on Note
$note->setTitle($title); $note->setTitle($title);
$note->setContent($content); $note->setContent($content);

View File

@@ -240,6 +240,10 @@ div[contenteditable="true"] {
display: block !important; display: block !important;
} }
.select2-results .select2-selected {
display: none !important;
}
.select2-container { .select2-container {
min-width: 200px; min-width: 200px;
} }

View File

@@ -43,4 +43,9 @@ class TagMapper extends Mapper {
return true; return true;
} }
public function dropOld () {
$sql = 'DELETE FROM *PREFIX*quicknotes_tags WHERE ';
$sql.= 'id NOT IN (SELECT tag_id FROM *PREFIX*quicknotes_note_tags)';
return $this->execute($sql, []);
}
} }

View File

@@ -46,12 +46,19 @@ const QnDialogs = {
input.select2({ input.select2({
placeholder: t('quicknotes', 'Enter tag name'), placeholder: t('quicknotes', 'Enter tag name'),
tokenSeparators: ',', tokenSeparators: ',',
tags: currentTags.map(function (value) { return value.name; }), multiple: false,
allowClear: true, allowClear: true,
toggleSelect: true toggleSelect: true,
tags : function () {
var data = [];
currentTags.forEach(function (item, index) {
data.push({id: item.id, text: item.name});
});
return data;
}
}); });
input.val(selectedTags.map(function (value) { return value.name; })); input.val(selectedTags.map(function (value) { return value.id; }));
input.trigger("change"); input.trigger("change");
// wrap callback in _.once(): // wrap callback in _.once():
@@ -66,7 +73,7 @@ const QnDialogs = {
click: function () { click: function () {
input.select2('close'); input.select2('close');
if (callback !== undefined) { if (callback !== undefined) {
callback(false, input.select2("val")); callback(false, input.select2("data"));
} }
$(dialogId).ocdialog('close'); $(dialogId).ocdialog('close');
} }
@@ -75,7 +82,7 @@ const QnDialogs = {
click: function () { click: function () {
input.select2('close'); input.select2('close');
if (callback !== undefined) { if (callback !== undefined) {
callback(true, input.select2("val")); callback(true, input.select2("data"));
} }
$(dialogId).ocdialog('close'); $(dialogId).ocdialog('close');
}, },

View File

@@ -330,7 +330,10 @@ View.prototype = {
var content = $('#modal-note-div #content-editable').html().trim(); var content = $('#modal-note-div #content-editable').html().trim();
var color = this.colorToHex($("#modal-note-div .quicknote").css("background-color")); var color = this.colorToHex($("#modal-note-div .quicknote").css("background-color"));
var tags = $("#modal-note-div .slim-tag").toArray().map(function (value) { var tags = $("#modal-note-div .slim-tag").toArray().map(function (value) {
return value.textContent.trim(); return {
id: value.getAttribute('data-id'),
name: value.textContent.trim()
};
}); });
/* /*
@@ -352,6 +355,7 @@ View.prototype = {
var modalnote = $("#modal-note-div .quicknote"); var modalnote = $("#modal-note-div .quicknote");
var modaltitle = $('#modal-note-div #title-editable'); var modaltitle = $('#modal-note-div #title-editable');
var modalcontent = $('#modal-note-div #content-editable'); var modalcontent = $('#modal-note-div #content-editable');
var modaltags = $('#modal-note-div .note-tags');
self._notes.unsetActive(); self._notes.unsetActive();
@@ -361,6 +365,7 @@ View.prototype = {
modalnote.data('id', -1); modalnote.data('id', -1);
modaltitle.html(""); modaltitle.html("");
modalcontent.html(""); modalcontent.html("");
modaltags.html("");
self.render(); self.render();
}).fail(function () { }).fail(function () {
@@ -632,7 +637,8 @@ View.prototype = {
var modalTags = $('#modal-note-div .note-tags'); var modalTags = $('#modal-note-div .note-tags');
modalTags.html(''); modalTags.html('');
newTags.forEach(function (item, index) { newTags.forEach(function (item, index) {
var tag = $('<div class="slim-tag" data-id="-1">' + item + '</div>'); var noteId = parseInt(item.id) || -1;
var tag = $('<div class="slim-tag" data-id="' + noteId + '">' + item.text + '</div>');
modalTags.append(tag); modalTags.append(tag);
}); });
} }