Как удалить аннотацию с помощью Wagtail Review и Annotator.js по нажатию кнопки?
Я работаю с Wagtail Review и Annotator.js в своем проекте. Я хочу добавить кнопку удаления (символ «X» внутри красного круга) к аннотациям, при нажатии на которую должна удаляться соответствующая аннотация. Я добавил кнопку удаления внутри элементов управления аннотацией, но у меня не получается правильно инициировать удаление.
Что у меня есть на данный момент:
- Я использую Annotator.js для создания и управления аннотациями. Аннотации появляются при наведении на родительский элемент (
annotator-outer annotator-viewer
). - Кнопка удаления динамически внедряется внутрь
.annotator-controls
span, когда аннотация становится видимой. - Я пытаюсь использовать событие click для запуска удаления аннотации, но я не уверен, как правильно вызвать функцию
Annotator.js
delete или правильно ли я обрабатываю взаимодействие внутри Wagtail Review.
Вот мой текущий подход:
- При наведении на родительскую аннотацию (
.annotator-outer.annotator-viewer
) я динамически добавляю кнопку удаления «X» внутри.annotator-controls
. - Я прикрепляю слушателя события click к кнопке удаления.
- Я ожидаю, что щелчок вызовет удаление аннотации с помощью Annotator.js.
Фрагмент кода:
document.addEventListener('DOMContentLoaded', (event) => {
function deleteAnnotation() {
console.log('Delete function triggered!');
// Assuming annotator.js method is accessible to delete the annotation
if (window.annotator && window.annotator.deleteSelected) {
window.annotator.deleteSelected();
console.log('Annotation deleted');
} else {
console.log('annotator.js method not found.');
}
}
function injectTextAndAddEvent(span) {
span.textContent = '×'; // Add delete button content
span.addEventListener('click', deleteAnnotation); // Attach click event
}
document.querySelectorAll('.annotator-outer.annotator-viewer').forEach(parentDiv => {
parentDiv.addEventListener('mouseenter', function() {
const span = parentDiv.querySelector('.annotator-controls');
if (span) {
injectTextAndAddEvent(span);
}
});
});
});
Проблема:
- Кнопка появляется, как и ожидалось, но нажатие на нее не удаляет аннотацию.
- Я не уверен, что использую правильный метод
Annotator.js
или есть лучший способ взаимодействия с аннотациями внутри фреймворка Wagtail Review.
С чем мне нужна помощь:
- Как правильно вызвать удаление аннотации с помощью Annotator.js при нажатии на кнопку удаления?
- Есть ли в Annotator.js или Wagtail Review конкретный метод, который я должен использовать для удаления аннотаций?
Буду признателен за любые соображения от человека, знакомого как с Annotator.js, так и с Wagtail Review.
Измените deleteAnnotation
, чтобы взять объект аннотации, и используйте removeAnnotation
, чтобы удалить его.
document.addEventListener('DOMContentLoaded', () => {
function deleteAnnotation(annotation) {
window.annotator?.removeAnnotation(annotation);
}
function injectDeleteButton(span, annotation) {
span.textContent = '×';
span.onclick = () => deleteAnnotation(annotation);
}
document.querySelectorAll('.annotator-outer.annotator-viewer').forEach(parent => {
parent.onmouseenter = () => {
const span = parent.querySelector('.annotator-controls');
const annotation = /* fetch the annotation */;
span && injectDeleteButton(span, annotation);
};
});
});
Чтобы удалить аннотацию как во фронтенде, так и в бэкенде, мы внесли изменения в JavaScript-код и представление Django annotations_api.py
.
Цель состоит в том, чтобы динамически удалять аннотацию как во фронт-энде, так и в бэк-энде, не требуя перезагрузки страницы.
Шаги по удалению аннотации
1. JavaScript (Frontend)
- Код JavaScript прослушивает события
mouseenter
иmouseleave
на элементах с классомannotator-outer annotator-viewer
. - При наведении на элемент аннотации он определяет ее ID и динамически прикрепляет событие удаления к кнопке «Удалить» в контейнере аннотации.
- При нажатии на кнопку удаления запускается API-запрос DELETE для удаления аннотации из бэкенда, а также удаляется подсветка аннотации на фронтенде.
Код на JavaScript
Объяснение кода JavaScript
- removeHighlight: Удаляет подсветку удаленной аннотации, ссылаясь на
data-annotation-id
. - deleteAnnotation: отправляет запрос DELETE на бэкенд и при успешном ответе удаляет подсветку аннотации.
- injectTextAndAddEvent: инжектирует функциональность удаления в кнопку управления аннотацией при наведении на нее курсора.
2. Обновление бэкенда Django (annotations_api.py)
Представление, отвечающее за обработку аннотаций в annotations_api.py
, обновлено, чтобы разрешить запросы DELETE.
Обновлено item
Просмотр в annotations_api.py
@never_cache
def item(request, id):
reviewer, mode = _check_reviewer_credentials(request)
if request.method == 'GET':
annotation = get_object_or_404(Annotation, id=id)
# only allow retrieving annotations within the same review as the current user's credentials
if reviewer.review != annotation.reviewer.review:
raise PermissionDenied
return JsonResponse(annotation.as_json_data())
elif request.method == 'DELETE':
annotation = get_object_or_404(Annotation, id=id)
# Check if the reviewer is allowed to delete the annotation
if reviewer.review != annotation.reviewer.review:
raise PermissionDenied
# If the reviewer has permission, delete the annotation
annotation.delete()
return JsonResponse({'status': 'Annotation deleted successfully'}, status=204)
else:
return HttpResponseNotAllowed(['GET', 'DELETE'], "Method not allowed")
Объяснение кода Django
- GET Request: Получает конкретную аннотацию по идентификатору, обеспечивая разрешение рецензента.
- DELETE Request: Удаляет аннотацию по ID, если у рецензента есть разрешение. Возвращает статус 204, указывающий на успешное удаление.
Summary:
- Frontend: JavaScript динамически внедряет обработчик события удаления, посылает запрос DELETE и удаляет основные моменты. .
- Backend:
annotations_api.py
обрабатывает запросы DELETE для безопасного удаления аннотации из базы данных.
Эта настройка гарантирует, что и фронтенд, и бэкенд будут обрабатывать удаление аннотаций без обновления страницы. Дайте мне знать, соответствует ли это решение вашим требованиям или требуются дополнительные настройки.