diff --git a/gemeinsamforschen/src/main/webapp/assets/js/annotationScript.js b/gemeinsamforschen/src/main/webapp/assets/js/annotationScript.js index c1c095a7c1dfb2c8e6d75d3d8eb3958969f6d085..1ca0c6db859f7c10eb9cd0e7e9308e4208859105 100644 --- a/gemeinsamforschen/src/main/webapp/assets/js/annotationScript.js +++ b/gemeinsamforschen/src/main/webapp/assets/js/annotationScript.js @@ -4,8 +4,8 @@ var userColors = new Map(); var userColorsDark = new Map(); var targetId = 200; -// declare document text -var documentText; +// declare document text, start and end character +var documentText, startCharacter, endCharacter; /** * This function will fire when the DOM is ready @@ -19,36 +19,17 @@ $(document).ready(function() { selector: '.context-menu-one', callback: function(key, options) { - // close context menu - window.close; - - // initialize selected body - var body = getSelectedText(); - - // if user selected something - if (body.length > 0) { - // annotationPostRequest - var annotationPostRequest = { - userToken: userToken, - targetId: targetId, - body: { - title: "title", - comment: body, - startCharacter: window.getSelection().getRangeAt(0).startOffset, - endCharacter: window.getSelection().getRangeAt(0).endOffset - } - }; - - console.log(annotationPostRequest); - - createAnnotation(annotationPostRequest, function(response) { - // display the new annotation - displayAnnotation(response); - - }); - } + // action for 'annotation' click + if (key == 'annotation') { + // show modal if something is selected + if (getSelectedText().length > 0) { + startCharacter = window.getSelection().getRangeAt(0).startOffset; + endCharacter = window.getSelection().getRangeAt(0).endOffset; - $('#annotation-create-modal').modal('show'); + // display annotation create modal + $('#annotation-create-modal').modal("show"); + } + } }, items: { @@ -63,6 +44,62 @@ $(document).ready(function() { location.href="givefeedback.jsp?token=" + getUserTokenFromUrl(); }); + + + /** + * validation of annotation create form inside the modal + */ + $('#annotation-create-form').validate({ + rules: { + title: { + required: true, + maxlength: 120 + }, + comment: { + required: true, + maxlength: 400 + } + }, + messages: { + title: { + required: "Bitte geben Sie einen Titel ein", + maxlength: "Ihr Titel darf maximal 120 Zeichen lang sein" + }, + comment: { + required: "Bitte geben Sie einen Kommentar ein", + maxlength: "Ihr Kommentar darf maximal 400 Zeichen lang sein" + } + } + }); + + /** + * Save button of the annotation create modal + * hide modal and build new annotation + */ + $('#btnSave').click(function () { + if ($('#annotation-create-form').valid()) { + // get title and comment from form + var title = $('#annotation-form-title').val(); + var comment = $('#annotation-form-comment').val(); + + // hide and clear the modal + $('#annotation-create-modal').modal('hide'); + + // save the new annotation in db and display it + saveNewAnnotation(title, comment, startCharacter, endCharacter); + } + }); + + /** + * Clear the title and comment input field of the modal + */ + $('#annotation-create-modal').on('hidden.bs.modal', function(){ + // clear title + $('#annotation-form-title').val(''); + // clear comment + $('#annotation-form-comment').val('') + }); + documentText = $('#documentText').html(); // fetch annotations from server on page start @@ -462,3 +499,32 @@ function toggleButtonHandler(element) { // toggle between up and down button element.children("i").toggleClass("fa-chevron-down fa-chevron-up") } + +/** + * Save a new annotation in database and list + * + * @param title The title of the new annotation + * @param comment The comment of the new annotation + * @param startCharacter The startCharacter based on the annotated text + * @param endCharacter The endCharacter based on the annotated text + */ +function saveNewAnnotation(title, comment, startCharacter, endCharacter) { + // build annotationPostRequest + var annotationPostRequest = { + userToken: userToken, + targetId: targetId, + body: { + title: title, + comment: comment, + startCharacter: startCharacter, + endCharacter: endCharacter + } + }; + + // send new annotation to back-end and display it in list + createAnnotation(annotationPostRequest, function(response) { + // display the new annotation + displayAnnotation(response); + + }); +} diff --git a/gemeinsamforschen/src/main/webapp/pages/annotation-document.jsp b/gemeinsamforschen/src/main/webapp/pages/annotation-document.jsp index 9e428cc34b9caea0c30d93a2921006cbfb12204d..1b1515c1712672bbae51adc783f37c9800176678 100644 --- a/gemeinsamforschen/src/main/webapp/pages/annotation-document.jsp +++ b/gemeinsamforschen/src/main/webapp/pages/annotation-document.jsp @@ -24,6 +24,8 @@ <!-- js - jQuery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> + <!-- js - jQuery validation plugin --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.min.js"></script> <!-- js - bootstrap --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <!-- js - jQuery ui position --> @@ -91,24 +93,22 @@ <!-- modal body --> <div class="modal-body"> - <form> + <form id="annotation-create-form"> <div class="form-group"> <label for="annotation-form-title" class="col-form-label">Titel:</label> - <input type="text" class="form-control" id="annotation-form-title"> + <input type="text" class="form-control" id="annotation-form-title" name="title"> </div> <div class="form-group"> <label for="annotation-form-comment" class="col-form-label">Kommentar:</label> - <textarea class="form-control resize-vertical" id="annotation-form-comment"></textarea> + <textarea class="form-control resize-vertical" id="annotation-form-comment" name="comment"></textarea> </div> </form> + <!-- modal footer --> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbrechen</button> + <button id="btnSave" type="button" class="btn btn-success">Speichern</button> + </div> </div> - - <!-- modal footer --> - <div class="modal-footer"> - <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbrechen</button> - <button type="button" class="btn btn-primary">Speichern</button> - </div> - </div> </div> </div>