{"version":3,"sources":["webpack:////Users/owenli/Documents/workspace/awi-wlc-fe/src/views/blocks/notepadBlock/js/notepadBlock.js"],"names":["NotepadBlock","_createClass","element","_this","this","_classCallCheck","$element","$","$form","saveAPI","data","downloadAPI","viewCourseNotesAPI","saveButton","viewButton","popperInstance","tooltip","sel","window","getSelection","copiedText","virtualElement","getBoundingClientRect","generateGetBoundingClientRect","width","arguments","length","undefined","height","top","right","bottom","left","updateTooltip","isCollapsed","r","getRangeAt","update","toString","tinymce","_typeof","init","selector","plugins","content_css","menubar","statusbar","paste_as_text","toolbar","setup","editor","ui","registry","addButton","icon","classes","onAction","open","text","array","serializeArray","formData","map","n","i","getContent","_","forOwn","value","key","isNil","trim","json_text","JSON","stringify","request","Request","method","body","headers","Content-Type","fetch","then","response","status","catch","error","btn","addClass","setTimeout","removeClass","init_instance_callback","on","hasClass","selection","getBookmark","navigator","clipboard","writeText","setCursorLocation","getBody","children","insertContent","hide","empty","removeAllRanges","document","Popper","placement","positionFixed","modifiers","offset","addEventListener","e","get","contains","target","closest","parentNode","nodeName","toLowerCase","scrollTop","pageYOffset","documentElement","clientX","clientY","show","debounce"],"mappings":"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","file":"block-50.2f662a3aa586e55a56ca.js","sourcesContent":["const NS = 'NotepadBlock';\nconst CLS = 'notepadBlock';\n\nimport Popper from 'popper.js';\n\nexport class NotepadBlock {\n\tconstructor(element) {\n\t\tthis.element = element;\n\t\tthis.$element = $(element);\n\n this.$form = $(`.notepadBlock-notepad-form-container`);\n this.saveAPI = this.$form.data('saveApi');\n\t\tthis.downloadAPI = this.$form.data('downloadApi');\n\t\tthis.viewCourseNotesAPI = this.$form.data('viewNotesApi');\n this.saveButton = this.$form.data('saveButton');\n this.viewButton = this.$form.data('viewButton');\n\n const notepadEditor = $('#notepadEditor');\n const tooltip = $('#notepadTooltip');\n let sel = window.getSelection();\n let copiedText = '';\n let popperInstance;\n let selCurrent = '-';\n const virtualElement = {\n getBoundingClientRect: generateGetBoundingClientRect()\n };\n\n // TinyMCE\n if(typeof tinymce === 'object') {\n // eslint-disable-next-line no-undef\n tinymce.init({\n selector: `#notepadEditor`,\n plugins: 'lists',\n content_css: '/Static/wlc/assets/css/tinymce.css',\n menubar: false,\n statusbar: false,\n paste_as_text: true,\n height: '100%',\n\t\t\t\ttoolbar: 'bold italic bullist | customDownloadButton customViewCourseNotesButton customSaveButton',\n setup: (editor) => {\n editor.ui.registry.addButton('customDownloadButton', {\n icon: 'fullscreen',\n tooltip: 'Download',\n classes: 'myclass',\n onAction: () => {\n // Notepad share/email button\n window.open(this.downloadAPI);\n return false;\n }\n\t\t\t\t\t});\n\t\t\t\t\teditor.ui.registry.addButton('customViewCourseNotesButton', {\n\t\t\t\t\t\ttext: this.viewButton,\n\t\t\t\t\t\ttooltip: 'View All',\n\t\t\t\t\t\tonAction: () => {\n\t\t\t\t\t\t\t// Notepad share/email button\n\t\t\t\t\t\t\twindow.open(this.viewCourseNotesAPI);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n editor.ui.registry.addButton('customSaveButton', {\n text: this.saveButton,\n tooltip: 'Save',\n onAction: () => {\n // Saving functionality (to be replaced with AJAX / server side)\n var array = this.$form.serializeArray()\n\t\t\t\t\t\t\tvar formData = {};\n\t\t\t\t\t\t\t\n $.map(array, function (n, i) {\n formData[n['name']] = n['value'];\n });\n \n\t\t\t\t\t\t\tformData['notepadText'] = editor.getContent();\n // Removes empty field values\n _.forOwn(formData, (value, key) => {\n if(_.isNil(value) || value.trim() === '') {\n delete formData[key];\n }\n });\n\n var json_text = JSON.stringify(formData);\n\n let request = new Request(this.saveAPI, {\n method: 'POST',\n body: json_text,\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n \n // submit form data using fetch api\n fetch(request)\n .then((response) => {\n if(response.status === 200) {\n console.log(\"Notes Saved\");\n }\n else {\n console.log(\"Notes not Saved\");\n }\n })\n .catch((error) => {\n // errors (failed call)\n console.log(\"Notes Save Error!\");\n });\n let btn = $('.tox-tbtn[aria-label=\\'Save\\']');\n btn.addClass('saving');\n setTimeout(function() {\n btn.removeClass('saving');\n }, 1000);\n }\n });\n },\n init_instance_callback: function(editor) {\n // Tooltip click\n tooltip.on('click', function() {\n // Notepad toggle open\n if(!$('#siteSubheaderTopicWidgetNotepadToggle').hasClass('open')) {\n $('#siteSubheaderTopicWidgetNotepadToggle').addClass('open');\n $('#notepad').addClass('open');\n }\n\n // Set a bookmark so we can return the user's cursor to the original location\n const bookmark = editor.selection.getBookmark();\n\n // Copy selected text to clipboard\n navigator.clipboard.writeText(copiedText);\n // tinyMCE.activeEditor.insertContent(copiedText); // eslint-disable-line no-undef\n\n // Use editor.getBody() to find the end of all the content\n editor.selection.setCursorLocation(editor.getBody(), editor.getBody().children.length);\n\n // Insert clipboard text, with 2 empty lines at the start\n editor.insertContent('' + copiedText + '');\n\n // Move the selection back to the original bookmark\n // editor.selection.moveToBookmark(bookmark);\n\n // Hide tooltip\n tooltip.hide();\n\n // Reset selection current\n selCurrent = '-';\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n }\n else if\n (window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n }\n else if\n (document.selection) { // IE?\n document.selection.empty();\n }\n });\n }\n });\n\n // Initialise Tooltip 'popper' instance\n popperInstance = new Popper(virtualElement, tooltip, {\n placement: 'top',\n positionFixed: true,\n modifiers: {\n offset: {\n offset: '0,12'\n }\n }\n });\n\n // If tooltip exists in the dom and clipboard is available in the browser\n if(navigator && navigator.clipboard && navigator.clipboard.writeText && tooltip.length) {\n // Tooltip mouse down (hide tooltip)\n window.addEventListener('mousedown', function(e) {\n // selCurrent = '-';\n\n // Are we clicking the tooltip itself?\n if(!tooltip.get(0).contains(e.target)) {\n // If parent elements contain the data attribute data-can-copy\n if(!e.target.closest('[data-can-copy]') || e.target.parentNode.nodeName.toLowerCase() === 'button' || e.target.nodeName.toLowerCase() === 'button') {\n // Hide tooltip\n tooltip.removeClass('animate');\n tooltip.hide();\n }\n }\n else {\n // console.log('clicking the tooltip');\n }\n });\n\n // Tooltip mouse up (show tooltip)\n window.addEventListener('mouseup', function(e) {\n // If text selection is empty, or if temp selection equals previous selection\n if(sel.isCollapsed) {\n // Hide tooltip\n tooltip.hide();\n }\n else {\n // console.log(sel.toString(), selCurrent);\n // if((sel.toString() !== selCurrent)) {\n // If clicked element is not the tooltip\n // if(e.target.closest('.notepadBlock-tooltip') !== null) {\n // If parent elements contain the data attribute data-can-copy\n if(e.target.closest('[data-can-copy]') && e.target.parentNode.nodeName.toLowerCase() !== 'button' && e.target.nodeName.toLowerCase() !== 'button') {\n const scrollTop = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;\n const posX = e.clientX - 110;\n const posY = e.clientY + 20 + scrollTop;\n\n // Show tooltip\n tooltip.removeClass('animate').addClass('animate');\n tooltip.show();\n updateTooltip(posX, posY);\n }\n // }\n // }\n }\n });\n\n // Update tooltip position on window resize\n $(window).on('resize', _.debounce(() => {\n updateTooltip();\n }, 250));\n }\n }\n\n // Helper method - get bounding box\n function generateGetBoundingClientRect(width = 0, height = 0, top = 0, right = 0, bottom = 0, left = 0) {\n return () => ({\n width: width,\n height: height,\n top: top,\n right: right,\n bottom: bottom,\n left: left\n });\n }\n\n // Helper method - update tooltip position + get selection text\n function updateTooltip() {\n // sel = window.getSelection();\n if(!sel.isCollapsed) {\n let r = sel.getRangeAt(0).getBoundingClientRect();\n virtualElement.getBoundingClientRect = generateGetBoundingClientRect(r.width, r.height, r.top, r.right, r.bottom, r.left);\n popperInstance.update();\n copiedText = sel.toString();\n selCurrent = sel.toString();\n }\n }\n\t}\n}\n"],"sourceRoot":""}