UNPKG

rate-the-docs

Version:

Feedback widget for Read the Docs documentation

316 lines (270 loc) 20 kB
/*! rate-the-docs 0.2.1 - https://github.com/medmunds/rate-the-docs */ // Simple persistent preferences API (using localStorage) function Prefs(appLabel) { var cache; try { cache = JSON.parse(localStorage.getItem(appLabel)) || {}; } catch (e) { cache = {}; } function flush() { localStorage.setItem(appLabel, JSON.stringify(cache)); } return { get: function get(key) { return cache[key]; }, set: function set(key, value, flushUpdates) { if (flushUpdates === void 0) { flushUpdates = true; } cache[key] = value; if (flushUpdates) { flush(); } }, clearAll: function clearAll(flushUpdates) { if (flushUpdates === void 0) { flushUpdates = true; } cache = {}; if (flushUpdates) { flush(); } }, flush: flush }; } // Default API for recording user feedback (via Google Analytics events) var READTHEDOCS_DATA = window.READTHEDOCS_DATA || {}; function recordEvent(action, label, value) { // global gtag; // global ga; var isLocalhost = window.location.hostname === "localhost"; var category = "RateTheDocs"; if (typeof gtag === "function") { // ReadTheDocs initializes READTHEDOCS_DATA.user_analytics_code // with the project owner's GA trackingId gtag("event", action, { 'send_to': READTHEDOCS_DATA.user_analytics_code, 'event_category': category, 'event_label': label, 'value': value, 'dimension1': READTHEDOCS_DATA.project, 'dimension2': READTHEDOCS_DATA.version }); } else if (typeof ga === "function") { // ReadTheDocs initializes the Google Analytics trackerName "user" // with the project owner's GA trackingId ga("user.send", "event", category, action, label, value, { // (dimension order matches readthedocs-analytics.js, merely to avoid confusion) 'dimension1': READTHEDOCS_DATA.project, 'dimension2': READTHEDOCS_DATA.version }); } else if (isLocalhost) { // Local debugging without GA console.log("recordEvent", category, action, label, value); } else { // Either attempt to submit feedback before GA loads (unlikely), // or user is blocking GA but has not enabled doNotTrack. alert("Unable to register your docs feedback: Google Analytics not loaded"); } } var recording = { init: function init() { // Return true if recording is available and can be used. // (Google Analytics loads async, and the ReadTheDocs code that kicks // it off is also loaded async—readthedocs-analytics.js—so just assume // it will become available later unless the user has enabled doNotTrack.) var navigator = window.navigator || {}; var doNotTrack = navigator.doNotTrack === "1" // Firefox, Chrome || navigator.msDoNotTrack === "1" // IE 9, 10 || navigator.doNotTrack === "yes" // Gecko < 32 || window.doNotTrack === "1"; // Safari, IE 11, Edge return !doNotTrack; }, recordUpVote: function recordUpVote() { recordEvent("Helpful Vote", "Yes", 1); }, recordDownVote: function recordDownVote() { recordEvent("Helpful Vote", "No", 0); }, recordSuggestion: function recordSuggestion(suggestionText) { recordEvent("Suggestion", suggestionText); } }; var widgetHtml = "<!-- RateTheDocs widget --><!-- This depends on sphinx-rtd-theme, which includes Font Awesome 4.7 and Wyrm (wyrmsass.org) --><div class='rate-the-docs ratd-widget ratd-state-loading' role='dialog' aria-labelledby='ratd_title'><h2 id='ratd_title' class='sr-only'><em>Rate</em> the Docs</h2><div class='ratd-panels'><form class='ratd-panel ratd-panel-rating'>Is this page helpful? <button class='btn btn-neutral ratd-rating-vote' data-rating='1'><i class='fa fa-thumbs-o-up' aria-hidden='true'></i> Yes</button> <button class='btn btn-neutral ratd-rating-vote' data-rating='0'><i class='fa fa-thumbs-o-down' aria-hidden='true'></i> No</button></form><form class='ratd-panel ratd-panel-suggestion'><label for='ratd_suggestion_text'>Sorry&hellip; how could we improve this page?</label> <textarea id='ratd_suggestion_text' name='suggestion' rows='5'></textarea> <small class='ratd-suggestion-length' title='Characters'>0/500</small> <button class='btn btn-info' type='submit'>Submit</button> <small class='ratd-suggestion-tip'>Feedback is anonymous. Please don’t include personal info. If you need a reply, <a href='#contact'>contact us</a> instead.</small></form><div class='ratd-panel ratd-panel-thanks'>Thanks! We’ve noted your feedback.</div></div><button class='ratd-toggle ratd-toggle-close btn btn-link' aria-label='Close ratings widget' disabled><i class='fa fa-times' aria-hidden='true' title='Close'></i></button> <button class='ratd-toggle ratd-toggle-collapse btn btn-link' aria-label='Hide ratings widget'><i class='fa fa-chevron-right' aria-hidden='true' title='Hide'></i></button> <button class='ratd-toggle ratd-toggle-expand btn btn-link' aria-label='Show ratings widget' disabled><i class='fa fa-book' aria-hidden='true' title='Rate the Docs'><i>?</i></i></button></div>"; function styleInject(css, ref) { if (ref === void 0) ref = {}; var insertAt = ref.insertAt; if (!css || typeof document === 'undefined') { return; } var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; if (insertAt === 'top') { if (head.firstChild) { head.insertBefore(style, head.firstChild); } else { head.appendChild(style); } } else { head.appendChild(style); } if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } } var css_248z = "/*! rate-the-docs 0.2.1 - https://github.com/medmunds/rate-the-docs */\n/* RateTheDocs injected stylesheet.\n *\n * Depends on sphinx-rtd-theme, which includes\n * Font Awesome 4.7 and Wyrm (wyrmsass.org)\n */\n\n\n/*\n * Page layout\n */\n\nfooter {\n margin-bottom: 3rem; /* allow scrolling content past the ratings widget */\n}\n\n.ratd-widget {\n position: fixed;\n bottom: 0;\n right: 0;\n}\n@media (min-width: 1100px) {\n /* Keep the rating widget aligned content-right when page hits max content width\n .wy-nav-side {width: 300px;}\n .wy-nav-content {max-width: 800px;}\n */\n .ratd-widget {\n right: calc(100% - 1100px);\n }\n}\n\n\n/*\n * Widget layout\n */\n\n.ratd-widget {\n display: grid;\n /* match 'controls' column width to RTD content right margin (.wy-nav-content { padding-right }) */\n grid-template-columns: 1fr 1.618rem;\n grid-template-rows: 1fr;\n grid-template-areas: \"main controls\";\n}\n@media (min-width: 768px) {\n .ratd-widget {\n grid-template-columns: 1fr 3.236rem;\n }\n}\n\n.ratd-panels {\n grid-area: main;\n margin: 12px 0;\n}\n.ratd-panel {\n padding-left: 12px;\n}\n\n.ratd-toggle {\n grid-area: controls;\n justify-self: center;\n align-self: center;\n margin: 12px 0;\n}\n.ratd-toggle.ratd-toggle-close {\n align-self: start;\n margin: 6px 0;\n}\n\n\n/*\n * Appearance\n */\n\n.ratd-widget {\n border-top-left-radius: 8px; /* $base-font-size / 2 */\n background-color: #E7F2FA; /* $alert-background: lighten($blue, 50%), where $blue: #2980B9; */\n}\n\n.ratd-widget .btn {\n font-size: 90%;\n}\n\n.ratd-panel-suggestion > *:not(:first-child) {\n margin-top: 8px;\n}\n\n.ratd-panel-suggestion label span {\n display: block;\n}\n\n.ratd-suggestion-length {\n float: right;\n margin-left: 0.5em;\n margin-bottom: 0.5em;\n color: #999; /* $gray-light */\n}\n\n.ratd-suggestion-tip {\n display: block;\n clear: both;\n}\n\n.ratd-toggle.btn-link {\n color: inherit;\n}\n\n/*\n * State animations\n */\n\n/* widget close */\n.ratd-widget {\n opacity: 1;\n transition: opacity 0.25s ease-in;\n}\n.ratd-widget.ratd-state-closing {\n opacity: 0;\n pointer-events: none;\n}\n.ratd-widget.ratd-state-closed {\n display: none;\n}\n\n/* widget collapse */\n.ratd-panels {\n overflow: hidden;\n width: 330px;\n transition: width 0.25s ease-in-out;\n}\n.ratd-panel {\n width: 330px; /* don't wrap during collapse */\n}\n.ratd-widget.ratd-state-collapsed .ratd-panels {\n width: 0;\n}\n\n/* panel change */\n.ratd-panel {\n overflow: hidden;\n transition: height 0.25s ease-in-out;\n}\n\n/* toggle control change */\n.btn.ratd-toggle {\n opacity: 1;\n transform: rotate(0deg);\n transition: opacity 0.25s ease-in-out,\n transform 0.25s ease-in-out;\n}\n.btn.ratd-toggle[disabled] {\n pointer-events: none;\n opacity: 0;\n transform: rotate(180deg);\n}\n\n/* skip all transitions during initialization */\n.ratd-widget.ratd-state-loading,\n.ratd-widget.ratd-state-loading .ratd-panels,\n.ratd-widget.ratd-state-loading .ratd-panel,\n.ratd-widget.ratd-state-loading .ratd-toggle\n{\n transition: none;\n}\n\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxubyBzb3VyY2U+Iiwid2lkZ2V0LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzRUFBQTtBQ0FBOzs7O0VBSUU7OztBQUdGOztFQUVFOztBQUVGO0VBQ0UsbUJBQW1CLEVBQUUsb0RBQW9EO0FBQzNFOztBQUVBO0VBQ0UsZUFBZTtFQUNmLFNBQVM7RUFDVCxRQUFRO0FBQ1Y7QUFDQTtFQUNFOzs7R0FHQztFQUNEO0lBQ0UsMEJBQTBCO0VBQzVCO0FBQ0Y7OztBQUdBOztFQUVFOztBQUVGO0VBQ0UsYUFBYTtFQUNiLGtHQUFrRztFQUNsRyxtQ0FBbUM7RUFDbkMsdUJBQXVCO0VBQ3ZCLG9DQUFvQztBQUN0QztBQUNBO0VBQ0U7SUFDRSxtQ0FBbUM7RUFDckM7QUFDRjs7QUFFQTtFQUNFLGVBQWU7RUFDZixjQUFjO0FBQ2hCO0FBQ0E7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsb0JBQW9CO0VBQ3BCLGtCQUFrQjtFQUNsQixjQUFjO0FBQ2hCO0FBQ0E7RUFDRSxpQkFBaUI7RUFDakIsYUFBYTtBQUNmOzs7QUFHQTs7RUFFRTs7QUFFRjtFQUNFLDJCQUEyQixFQUFFLHdCQUF3QjtFQUNyRCx5QkFBeUIsRUFBRSxrRUFBa0U7QUFDL0Y7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLG9CQUFvQjtFQUNwQixXQUFXLEVBQUUsZ0JBQWdCO0FBQy9COztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7O0VBRUU7O0FBRUYsaUJBQWlCO0FBQ2pCO0VBQ0UsVUFBVTtFQUNWLGlDQUFpQztBQUNuQztBQUNBO0VBQ0UsVUFBVTtFQUNWLG9CQUFvQjtBQUN0QjtBQUNBO0VBQ0UsYUFBYTtBQUNmOztBQUVBLG9CQUFvQjtBQUNwQjtFQUNFLGdCQUFnQjtFQUNoQixZQUFZO0VBQ1osbUNBQW1DO0FBQ3JDO0FBQ0E7RUFDRSxZQUFZLEVBQUUsK0JBQStCO0FBQy9DO0FBQ0E7RUFDRSxRQUFRO0FBQ1Y7O0FBRUEsaUJBQWlCO0FBQ2pCO0VBQ0UsZ0JBQWdCO0VBQ2hCLG9DQUFvQztBQUN0Qzs7QUFFQSwwQkFBMEI7QUFDMUI7RUFDRSxVQUFVO0VBQ1YsdUJBQXVCO0VBQ3ZCOzZCQUMyQjtBQUM3QjtBQUNBO0VBQ0Usb0JBQW9CO0VBQ3BCLFVBQVU7RUFDVix5QkFBeUI7QUFDM0I7O0FBRUEsK0NBQStDO0FBQy9DOzs7OztFQUtFLGdCQUFnQjtBQUNsQiIsImZpbGUiOiJ3aWRnZXQuY3NzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCIvKiBSYXRlVGhlRG9jcyBpbmplY3RlZCBzdHlsZXNoZWV0LlxuICpcbiAqIERlcGVuZHMgb24gc3BoaW54LXJ0ZC10aGVtZSwgd2hpY2ggaW5jbHVkZXNcbiAqIEZvbnQgQXdlc29tZSA0LjcgYW5kIFd5cm0gKHd5cm1zYXNzLm9yZylcbiAqL1xuXG5cbi8qXG4gKiBQYWdlIGxheW91dFxuICovXG5cbmZvb3RlciB7XG4gIG1hcmdpbi1ib3R0b206IDNyZW07IC8qIGFsbG93IHNjcm9sbGluZyBjb250ZW50IHBhc3QgdGhlIHJhdGluZ3Mgd2lkZ2V0ICovXG59XG5cbi5yYXRkLXdpZGdldCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgYm90dG9tOiAwO1xuICByaWdodDogMDtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMTAwcHgpIHtcbiAgLyogS2VlcCB0aGUgcmF0aW5nIHdpZGdldCBhbGlnbmVkIGNvbnRlbnQtcmlnaHQgd2hlbiBwYWdlIGhpdHMgbWF4IGNvbnRlbnQgd2lkdGhcbiAgICAgIC53eS1uYXYtc2lkZSB7d2lkdGg6IDMwMHB4O31cbiAgICAgIC53eS1uYXYtY29udGVudCB7bWF4LXdpZHRoOiA4MDBweDt9XG4gICovXG4gIC5yYXRkLXdpZGdldCB7XG4gICAgcmlnaHQ6IGNhbGMoMTAwJSAtIDExMDBweCk7XG4gIH1cbn1cblxuXG4vKlxuICogV2lkZ2V0IGxheW91dFxuICovXG5cbi5yYXRkLXdpZGdldCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIC8qIG1hdGNoICdjb250cm9scycgY29sdW1uIHdpZHRoIHRvIFJURCBjb250ZW50IHJpZ2h0IG1hcmdpbiAoLnd5LW5hdi1jb250ZW50IHsgcGFkZGluZy1yaWdodCB9KSAqL1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxLjYxOHJlbTtcbiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnI7XG4gIGdyaWQtdGVtcGxhdGUtYXJlYXM6IFwibWFpbiBjb250cm9sc1wiO1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5yYXRkLXdpZGdldCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMy4yMzZyZW07XG4gIH1cbn1cblxuLnJhdGQtcGFuZWxzIHtcbiAgZ3JpZC1hcmVhOiBtYWluO1xuICBtYXJnaW46IDEycHggMDtcbn1cbi5yYXRkLXBhbmVsIHtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xufVxuXG4ucmF0ZC10b2dnbGUge1xuICBncmlkLWFyZWE6IGNvbnRyb2xzO1xuICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjtcbiAgYWxpZ24tc2VsZjogY2VudGVyO1xuICBtYXJnaW46IDEycHggMDtcbn1cbi5yYXRkLXRvZ2dsZS5yYXRkLXRvZ2dsZS1jbG9zZSB7XG4gIGFsaWduLXNlbGY6IHN0YXJ0O1xuICBtYXJnaW46IDZweCAwO1xufVxuXG5cbi8qXG4gKiBBcHBlYXJhbmNlXG4gKi9cblxuLnJhdGQtd2lkZ2V0IHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogOHB4OyAvKiAkYmFzZS1mb250LXNpemUgLyAyICovXG4gIGJhY2tncm91bmQtY29sb3I6ICNFN0YyRkE7IC8qICRhbGVydC1iYWNrZ3JvdW5kOiBsaWdodGVuKCRibHVlLCA1MCUpLCB3aGVyZSAkYmx1ZTogIzI5ODBCOTsgKi9cbn1cblxuLnJhdGQtd2lkZ2V0IC5idG4ge1xuICBmb250LXNpemU6IDkwJTtcbn1cblxuLnJhdGQtcGFuZWwtc3VnZ2VzdGlvbiA+ICo6bm90KDpmaXJzdC1jaGlsZCkge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5yYXRkLXBhbmVsLXN1Z2dlc3Rpb24gbGFiZWwgc3BhbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ucmF0ZC1zdWdnZXN0aW9uLWxlbmd0aCB7XG4gIGZsb2F0OiByaWdodDtcbiAgbWFyZ2luLWxlZnQ6IDAuNWVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjVlbTtcbiAgY29sb3I6ICM5OTk7IC8qICRncmF5LWxpZ2h0ICovXG59XG5cbi5yYXRkLXN1Z2dlc3Rpb24tdGlwIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4ucmF0ZC10b2dnbGUuYnRuLWxpbmsge1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLypcbiAqIFN0YXRlIGFuaW1hdGlvbnNcbiAqL1xuXG4vKiB3aWRnZXQgY2xvc2UgKi9cbi5yYXRkLXdpZGdldCB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXMgZWFzZS1pbjtcbn1cbi5yYXRkLXdpZGdldC5yYXRkLXN0YXRlLWNsb3Npbmcge1xuICBvcGFjaXR5OiAwO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi5yYXRkLXdpZGdldC5yYXRkLXN0YXRlLWNsb3NlZCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIHdpZGdldCBjb2xsYXBzZSAqL1xuLnJhdGQtcGFuZWxzIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2lkdGg6IDMzMHB4O1xuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjI1cyBlYXNlLWluLW91dDtcbn1cbi5yYXRkLXBhbmVsIHtcbiAgd2lkdGg6IDMzMHB4OyAvKiBkb24ndCB3cmFwIGR1cmluZyBjb2xsYXBzZSAqL1xufVxuLnJhdGQtd2lkZ2V0LnJhdGQtc3RhdGUtY29sbGFwc2VkIC5yYXRkLXBhbmVscyB7XG4gIHdpZHRoOiAwO1xufVxuXG4vKiBwYW5lbCBjaGFuZ2UgKi9cbi5yYXRkLXBhbmVsIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdHJhbnNpdGlvbjogaGVpZ2h0IDAuMjVzIGVhc2UtaW4tb3V0O1xufVxuXG4vKiB0b2dnbGUgY29udHJvbCBjaGFuZ2UgKi9cbi5idG4ucmF0ZC10b2dnbGUge1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjI1cyBlYXNlLWluLW91dCxcbiAgdHJhbnNmb3JtIDAuMjVzIGVhc2UtaW4tb3V0O1xufVxuLmJ0bi5yYXRkLXRvZ2dsZVtkaXNhYmxlZF0ge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cblxuLyogc2tpcCBhbGwgdHJhbnNpdGlvbnMgZHVyaW5nIGluaXRpYWxpemF0aW9uICovXG4ucmF0ZC13aWRnZXQucmF0ZC1zdGF0ZS1sb2FkaW5nLFxuLnJhdGQtd2lkZ2V0LnJhdGQtc3RhdGUtbG9hZGluZyAucmF0ZC1wYW5lbHMsXG4ucmF0ZC13aWRnZXQucmF0ZC1zdGF0ZS1sb2FkaW5nIC5yYXRkLXBhbmVsLFxuLnJhdGQtd2lkZ2V0LnJhdGQtc3RhdGUtbG9hZGluZyAucmF0ZC10b2dnbGVcbntcbiAgdHJhbnNpdGlvbjogbm9uZTtcbn1cbiJdfQ== */"; styleInject(css_248z); var DEFAULT_OPTIONS = { // href for "contact us instead" link contactLink: "/contact", // Maximum length of GA event label (technically, 500 bytes, not chars). // https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#el suggestionMaxLength: 500, // Data recording API recording: recording }; function initWidget(options) { if (options === void 0) { options = {}; } if (!Object.assign) { // don't show widget if this browser is too old return false; } options = Object.assign({}, DEFAULT_OPTIONS, options); if (!options.recording.init()) { // don't show widget if there's no way to record the responses return false; } var prefs = Prefs("rate-the-docs"); document.body.insertAdjacentHTML("beforeend", widgetHtml); var widget = document.body.querySelector(".ratd-widget"); widget.querySelectorAll("a[href='#contact']").forEach(function (contactEl) { contactEl.href = options.contactLink; }); function switchToPanel(panelName) { var activePanel = widget.querySelector(".ratd-panel-" + panelName); widget.querySelectorAll(".ratd-panel").forEach(function (panel) { if (panel === activePanel) { panel.style.height = panel.scrollHeight + "px"; panel.removeAttribute("aria-hidden"); } else { panel.style.height = "0px"; panel.setAttribute("aria-hidden", "true"); } }); if (panelName !== "rating") { enableToggleButton("close"); } } // // Toggle button // function enableToggleButton(buttonName) { var enabledButton = widget.querySelector(".ratd-toggle-" + buttonName); widget.querySelectorAll(".ratd-toggle").forEach(function (button) { if (button === enabledButton) { button.disabled = false; button.removeAttribute("aria-hidden"); } else { button.disabled = true; button.setAttribute("aria-hidden", "true"); } }); } function closeWidget() { widget.setAttribute("aria-hidden", "true"); widget.addEventListener("transitionend", function (event) { if (event.currentTarget === widget) { widget.classList.remove("ratd-state-closing"); widget.classList.add("ratd-state-closed"); } }); widget.classList.add("ratd-state-closing"); } function collapseWidget() { widget.classList.add("ratd-state-collapsed"); widget.querySelector(".ratd-panels").setAttribute("aria-hidden", "true"); enableToggleButton("expand"); prefs.set("collapsed", true); } function expandWidget() { widget.classList.remove("ratd-state-collapsed"); widget.querySelector(".ratd-panels").removeAttribute("aria-hidden"); enableToggleButton("collapse"); prefs.set("collapsed", false); } widget.querySelector(".ratd-toggle-close").addEventListener("click", closeWidget); widget.querySelector(".ratd-toggle-collapse").addEventListener("click", collapseWidget); widget.querySelector(".ratd-toggle-expand").addEventListener("click", expandWidget); // // Rating panel // function handleRatingVote(event) { var rating = event.currentTarget.dataset["rating"]; event.preventDefault(); event.currentTarget.disabled = true; if (rating === "1") { options.recording.recordUpVote(); switchToPanel("thanks"); } else { options.recording.recordDownVote(); switchToPanel("suggestion"); suggestionTextarea.focus(); // ugh } } widget.querySelectorAll(".ratd-rating-vote").forEach(function (voteButton) { return voteButton.addEventListener("click", handleRatingVote); }); // // Suggestion panel // var suggestionForm = widget.querySelector(".ratd-panel-suggestion"); var suggestionTextarea = suggestionForm.querySelector("#ratd_suggestion_text"); var suggestionSubmit = suggestionForm.querySelector("button[type=submit]"); suggestionTextarea.maxLength = options.suggestionMaxLength; inputLengthCounter(suggestionTextarea, suggestionForm.querySelector(".ratd-suggestion-length")); function requireSuggestion() { var isEmpty = suggestionTextarea.value.trim().length < 1; suggestionSubmit.disabled = isEmpty; } suggestionTextarea.addEventListener("input", requireSuggestion); requireSuggestion(); suggestionForm.addEventListener("submit", function (event) { event.preventDefault(); suggestionSubmit.disabled = true; options.recording.recordSuggestion(suggestionTextarea.value.trim()); switchToPanel("thanks"); }); // Initial state switchToPanel("rating"); if (prefs.get("collapsed")) { collapseWidget(); } else { expandWidget(); } requestAnimationFrame(function () { widget.classList.remove("ratd-state-loading"); }); } function inputLengthCounter(input, lengthDisplay) { function updateLength() { // (should replace this with something aria-friendly) lengthDisplay.textContent = input.value.length + "/" + input.maxLength; } input.addEventListener("input", updateLength); updateLength(); // init } function onDocumentReady(callback) { if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading") { callback(); } else { document.addEventListener('DOMContentLoaded', callback); } } onDocumentReady(function () { initWidget(window.RATETHEDOCS_OPTIONS); }); //# sourceMappingURL=rate-the-docs.es.js.map