rate-the-docs
Version:
Feedback widget for Read the Docs documentation
316 lines (270 loc) • 20 kB
JavaScript
/*! 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… 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