diff --git a/plugins/Tags/webroot/css/tagging.css b/plugins/Tags/webroot/css/tagging.css new file mode 100644 index 0000000..260b4ce --- /dev/null +++ b/plugins/Tags/webroot/css/tagging.css @@ -0,0 +1,3 @@ +.tag { + filter: drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.5)); +} diff --git a/plugins/Tags/webroot/js/tagging.js b/plugins/Tags/webroot/js/tagging.js new file mode 100644 index 0000000..355f6a9 --- /dev/null +++ b/plugins/Tags/webroot/js/tagging.js @@ -0,0 +1,142 @@ +function createTagPicker(clicked) { + + function closePicker($select, $container) { + $select.appendTo($container) + $container.parent().find('.picker-container').remove() + } + + function getEditableButtons($select, $container) { + const $saveButton = $('').addClass(['btn btn-primary btn-sm', 'align-self-start']).attr('type', 'button') + .append($('').text('Save').addClass('text-nowrap').prepend($('').addClass('fa fa-save mr-1'))) + .click(function() { + const tags = $select.select2('data').map(tag => tag.text) + addTags($select.data('url'), tags, $(this)) + }) + const $cancelButton = $('').addClass(['btn btn-secondary btn-sm', 'align-self-start']).attr('type', 'button') + .append($('').text('Cancel').addClass('text-nowrap').prepend($('').addClass('fa fa-times mr-1'))) + .click(function() { + closePicker($select, $container) + }) + const $buttons = $('').addClass(['picker-action', 'btn-group']).append($saveButton, $cancelButton) + return $buttons + } + + const $clicked = $(clicked) + const $container = $clicked.closest('.tag-container') + const $select = $container.parent().find('select.tag-input').removeClass('d-none') + closePicker($select, $container) + const $pickerContainer = $('
').addClass(['picker-container', 'd-flex']) + + $select.prependTo($pickerContainer) + $pickerContainer.append(getEditableButtons($select, $container)) + $container.parent().append($pickerContainer) + initSelect2Picker($select) +} + +function deleteTag(url, tags, clicked) { + if (!Array.isArray(tags)) { + tags = [tags]; + } + const data = { + tag_list: JSON.stringify(tags) + } + const $statusNode = $(clicked).closest('.tag') + const APIOptions = { + statusNode: $statusNode, + skipFeedback: true, + } + return AJAXApi.quickFetchAndPostForm(url, data, APIOptions).then((apiResult) => { + let $container = $statusNode.closest('.tag-container-wrapper') + refreshTagList(apiResult, $container).then(($tagContainer) => { + $container = $tagContainer // old container might not exist anymore since it was replaced after the refresh + }) + const theToast = UI.toast({ + variant: 'success', + title: apiResult.message, + bodyHtml: $('
').append( + $('').text('Cancel untag operation.'), + $('').addClass(['btn btn-primary btn-sm', 'align-self-start']).attr('type', 'button') - .append($('').text('Save').addClass('text-nowrap').prepend($('').addClass('fa fa-save mr-1'))) - .click(function() { - const tags = $select.select2('data').map(tag => tag.text) - addTags($select.data('url'), tags, $(this)) - }) - const $cancelButton = $('').addClass(['btn btn-secondary btn-sm', 'align-self-start']).attr('type', 'button') - .append($('').text('Cancel').addClass('text-nowrap').prepend($('').addClass('fa fa-times mr-1'))) - .click(function() { - closePicker($select, $container) - }) - const $buttons = $('').addClass(['picker-action', 'btn-group']).append($saveButton, $cancelButton) - return $buttons - } - - const $clicked = $(clicked) - const $container = $clicked.closest('.tag-container') - const $select = $container.parent().find('select.tag-input').removeClass('d-none')//.addClass('flex-grow-1') - closePicker($select, $container) - const $pickerContainer = $('
').addClass(['picker-container', 'd-flex']) - - $select.prependTo($pickerContainer) - $pickerContainer.append(getEditableButtons($select, $container)) - $container.parent().append($pickerContainer) - initSelect2Picker($select) -} - -function deleteTag(url, tags, clicked) { - if (!Array.isArray(tags)) { - tags = [tags]; - } - const data = { - tag_list: JSON.stringify(tags) - } - const $statusNode = $(clicked).closest('.tag') - const APIOptions = { - statusNode: $statusNode, - skipFeedback: true, - } - return AJAXApi.quickFetchAndPostForm(url, data, APIOptions).then((apiResult) => { - let $container = $statusNode.closest('.tag-container-wrapper') - refreshTagList(apiResult, $container).then(($tagContainer) => { - $container = $tagContainer // old container might not exist anymore since it was replaced after the refresh - }) - const theToast = UI.toast({ - variant: 'success', - title: apiResult.message, - bodyHtml: $('
').append( - $('').text('Cancel untag operation.'), - $('