Skip to content

Commit

Permalink
feat: adding backend connection to summarize annotatorjs plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
alexjmpb committed Sep 13, 2024
1 parent 6c8f92a commit 675cb4d
Showing 1 changed file with 98 additions and 2 deletions.
100 changes: 98 additions & 2 deletions lms/static/js/edxnotes/plugins/llm_summarize.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,113 @@
background-color: white;
border: 1px solid gray;
}
.summarize-loader-wrapper {
display: none;
}
.summarize-loader-wrapper.show {
display: block
}
// Defining content loader since fontawesome icons don't work
// inside the annotatorjs modal.
.loader {
width: 5em !important;
border-color: red !important;
}
@keyframes rotation {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
`;
document.head.appendChild(style);
var annotator = this.annotator;
this.modifyDom(this.annotator);
const summarizeButton = document.getElementById('summarizeButton');
summarizeButton.addEventListener('click', function(ev) {
document.querySelector('.annotator-outer.annotator-editor').setAttribute('is_summarizing', true);
});
this.annotator.subscribe('annotationEditorShown', this.handleSummarize);
this.annotator.subscribe('annotationEditorHidden', this.cleanupSummarize);
},
handleSummarize: function (editor, annotation) {
if (editor.element[0].getAttribute('is_summarizing') !== 'true') return;
const textAreaWrapper = editor.fields[0].element;
editor.fields[1].element.children[0].value = 'ai_summary';
toggleLoader(editor);

const request = new Request("/pearson-core/llm-assistance/api/v0/summarize-text", {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': $.cookie('csrftoken')
},
body: JSON.stringify({
text_to_summarize: annotation.quote
})
});
fetch(request)
.then((response) => {
if (response.ok) return response.json();
throw new Error(gettext('There was an error while summarizing the content.'));
})
.then((data) => {
toggleLoader();
textAreaWrapper.children[0].value = data.summary;
})
.catch((error) => {
console.error('Error during summarization:', error);
editor.hide();
});

function toggleLoader() {
const saveButton = document.querySelector('.annotator-controls .annotator-save');
const loaderWrapper = document.querySelector('.summarize-loader-wrapper');
const textArea = editor.fields[0].element.children[0];
if (textArea.style.display === 'none') textArea.style.display = 'block';
else textArea.style.display = 'none';
loaderWrapper.classList.toggle('show');
saveButton.disabled = !saveButton.disabled;
}
},
cleanupSummarize: function(editor) {
const textAreaWrapper = editor.fields[0].element;
textAreaWrapper.children[0].value = '';
textAreaWrapper.children[1].value = '';
editor.element[0].setAttribute('is_summarizing', 'false');
const loaderWrapper = document.querySelector('.summarize-loader-wrapper');
loaderWrapper.classList.remove('show');
},
modifyDom: function(annotator) {
annotator.adder[0].children[0].id = 'annotateButton';
annotator.adder[0].children[0].innerHTML = '<i class="fa fa-pencil" aria-hidden="true"></i>';
annotator.adder[0].innerHTML += `
<button class="summarize-button" id="summarizeButton" title="${gettext('Summarize text using AI.')}">
<i class="fa fa-star" aria-hidden="true"></i>
</button>
`;
},
const textAreaWrapper = annotator.editor.fields[0].element;
textAreaWrapper.innerHTML += `
<div class="summarize-loader-wrapper">
<span class="loader" style="
width: 1.2em;
height: 1.2em;
border: 3px solid rgb(0, 48, 87);
border-bottom-color: white;
border-radius: 50%;
display: inline-block;
box-sizing: border-box;
animation: rotation 3s linear infinite;
margin-right: 5px;
transform-origin: center;">
</span>
<span style="font-size: 1.2em; color: rgb(0, 48, 87);">
${gettext('Summarizing...')}
</span>
</div>`;
}
});
});
}).call(this, define || RequireJS.define);

0 comments on commit 675cb4d

Please sign in to comment.