{"version":3,"file":"assessment-edit.js","sources":["../../src/js/assessment-edit.js"],"sourcesContent":["(function($){\n\n $.fn.isInViewport = function() {\n var elementTop = $(this).offset().top;\n var elementBottom = elementTop + $(this).outerHeight();\n\n var viewportTop = $(window).scrollTop();\n var viewportBottom = viewportTop + $(window).height();\n\n return elementBottom > viewportTop && elementTop < viewportBottom;\n };\n\n function setCommentCookie() {\n var token = 's--Plone' + window.location.pathname.split('/').slice(0,-1).join('-');\n document.cookie = token + \"=\" + Date.now() + \";path=/\";\n }\n\n function colorComments() {\n // setup colored chat depending on user\n colorPalette = {\n 'light': [\"lightgreen\", \"lightblue\", \"lightgoldenrodyellow\", \"lightgrey\"],\n 'dark': [\"darkgreen\", \"darkblue\", \"darkmagenta\", \"darkred\"]\n }\n\n usernames = {\n 'light': [],\n 'dark': []\n };\n\n $('.comment-name').each(function(){\n var groupId = $(this).attr('group-id');\n var username = $(this).text();\n\n if (usernames[groupId].indexOf(username) === -1) {\n usernames[groupId].push(username);\n }\n\n });\n\n $('.comms').each(function(){\n var $commentName = $(this).find('.comment-name');\n var commenter = $commentName.text();\n var groupId = $commentName.attr('group-id');\n var colorP = colorPalette[groupId];\n\n indx = usernames[groupId].indexOf(commenter);\n color = colorP[indx % colorP.length];\n\n $comment = $(this).find('.comment');\n $comment.css('background-color', color);\n if (groupId === 'light'){\n $comment.css('color', 'black');\n }\n });\n }\n\n function setupAccordions($el) {\n var $acc = $el.find('.accordion');\n var i;\n\n for (i = 0; i < $acc.length; i++) {\n $acc[i].addEventListener(\"click\", function() {\n this.classList.toggle(\"active\");\n var $comments = $(this).nextUntil('li.accordion');\n $comments.each(function(){\n this.classList.toggle(\"active\");\n });\n });\n\n if(i == $acc.length -1) {\n $acc[i].classList.toggle(\"active\");\n var $comments = $($acc[i]).nextUntil('li.accordion');\n $comments.each(function(){\n this.classList.toggle(\"active\");\n });\n }\n }\n }\n\n function loadComments($el) {\n var qid = $el.data('question-id');\n var threadId = $el.data('thread-id');\n var url = './@@ast-comments?q=' + qid + '&thread_id=' + threadId;\n $.get(url, function(text){\n //console.log('getting comments from url', url);\n $el.html(text);\n colorComments();\n setupAccordions($el);\n });\n }\n\n function setupDeleteComments($el) {\n $el.find('.comms .comm-del').each(function(){\n var $this = $(this);\n clickEventExists = $this.data('click-event-setup');\n if(clickEventExists === 'true'){\n return;\n }\n $this.data('click-event-setup', 'true');\n //console.log(\"setup delete comments\");\n\n $this.on('click', function(){\n var $this = $(this);\n var $comel = $('.comments', $this.closest('.right')); //comment element\n var commentName = $this.siblings('.comm-crtr').find('.comment-name').text();\n var commentTime = $this.siblings('.comm-crtr').find('.comment-time').text();\n var text = $this.siblings('.comment').text();\n var qid = $el.data('question-id');\n var threadId = $el.data('thread-id');\n\n if (confirm(\"Are you sure you want to delete the comment '\" + text + \"'?\")) {\n var url = './@@del_comment';\n var data = {\n comm_name: commentName,\n comm_time: commentTime,\n text: text,\n q: qid,\n thread_id: threadId,\n };\n $.post(url, data, function(text){\n setCommentCookie();\n $comel.html(text);\n colorComments();\n setupAccordions($el);\n });\n }\n });\n });\n }\n\n function setupEditComments($el) {\n $el.find('.comms .comm-edit').each(function(){\n var $this = $(this);\n clickEventExists = $this.data('click-event-setup');\n if(clickEventExists === 'true'){\n return;\n }\n $this.data('click-event-setup', 'true');\n \n $this.on('click', function(){\n var $this = $(this);\n var $comel = $('.comments', $this.closest('.right')); // comment element\n var commentName = $this.siblings('.comm-crtr').find('.comment-name').text();\n var commentTime = $this.siblings('.comm-crtr').find('.comment-time').text();\n var text = $this.siblings('.comment').text();\n var qid = $el.data('question-id');\n var threadId = $el.data('thread-id');\n \n var $editCommentModal = $('#edit-comment-modal');\n $('#comment-original-text', $editCommentModal).text(text);\n $('#new_comment', $editCommentModal).val(text);\n\n $('#comm_original', $editCommentModal).val(text);\n $('#comm_name', $editCommentModal).val(commentName);\n $('#comm_time', $editCommentModal).val(commentTime);\n $('#q', $editCommentModal).val(qid);\n $('#thread_id', $editCommentModal).val(threadId);\n $('#form-edit-comment').data('comel', $comel);\n $('#form-edit-comment').data('el', $el);\n });\n });\n }\n\n function setupCommentsListing() {\n $(window).on('resize scroll', function() {\n $('.subform .right .comments').each(function(){\n var $n = $(this);\n\n if ($n.data('comments-loaded') === 'true') {\n return;\n }\n if ($n.isInViewport()) {\n $n.data('comments-loaded', 'true');\n loadComments($n);\n }\n });\n });\n }\n\n function setupPostComments() {\n $('.subform .right .textline button').on('click', function() {\n var $btn = $(this);\n var $comel = $('.comments', $btn.closest('.right'));\n var $textarea = $('textarea', $btn.closest('.textline'));\n\n var qid = $comel.data('question-id');\n var threadId = $comel.data('thread-id');\n var text = $textarea.val();\n\n if (!text) return false;\n\n var url = './@@add_comment';\n var data = {\n text:text,\n q: qid,\n thread_id: threadId\n };\n\n $.post(url, data, function(text){\n setCommentCookie();\n $comel.html(text);\n $textarea.val('');\n colorComments();\n setupAccordions($comel);\n });\n // console.log(qid, text);\n return false;\n });\n }\n\n function setupToggleComments() {\n var $discTl = $('.right.disc-tl')\n var $discEc = $('.right.disc-ec')\n var existsDiscTl = $discTl.length\n var existsDiscEc = $discEc.length\n\n $('.comm-hide').click(function() {\n // Close button transformed into a 'show all comments' button\n // $(this).closest('.right').addClass('inactive');\n $(this).siblings('.comments').find('li').each(function(){\n $(this).addClass('active');\n });\n });\n\n $('.right.discussion .comments').click(function(){\n $thisComm = $(this).closest('.right');\n\n if($thisComm.hasClass('inactive')){\n $thisComm.toggleClass('inactive');\n }\n });\n }\n\n function setupDisableAssessmentForms(){\n // used in edit assessment form\n // add the disabled attribute for select/textarea elements\n // if the question type does not match the process phase\n $('#comp-national-descriptor div.subform.disabled div.left')\n .find('textarea').each(function(){\n $(this).attr('disabled', true);\n });\n\n // used in edit assessment form\n // remove the disabled attribute when submitting the form\n // data from disabled attributes is not submitted\n $('.kssattr-formname-edit-assessment-data-2018').submit(function(){\n $(':disabled').each(function(){\n $(this).removeAttr('disabled');\n });\n });\n }\n\n function setupFormSelectOptions() {\n // used in edit assessment form\n // override plone's default 'No value' option with '-'\n $('#comp-national-descriptor div.subform div.left div.assessment-form-input')\n .find(\"option:contains('No value'), span.select2-chosen:contains('No value')\").each(function(){\n $(this).text('-');\n });\n\n // in edit ms responses to recommendations remove the 'No value' from the options\n $('.edit-recommendation-feedback div.assessment-form-input')\n .find(\"option:contains('No value'), span.select2-chosen:contains('No value')\").each(function(){\n $(this).remove();\n });\n }\n\n function setupUnloadWarning() {\n // National descriptor edit assessment data\n // Warn user before leaving the page with unsaved changes\n var submitted = false;\n var modified = false;\n var $nd = $('.fields-container');\n\n $('#comp-national-descriptor form').submit(function() {\n submitted = true;\n });\n\n $nd.on('change', 'input, textarea, select', function(e) {\n modified = true;\n });\n\n $(window).bind('beforeunload', function() {\n if (modified && !submitted) {\n // most browsers ignores custom messages,\n // in that case the browser default message will be used\n return \"You have unsaved changes. Do you want to leave this page?\";\n }\n });\n\n var $select = $nd.find('.select2-container');\n var $textarea = $nd.find('textarea');\n $select.closest('.fields-container-row').addClass('flex-select');\n $textarea.closest('.fields-container-row').addClass('flex-textarea');\n }\n\n function adjustInfoboxPosition() {\n var $repNavToggle = $('#report-nav-toggle');\n var $repNav = $('.report-nav.sticky');\n var $infobox = $('#assessment-edit-infobox');\n var infoboxLength = $infobox.children().length;\n var $ff = $('.form-right-side.fixed-save-btn');\n\n if (infoboxLength > 0 && $repNav.length){\n $repNav.addClass('has-infobox');\n $infobox.show().css('display', 'inline-block');\n var leftPos = $repNavToggle.position().left - 16;\n\n if ($ff.length) leftPos = $ff.position().left;\n\n leftPos = leftPos - $infobox.width();\n $infobox.css('left', leftPos + 'px');\n }\n else {\n $repNav.removeClass('has-infobox');\n $infobox.hide();\n }\n }\n\n function setupAssessmentInfobox() {\n // add the infobox to the top sticky bar\n // the infobox will show all ges components/targets with 'Not relevant' option selected\n function _addGescompsToInfobox() {\n var gesComps = [];\n var $allQuestions = $('