UNPKG

@lspriv/wx-calendar

Version:

微信小程序日历

1 lines 13.8 kB
"use strict";var P,s=this&&this.__awaiter||function(e,r,s,_){return new(s=s||Promise)(function(i,t){function a(e){try{n(_.next(e))}catch(e){t(e)}}function h(e){try{n(_.throw(e))}catch(e){t(e)}}function n(e){var t;e.done?i(e.value):((t=e.value)instanceof s?t:new s(function(e){e(t)})).then(a,h)}n((_=_.apply(e,r||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.YearPrinter=void 0;let e=require("../interface/component"),p=require("../interface/calendar"),r=require("./layout"),_=require("./constants"),d=require("../utils/shared"),o=require("./tools"),n=20,a=((e=>{e[e.minimize=1]="minimize",e[e.maximize=2]="maximize"})(P=P||{}),(e,t=0)=>({min:t,max:e})),l=(e,t,i,a)=>({canvas:e,ctx:t,width:i,height:a,frame:0,state:P.minimize,rendered:!1}),A=(e,t,i)=>i<=0?e:i>=n?t:Math.sin(i/n*Math.PI/2)*(t-e)+e,h={light:{month:"#333",week:"#ABABAB",date:"#333",rest:"#ABABAB",checked:"#FFF",present:"","checked-bg":"#F5F5F5"},dark:{month:"#D9D9D9",week:"#484848",date:"#D9D9D9",rest:"#484848",checked:"#D9D9D9",present:"","checked-bg":"#262626"}};class t extends e.CalendarHandler{constructor(){super(...arguments),this._canvas_=[],this._translate_x_=0,this._translate_y_=0,this._calendar_x_=0,this._calendar_y_=0,this._header_offset_=0,this.renderCheckedBg=!0}initialize(){return s(this,void 0,void 0,function*(){var{fonts:e,weekstart:t,dark:i}=this._instance_.data;return this._font_=e,this._weeks_=(0,p.sortWeeks)(t),i&&this.bindThemeChange(),this.initializeSize(),this.initializeColors(),this.initializeRender()})}initializeSize(){var e=this._instance_,t=r.Layout.rpxToPx(40),i=r.Layout.rpxToPx(60),i=(this._title_size_=a(i,t),r.Layout.rpxToPx(16)),t=r.Layout.rpxToPx(20),t=(this._week_size_=a(t,i),r.Layout.rpxToPx(10)),i=(this._week_padding_y_=a(t),r.Layout.rpxToPx(20)),t=r.Layout.rpxToPx(36),t=(this._date_size_=a(t,i),r.Layout.rpxToPx(16)),i=r.Layout.rpxToPx(0),i=(this._panel_padding_=a(i,t),this._title_padding_x_=r.Layout.rpxToPx(20),r.Layout.rpxToPx(16)),t=r.Layout.rpxToPx(10),t=(this._month_padding_=a(t,i),r.Layout.rpxToPx(14)),i=r.Layout.rpxToPx(24),i=(this._mark_width_=a(i,t),r.Layout.rpxToPx(4)),t=r.Layout.rpxToPx(8),t=(this._mark_height_=a(t,i),e._calendar_.service.getConf("PRINTER_ALWAYS_DATE_MARK")),i=t?24:0,t=(this._title_height_=r.Layout.rpxToPx(100),this._title_padding_y_=r.Layout.rpxToPx(20),this._week_height_=r.Layout.rpxToPx(50),this._date_height_=r.Layout.rpxToPx(100-i),this._checked_radius_max_=r.Layout.rpxToPx(50),this._checked_offset_max_=r.Layout.rpxToPx(i/2),e.data.customNavBar||(this._header_offset_=r.Layout.layout.menuBottom-this._title_height_),(0,o.hasLayoutArea)(e.data.areaHideCls,"header"));this._header_offset_-=t?0:r.Layout.rpxToPx(80)}initializeColors(){var e,t,i;this._style_!==this._instance_.data.style&&(t=this._style_=this._instance_.data.style||"",{light:i,dark:e}=h,i.present=e.present=this._instance_._theme_,t=t.match(/--wc-annual-cv-.*?-(?:dark|light):[^;]+;?/g),i={light:Object.assign({},i),dark:Object.assign({},e)},this._colors_=(null==t?void 0:t.reduce((e,t)=>{var[,t,i,a]=t.match(/--wc-annual-cv-(.+)-(dark|light)\s*:\s*([^;]+);?/);return/^var\(/.test(a)?(0,o.warn)(`年面板颜色样式不支持css变量:--wc-annual-cv-${t}-${i}: ${a};`):(t=t.replace(/-color$/,""),(0,d.hasOwn)(e[i],t)&&(e[i]=e[i]||{},e[i][t]=a.trim())),e},i))||i)}initializeCanvas(e){return new Promise(n=>{this._instance_.createSelectorQuery().in(this._instance_).select(e).fields({node:!0,size:!0,context:!0}).exec(e=>{var{node:e,width:t,height:i}=e[0],a=null==e?void 0:e.getContext("2d"),h=r.Layout.dpr;e&&(e.width=t*h),e&&(e.height=i*h),null!=a&&a.scale(h,h),n(l(e,a,t,i))})})}initializeRender(){return s(this,void 0,void 0,function*(){this.skyline||(this._canvas_=yield(0,d.promises)(Array.from({length:_.CALENDAR_PANELS},(e,t)=>this.initializeCanvas(""+_.SELECTOR.ANNUAL_CANVAS+t))),this._canvas_.forEach((e,t)=>{this.render(e,this._instance_._panel_.getFullYear(t))}))})}color(e){return this._colors_[r.Layout.theme][e]}renderFrame(e){var{state:t,frame:i}=e,a=t&P.maximize,h=a?1:+A(1,0,i).toFixed(1),t=t&P.minimize&&i?Math.max((10*h*15-50)/100,0):h,h=a?this._panel_padding_.max:this._panel_padding_.min,n=a?this._panel_padding_.min:this._panel_padding_.max,h=A(h,n,i),n=a?this._translate_x_+this._calendar_x_:0,r=a?0:this._translate_x_+this._calendar_x_,n=A(n,r,i),r=this._translate_y_+this._header_offset_,s=a?r:0,r=a?0:r,s=A(s,r,i),r=(e.width-2*h)/3,_=(e.height-h)/4,d=this._instance_.$_calendar_width.value,o=a?d:r,d=a?r:d,o=A(o,d,i),d=a?e.width:_,e=a?_:e.width,d=A(d,e,i),e=d/10,l=a?this._month_padding_.max:this._month_padding_.min,c=a?this._month_padding_.min:this._month_padding_.max,l=A(l,c,i),c=(d-3*e)/6,m=(o-2*l)/7,u=a?this._title_height_:2*e,x=a?2*e:this._title_height_,u=A(u,x,i),x=(this._title_height_+this._title_padding_y_+this._title_size_.max)/2,g=e+(e+this._week_size_.min)/2,y=a?x:g,g=a?g:x,x=A(y,g,i),y=a?this._title_size_.max:this._title_size_.min,g=a?this._title_size_.min:this._title_size_.max,y=A(y,g,i),g=a?this._week_size_.max:this._week_size_.min,f=a?this._week_size_.min:this._week_size_.max,g=A(g,f,i),f=a?this._week_height_:e,k=a?e:this._week_height_,f=A(f,k,i),k=a?this._week_padding_y_.max:this._week_padding_y_.min,p=a?this._week_padding_y_.min:this._week_padding_y_.max,k=A(k,p,i),p=a?this._date_size_.max:this._date_size_.min,v=a?this._date_size_.min:this._date_size_.max,p=A(p,v,i),v=a?this._date_height_:e,w=a?e:this._date_height_,v=A(v,w,i),w=a?this._mark_width_.max:this._mark_width_.min,z=a?this._mark_width_.min:this._mark_width_.max,w=A(w,z,i),z=a?this._mark_height_.max:this._mark_height_.min,C=a?this._mark_height_.min:this._mark_height_.max,z=A(z,C,i),C=Math.min((r-2*l)/14,(_-3*e)/12),r=a?this._checked_radius_max_:C,_=a?C:this._checked_radius_max_,C=Math.max(A(r,_,i),0),r=a?this._checked_offset_max_:0,_=a?0:this._checked_offset_max_,a=A(r,_,i);return{alpha:t,padding:h,width:o,height:d,row:e,translateX:n,translateY:s,monthPaddingX:l,titleHeight:u,titleOffsetY:x,titleFontSize:y,titlePaddingX:this._title_padding_x_,titleColor:this.color("month"),weekHeight:f,weekFontSize:g,weekPaddingY:k,weekColor:this.color("week"),dateRow:c,dateCol:m,dateFontSize:p,dateHeight:v,dateColor:this.color("date"),restColor:this.color("rest"),markWidth:w,markHeight:z,checkedRadius:C,checkedOffset:a}}calcDateOuterHeight(e,t,i){var a=e.state&P.maximize,h=r.Layout.layout.mainHeight,h=h/t.weeks,t=a?h:i.dateRow,a=a?i.dateRow:h;return A(t,a,e.frame)}attachChecked(e,t,i,a){var h=t.state&P.maximize,n=this._instance_.data.checked;e.checked=h||!a?null:(0,p.inMonthDate)(i,a,n.day),e.todayIsChecked=!!e.checked&&(0,p.isToday)(e.checked),e.todayCheckedColor=this.renderCheckedBg&&(e.todayIsChecked||h||!t.frame)?this.color("checked"):this.color("present")}render(t,i,a){if(t&&t.ctx){t.year!==i.year&&(t.year=i.year);var e=t.ctx,h=(e.clearRect(0,0,t.width,t.height),this.renderFrame(t));this.attachChecked(h,t,i.year,a);for(let e=0;e<12;e++){var n=h.translateX+h.padding+e%3*h.width,r=h.translateY+h.padding+Math.floor(e/3)*h.height;this.renderMonth(t,i,e,{x:n,y:r},h,a)}t.rendered||(t.rendered=!0)}}renderMonth(e,t,i,a,h,n){var{x:a,y:r}=a,i=t.months[i],n=n&&n!==i.month?h.alpha:1,r=(e.ctx.globalAlpha=n,this.renderMonthTitle(e,i,{x:a,y:r},h,n),this.renderWeek(e,{x:a,y:r+h.titleHeight},h),r+h.titleHeight+h.weekHeight);h.dateOuterHeight=this.calcDateOuterHeight(e,i,h),this.renderCheckedBg&&this.renderChecked(e,i,{x:a,y:r},h),this.renderDates(e,i,t.marks,{x:a,y:r},h,n)}renderMonthTitle(e,t,i,a,h){var{ctx:e,state:n}=e,{x:i,y:r}=i,{year:n,month:s}=(e.globalAlpha=n&P.maximize?h:a.alpha,p.WxCalendar.today),n=t.year===n&&t.month===s;e.font=`bold ${a.titleFontSize}px `+this._font_,e.textBaseline="bottom",e.textAlign="left",e.fillStyle=n?this.color("present"):a.titleColor,e.fillText(t.month+"月",i+a.titlePaddingX,r+a.titleOffsetY),e.globalAlpha=h}renderWeek(e,t,i){var a=e.ctx,{x:h,y:e}=t,n=e+(i.weekHeight+i.weekPaddingY)/2;a.font=i.weekFontSize+"px "+this._font_,a.textBaseline="middle",a.textAlign="center",a.fillStyle=i.weekColor;for(let e=0;e<7;e++){var r=h+i.monthPaddingX+e*i.dateCol+i.dateCol/2;a.fillText(this._weeks_[e],r,n)}}renderChecked(e,t,i,a){var h=p.WxCalendar.today,n=t.year===h.year&&t.month===h.month,{ctx:r,state:s}=e,{x:i,y:_}=i,s=s&P.maximize;s&&!n||(n&&(h=(n=h.day-1+t.start)%7,n=Math.floor(n/7),h=i+a.monthPaddingX+h*a.dateCol+a.dateCol/2,n=_+n*a.dateOuterHeight+a.dateHeight/2,!s&&!a.todayIsChecked&&e.frame||(r.fillStyle=this.color("present"),r.beginPath(),r.arc(h,n+a.checkedOffset,a.checkedRadius,0,2*Math.PI),r.fill())),!a.todayIsChecked&&a.checked&&a.checked.month===t.month&&e.frame&&(h=(s=a.checked.day-1+t.start)%7,n=Math.floor(s/7),e=i+a.monthPaddingX+h*a.dateCol+a.dateCol/2,t=_+n*a.dateOuterHeight+a.dateHeight/2,r.fillStyle=this.color("checked-bg"),r.beginPath(),r.arc(e,t+a.checkedOffset,a.checkedRadius,0,2*Math.PI),r.fill()))}renderDates(i,a,h,e,n,r){var{ctx:s,state:t,frame:_}=i,{x:d,y:o}=e,l=n.dateOuterHeight,c=t&P.maximize||!_;s.font=`bold ${n.dateFontSize}px `+this._font_,s.textBaseline="middle",s.textAlign="center";for(let t=0;t<a.days;t++)if(!(t<a.start)){var m=t%7,u=Math.floor(t/7),x=d+n.monthPaddingX+m*n.dateCol+n.dateCol/2,u=o+u*l+n.dateHeight/2;let e={x:x,y:u};var g=t-a.start+1,y={year:a.year,month:a.month,day:g},f=h.get((0,p.getAnnualMarkKey)(y)),k=(0,p.themeStyle)(null==(k=null==f?void 0:f.style)?void 0:k.opacity),k=(k&&(s.globalAlpha=k),null!=(k=null==f?void 0:f.style)&&k.bgColor&&this.renderDateBg(i,f.style,e,n),(0,p.themeStyle)(null==(k=null==f?void 0:f.style)?void 0:k.color));s.fillStyle="initial"!==k&&k||((0,p.isToday)(y)?n.todayCheckedColor:c&&("rest"===(null==f?void 0:f.rwtype)||this.isWeekend(m)&&"work"!==(null==f?void 0:f.rwtype))?n.restColor:n.dateColor),s.fillText(""+g,x,u),s.globalAlpha=r,this.renderMark(i,y,h,e,n,r)}}renderMark(e,t,i,a,h,n){var r,s,i=i.get((0,p.getAnnualMarkKey)(t));null!=i&&i.sub&&(t=e.ctx,r=a.x-h.markWidth/2,a=a.y+h.dateFontSize/2+this._mark_height_.min,s=Math.max(h.markHeight/2,0),t.globalAlpha=e.state&P.maximize?1:h.alpha,t.fillStyle=i.sub,t.save(),t.beginPath(),t.arc(r+s,a+s,s,.5*Math.PI,1.5*Math.PI),t.arc(r+h.markWidth-s,a+s,s,-.5*Math.PI,.5*Math.PI),t.closePath(),t.clip(),t.fill(),t.restore(),t.globalAlpha=n)}renderDateBg(e,t,i,a){var e=e.ctx,{x:i,y:h}=i,n=this.dateBgRadius(a.checkedRadius,(0,p.themeStyle)(t.bgTLRadius)),r=this.dateBgRadius(a.checkedRadius,(0,p.themeStyle)(t.bgTRRadius)),s=this.dateBgRadius(a.checkedRadius,(0,p.themeStyle)(t.bgBLRadius)),_=this.dateBgRadius(a.checkedRadius,(0,p.themeStyle)(t.bgBRRadius)),d=(0,p.themeStyle)(t.bgWidth),d=d?Math.ceil(10*a[d]/2)/10:a.checkedRadius,o=a.checkedRadius,h=h+a.checkedOffset;e.fillStyle=(0,p.themeStyle)(t.bgColor)||"rgba(0,0,0,0)",e.save(),e.beginPath(),n?e.arc(i-d+n,h-o+n,n,+Math.PI,1.5*Math.PI):e.moveTo(i-d,h-o),r?e.arc(i+d-r,h-o+r,r,1.5*Math.PI,2*Math.PI):e.lineTo(i+d,h-o),_?e.arc(i+d-_,h+o-_,_,0,.5*Math.PI):e.lineTo(i+d,h+o),s?e.arc(i-d+s,h+o-s,s,.5*Math.PI,+Math.PI):e.lineTo(i-d,h+o),e.closePath(),e.clip(),e.fill(),e.restore()}dateBgRadius(e,t){return t?50<t?e:Math.max(Math.floor(t*e*2/100),0):0}isWeekend(e){e=(e+this._instance_.data.weekstart)%7;return 0==e||6==e}requestAnimation(t,i,a){return new Promise(e=>{this.requestAnimationFrame(t,i,a,e)})}requestAnimationFrame(e,t,i,a){var h;e.frame>=n?(e.frame=0,null!=a&&a()):null!=(h=e.canvas)&&h.requestAnimationFrame(()=>{e.frame++,this.render(e,t,i),this.requestAnimationFrame(e,t,i,a)})}getCanvas(t){return s(this,void 0,void 0,function*(){var e;return this._canvas_[t]||(e=yield this.initializeCanvas(""+_.SELECTOR.ANNUAL_CANVAS+t),this._canvas_[t]=e)})}initializeTransform(t,i){return s(this,void 0,void 0,function*(){var e=this._instance_.$_calendar_width.value;this._translate_x_=i%3*-e,this._translate_y_=-t.width*Math.floor(i/3)+(this._calendar_y_-r.Layout.layout.menuBottom)})}checkInitializeRender(e=[]){for(let i=0;i<_.CALENDAR_PANELS;i++)if(!e.includes(i)){var a=this._canvas_[i];let t=this._instance_._panel_.getFullYear(i);a&&a.rendered&&a.state&P.minimize&&!a.frame||s(this,void 0,void 0,function*(){var e=yield this.getCanvas(i);this.renderMinimize(e,t)})}}renderMinimize(e,t){e.frame=0,e.state=P.minimize,this.render(e,t)}open(h,n,r){return s(this,void 0,void 0,function*(){this._calendar_x_=n.left,this._calendar_y_=n.top;var e=this._instance_.data.annualCurr,t=yield this.getCanvas(e),i=(yield this.initializeTransform(t,h.month-1),this._instance_._panel_.getFullYear(e)),a=t.state;t.state=P.maximize,t.frame=0,a&P.minimize&&this.render(t,i),null!=r&&r(),yield this.requestAnimation(t,i),t.state=P.minimize,this.checkInitializeRender([e])})}close(i){return s(this,void 0,void 0,function*(){var e=this._instance_.data.annualCurr,t=this._canvas_[e],e=(yield this.initializeTransform(t,i.month-1),this._instance_._panel_.getFullYear(e));t.state=P.minimize,t.frame=0,yield this.requestAnimation(t,e,i.month),t.state=P.maximize})}getTapMonth(h,n,r){return s(this,void 0,void 0,function*(){var e=this._canvas_[h],t=this._panel_padding_.min,i=(0,o.nodeRect)(this._instance_),[i,a]=yield(0,d.promises)([(0,o.viewportOffset)(this._instance_),i(""+_.SELECTOR.ANNUAL_CANVAS+h)]),a=r-(null!=(a=a[0].top)?a:0)-i.scrollTop;if(n<t||a<t||n>e.width-t)throw new Error("beyond the boundary");i=(e.width-2*t)/3,e=(e.height-t)/4,a-=t,t=Math.floor((n-t)/i),i=Math.floor(a/e);return{year:this._instance_.data.years[h].year,month:3*i+t+1}})}update(e){e=e||Array.from({length:_.CALENDAR_PANELS},(e,t)=>t);for(var t of e=[...new Set(e)]){var i=this._canvas_[t],t=this._instance_._panel_.getFullYear(t);i&&i.rendered&&!i.frame&&this.render(i,t)}}bindThemeChange(){this._theme_listener_=e=>{e.theme&&(r.Layout.theme=e.theme,this.update())},wx.onThemeChange(this._theme_listener_)}cancelThemeChange(){this._theme_listener_&&wx.offThemeChange(this._theme_listener_),this._theme_listener_=void 0}}exports.YearPrinter=t;