namodio
Version:
Raty - A Star Rating Plugin
1 lines • 12.4 kB
JavaScript
function ownKeys(e,t){var i,n=Object.keys(e);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(e),t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)),n}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(i),!0).forEach(function(t){_defineProperty(e,t,i[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):ownKeys(Object(i)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))})}return e}function _defineProperty(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function _createClass(t,e,i){return e&&_defineProperties(t.prototype,e),i&&_defineProperties(t,i),Object.defineProperty(t,"prototype",{writable:!1}),t}var Raty=function(){function i(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};_classCallCheck(this,i),this.element=t,this.opt=_objectSpread(_objectSpread(_objectSpread({},this.defaultOptions()),e),this._parseOptions(t.dataset))}return _createClass(i,[{key:"defaultOptions",value:function(){return{cancelButton:!1,cancelClass:"raty-cancel",cancelHint:"Cancel this rating!",cancelOff:"cancel-off.png",cancelOn:"cancel-on.png",cancelPlace:"left",click:void 0,half:!1,halfShow:!0,hints:["bad","poor","regular","good","gorgeous"],iconRange:void 0,iconRangeSame:!1,mouseout:void 0,mouseover:void 0,noRatedMsg:"Not rated yet!",number:5,numberMax:20,path:void 0,precision:!1,readOnly:!1,round:{down:.25,full:.6,up:.76},score:void 0,scoreName:"score",single:!1,space:!0,starHalf:"star-half.png",starOff:"star-off.png",starOn:"star-on.png",starType:"img",target:void 0,targetFormat:"{score}",targetKeep:!1,targetScore:void 0,targetText:"",targetType:"hint"}}},{key:"cancel",value:function(t){this._isReadOnly()||(this[t?"click":"score"](null),this.scoreField.removeAttribute("value"))}},{key:"click",value:function(t){this._isReadOnly()||(t=this._adjustedScore(t),this._apply(t),this.opt.click&&this.opt.click.call(this,t,this.element),this._target(t))}},{key:"move",value:function(t){var e=parseInt(t,10),t=this._getDecimal(t,1),i=(e>=this.opt.number&&(e=this.opt.number-1,t=10),this._getWidth()),e=this.stars[e],i=e.offsetLeft+i/10*t,t=new Event("mousemove");t.pageX=i,this.isMove=!0,e.dispatchEvent(t),this.isMove=!1}},{key:"readOnly",value:function(t){this._isReadOnly()!==t&&(t?this._lock():(this._binds(),this._unlock()),this.element.dataset.readOnly=t)}},{key:"score",value:function(){return arguments.length?this.setScore(arguments[0]):this.getScore()}},{key:"setScore",value:function(t){this._isReadOnly()||(t=this._adjustedScore(t),this._apply(t),this._target(t))}},{key:"getScore",value:function(){var t=[],e=this.scoreField.value;return t.push(e?+e:void 0),1<t.length?t:t[0]}},{key:"init",value:function(){return this._executeCallbacks(),this._adjustNumber(),this._adjustHints(),this.opt.score=this._adjustedScore(this.opt.score),"img"!==this.opt.starType&&this._adjustStarName(),this._setPath(),this._createStars(),this.opt.cancelButton&&this._createCancel(),this.opt.precision&&this._adjustPrecision(),this._createScore(),this._apply(this.opt.score),this._setTitle(this.opt.score),this._target(this.opt.score),this.opt.readOnly?this._lock():(this.element.style.cursor="pointer",this._binds()),this}},{key:"_adjustedScore",value:function(t){if(t||0===t)return this._between(t,0,this.opt.number)}},{key:"_adjustHints",value:function(){if(this.opt.hints||(this.opt.hints=[]),this.opt.halfShow||this.opt.half)for(var t=this.opt.precision?10:2,e=0;e<this.opt.number;e++){var i=this.opt.hints[e];"[object Array]"!==Object.prototype.toString.call(i)&&(i=[i]),this.opt.hints[e]=[];for(var n=0;n<t;n++){var s=i[n],a=i[i.length-1];void 0===a&&(a=null),this.opt.hints[e][n]=void 0===s?a:s}}}},{key:"_adjustNumber",value:function(){this.opt.number=this._between(this.opt.number,1,this.opt.numberMax)}},{key:"_adjustPrecision",value:function(){this.opt.half=!0}},{key:"_adjustStarName",value:function(){var t=["cancelOff","cancelOn","starHalf","starOff","starOn"];this.opt.path="";for(var e=0;e<t.length;e++)this.opt[t[e]]=this.opt[t[e]].replace(".","-")}},{key:"_apply",value:function(t){this._fill(t),t&&(0<t&&(this.scoreField.value=t),this._roundStars(t))}},{key:"_attributesForIndex",value:function(t){var e=this._nameForIndex(t),i={alt:t,src:this.opt.path+this.opt[e]};return(i="img"!==this.opt.starType?{"data-alt":t,class:this.opt[e]}:i).title=this._getHint(t),i}},{key:"_between",value:function(t,e,i){return Math.min(Math.max(parseFloat(t),e),i)}},{key:"_binds",value:function(){this.cancelButton&&(this._bindOverCancel(),this._bindClickCancel(),this._bindOutCancel()),this._bindOver(),this._bindClick(),this._bindOut()}},{key:"_bindClick",value:function(){var s=this;this.stars.forEach(function(n){n.addEventListener("click",function(t){var e,i;s._isReadOnly()||(i=s.opt.half||s.opt.precision?s.element.dataset.score:n.alt||n.dataset.alt,s.opt.half&&!s.opt.precision&&(i=s._roundHalfScore(i)),!(e=s.opt.click?s.opt.click.call(s,+i,s.element,t):e)&&void 0!==e||s._apply(+i))})})}},{key:"_bindClickCancel",value:function(){var e=this;this.cancelButton.addEventListener("click",function(t){e.scoreField.removeAttribute("value"),e.opt.click&&e.opt.click.call(e,null,e.element,t)})}},{key:"_bindOut",value:function(){var i=this;this.element.addEventListener("mouseleave",function(t){var e=+i.scoreField.value||void 0;i._apply(e),i._target(e,t),i._resetTitle(),i.opt.mouseout&&i.opt.mouseout.call(i,e,i.element,t)})}},{key:"_bindOutCancel",value:function(){var i=this;this.cancelButton.addEventListener("mouseleave",function(t){var e=i.opt.cancelOff;"img"!==i.opt.starType&&(e="".concat(i.opt.cancelClass," ").concat(e)),i._setIcon(i.cancelButton,e),i.opt.mouseout&&(e=+i.scoreField.value||void 0,i.opt.mouseout.call(i,e,i.element,t))})}},{key:"_bindOver",value:function(){var n=this,t=this.opt.half?"mousemove":"mouseover";this.stars.forEach(function(i){i.addEventListener(t,function(t){var e=n._getScoreByPosition(t,i);n._fill(e),n.opt.half&&(n._roundStars(e,t),n._setTitle(e,t),n.element.dataset.score=e),n._target(e,t),n.opt.mouseover&&n.opt.mouseover.call(n,e,n.element,t)})})}},{key:"_bindOverCancel",value:function(){var n=this;this.cancelButton.addEventListener("mouseover",function(t){var e,i;n._isReadOnly()||(e=n.opt.path+n.opt.starOff,i=n.opt.cancelOn,"img"===n.opt.starType?n.stars.forEach(function(t){t.src=e}):(i=n.opt.cancelClass+" "+i,n.stars.forEach(function(t){t.className=e})),n._setIcon(n.cancelButton,i),n._target(null,t),n.opt.mouseover&&n.opt.mouseover.call(n,null,n.element,t))})}},{key:"_buildScoreField",value:function(){var t=document.createElement("input");return t.name=this.opt.scoreName,t.type="hidden",this.element.appendChild(t),t}},{key:"_createCancel",value:function(){var t=document.createElement(this.opt.starType),e=this.opt.path+this.opt.cancelOff;t.setAttribute("class",this.opt.cancelClass),t.setAttribute("title",this.opt.cancelHint),"img"===this.opt.starType?(t.setAttribute("alt","x"),t.setAttribute("src",e)):(t.classList.add(e),t.setAttribute("data-alt","x")),"left"===this.opt.cancelPlace?(this.element.prepend(" "),this.element.prepend(t)):(this.element.append(" "),this.element.appendChild(t)),this.cancelButton=t}},{key:"_createScore",value:function(){this.scoreField=document.querySelector(this.opt.targetScore)||this._buildScoreField()}},{key:"_createStars",value:function(){for(var t=1;t<=this.opt.number;t++){var e,i=this._attributesForIndex(t),n=document.createElement(this.opt.starType);for(e in i)n.setAttribute(e,i[e]);this.element.appendChild(n),this.opt.space&&t<this.opt.number&&this.element.append(" ")}this.stars=this.element.querySelectorAll(this.opt.starType)}},{key:"_error",value:function(t){throw new Error(t)}},{key:"_executeCallbacks",value:function(){for(var t,e=["number","readOnly","score","scoreName","target","path"],i=0;i<e.length;i++)"function"==typeof this.opt[e[i]]&&((t=this.opt[e[i]].call(this,this.element))?this.opt[e[i]]=t:delete this.opt[e[i]])}},{key:"_fill",value:function(t){var e=0;if(this.opt.iconRangeSame&&this.opt.iconRange)for(;e<this.opt.iconRange.length&&this.opt.iconRange[e].range<t;)e++;for(var i=1;i<=this.stars.length;i++){var n,s=this.stars[i-1],a=this._turnOn(i,t),o=void 0;this.opt.iconRange&&this.opt.iconRange.length>e?(n=this.opt.iconRange[e],o=this._getRangeIcon(n,a),i<=n.range&&this._setIcon(s,o),i===n.range&&e++):(o=this.opt[a?"starOn":"starOff"],this._setIcon(s,o))}}},{key:"_getDecimal",value:function(t,e){var t=t.toString().split(".")[1],i=0;return t&&(i=parseInt(t.slice(0,e),10),"9999"===t.slice(1,5)&&i++),i}},{key:"_getRangeIcon",value:function(t,e){return e?t.on||this.opt.starOn:t.off||this.opt.starOff}},{key:"_getScoreByPosition",value:function(t,e){var i,n=parseInt(e.alt||e.getAttribute("data-alt"),10);return this.opt.half&&(i=this._getWidth(),n=n-1+parseFloat((t.pageX-e.offsetLeft)/i)),n}},{key:"_getHint",value:function(t,e){var i,n,s;return 0===t||t?(i=Math.ceil(t),i=this.opt.hints[(i||1)-1],e=!e||this.isMove,n=this._getDecimal(t,1),s=i,this.opt.precision?s=i[n=e?0===n?9:n-1:n]:(this.opt.halfShow||this.opt.half)&&(s=i[n=e&&0===n||5<n?1:0]),""===s?"":s||t):this.opt.noRatedMsg}},{key:"_getWidth",value:function(){var t=parseFloat(this.stars[0].offsetWidth)||16;return t||this._error("Could not get the icon width!"),t}},{key:"_isReadOnly",value:function(){return{true:!0}[this.element.dataset.readOnly]||!1}},{key:"_lock",value:function(){var e=this._getHint(this.scoreField.value);this.element.style.pointerEvents="none",this.element.title=e,this.scoreField.readOnly=!0,this.stars.forEach(function(t){t.title=e}),this.cancelButton&&(this.cancelButton.style.display="none"),this.element.dataset.readOnly=!0}},{key:"_nameForIndex",value:function(t){return this.opt.score&&this.opt.score>=t?"starOn":"starOff"}},{key:"_resetTitle",value:function(){for(var t=0;t<this.opt.number;t++)this.stars[t].title=this._getHint(t+1)}},{key:"_parseOptions",value:function(n){return Object.keys(n).reduce(function(t,e){var i=null!=(i={true:!0,false:!1}[n[e]])?i:n[e];return!isNaN(i)&&Number.isInteger(parseFloat(i))&&(i=Number(i)),t[e]=i,t},{})}},{key:"_roundHalfScore",value:function(t){var e=parseInt(t,10),t=this._getDecimal(t,1);return e+(t=0!==t?5<t?1:.5:t)}},{key:"_roundStars",value:function(t,e){var e=this._starName(t,e);e&&(e=this.opt[e],(t=this.stars[Math.ceil(t)-1])&&this._setIcon(t,e))}},{key:"_setIcon",value:function(t,e){t["img"===this.opt.starType?"src":"className"]=this.opt.path+e}},{key:"_setPath",value:function(){this.opt.path=this.opt.path||"",this.opt.path&&"/"!==this.opt.path.slice(-1)&&(this.opt.path+="/")}},{key:"_setTarget",value:function(t,e){e=e&&this.opt.targetFormat.toString().replace("{score}",e),t instanceof HTMLInputElement||t instanceof HTMLSelectElement?t.value=e:t.textContent=e}},{key:"_setTitle",value:function(t,e){var i;t&&(i=parseInt(Math.ceil(t),10),this.stars[i-1].title=this._getHint(t,e))}},{key:"_starName",value:function(t,e){t=+(t%1).toFixed(2);return e||this.isMove?.5<t?"starOn":"starHalf":t<=this.opt.round.down?void 0:this.opt.halfShow&&t<this.opt.round.up?"starHalf":t<this.opt.round.full?"starOff":"starOn"}},{key:"_target",value:function(t,e){var i,n;this.opt.target&&((i=document.querySelector(this.opt.target))||this._error("Target selector invalid or missing!"),n=e&&"mouseover"===e.type,void 0===t?t=this.opt.targetText:null===t?t=n?this.opt.cancelHint:this.opt.targetText:("hint"===this.opt.targetType?t=this._getHint(t,e):this.opt.precision&&(t=parseFloat(t).toFixed(1)),e=e&&"mousemove"===e.type,n||e||this.opt.targetKeep||(t=this.opt.targetText)),this._setTarget(i,t))}},{key:"_turnOn",value:function(t,e){return this.opt.single?t===e:t<=e}},{key:"_unlock",value:function(){this.element.style.cursor="pointer",this.element.style.pointerEvents="auto",this.element.removeAttribute("title"),this.element.dataset.readOnly=!1,this.scoreField.readOnly=!1,this._resetTitle(),this.cancelButton&&(this.cancelButton.style.display="")}}]),i}();