{"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.d7818a52e4dc7554a6bb.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('<span>' + copiedText + '</span>');\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":""}