mirror of
https://github.com/JanGross/quicknotes.git
synced 2025-11-30 23:37:16 +01:00
Fix create, delete and drop orphan tags
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, []);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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');
|
||||||
},
|
},
|
||||||
|
|||||||
10
js/script.js
10
js/script.js
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user