ng-zorro-antd-date-picker.mjs 207 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581
  1. import * as i0 from '@angular/core';
  2. import { EventEmitter, booleanAttribute, Output, Input, ChangeDetectionStrategy, ViewEncapsulation, Component, Injectable, Directive, inject, NgModule, computed, signal, forwardRef, ViewChildren, ViewChild } from '@angular/core';
  3. import { NgTemplateOutlet, DOCUMENT } from '@angular/common';
  4. import * as i2 from 'ng-zorro-antd/button';
  5. import { NzButtonModule } from 'ng-zorro-antd/button';
  6. import * as i10 from 'ng-zorro-antd/core/outlet';
  7. import { NzStringTemplateOutletDirective, NzOutletModule } from 'ng-zorro-antd/core/outlet';
  8. import { CandyDate, normalizeRangeValue, cloneDate, wrongSortOrder } from 'ng-zorro-antd/core/time';
  9. import * as i1 from 'ng-zorro-antd/i18n';
  10. import { DateHelperService, NzI18nService } from 'ng-zorro-antd/i18n';
  11. import * as i3 from 'ng-zorro-antd/core/transition-patch';
  12. import * as i4 from 'ng-zorro-antd/core/wave';
  13. import { __esDecorate, __runInitializers } from 'tslib';
  14. import { ESCAPE } from '@angular/cdk/keycodes';
  15. import { CdkConnectedOverlay } from '@angular/cdk/overlay';
  16. import * as i9 from '@angular/forms';
  17. import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
  18. import { ReplaySubject, Subject, merge, of } from 'rxjs';
  19. import { takeUntil, distinctUntilChanged, withLatestFrom, map } from 'rxjs/operators';
  20. import { slideMotion } from 'ng-zorro-antd/core/animation';
  21. import * as i1$1 from 'ng-zorro-antd/core/config';
  22. import { WithConfig } from 'ng-zorro-antd/core/config';
  23. import { NzFormStatusService, NzFormNoStatusService, NzFormItemFeedbackIconComponent } from 'ng-zorro-antd/core/form';
  24. import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation';
  25. import * as i12 from 'ng-zorro-antd/core/overlay';
  26. import { DEFAULT_DATE_PICKER_POSITIONS, DATE_PICKER_POSITION_MAP, NzOverlayModule } from 'ng-zorro-antd/core/overlay';
  27. import * as i6 from 'ng-zorro-antd/core/services';
  28. import { NzDestroyService } from 'ng-zorro-antd/core/services';
  29. import { valueFunctionProp, fromEventOutsideAngular, toBoolean, getStatusClassNames } from 'ng-zorro-antd/core/util';
  30. import * as i11$1 from 'ng-zorro-antd/icon';
  31. import { NzIconModule } from 'ng-zorro-antd/icon';
  32. import * as i8 from 'ng-zorro-antd/space';
  33. import { NZ_SPACE_COMPACT_SIZE, NZ_SPACE_COMPACT_ITEM_TYPE, NzSpaceCompactItemDirective } from 'ng-zorro-antd/space';
  34. import * as i11 from 'ng-zorro-antd/time-picker';
  35. import { NzTimePickerModule } from 'ng-zorro-antd/time-picker';
  36. import { startOfQuarter } from 'date-fns';
  37. import * as i4$1 from 'ng-zorro-antd/cdk/resize-observer';
  38. import * as i5 from '@angular/cdk/platform';
  39. import * as i7 from '@angular/cdk/bidi';
  40. /**
  41. * Use of this source code is governed by an MIT-style license that can be
  42. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  43. */
  44. /**
  45. * Use of this source code is governed by an MIT-style license that can be
  46. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  47. */
  48. const PREFIX_CLASS = 'ant-picker';
  49. const defaultDisabledTime = {
  50. nzDisabledHours() {
  51. return [];
  52. },
  53. nzDisabledMinutes() {
  54. return [];
  55. },
  56. nzDisabledSeconds() {
  57. return [];
  58. }
  59. };
  60. function getTimeConfig(value, disabledTime) {
  61. let disabledTimeConfig = disabledTime ? disabledTime(value && value.nativeDate) : {};
  62. disabledTimeConfig = {
  63. ...defaultDisabledTime,
  64. ...disabledTimeConfig
  65. };
  66. return disabledTimeConfig;
  67. }
  68. function isTimeValidByConfig(value, disabledTimeConfig) {
  69. let invalidTime = false;
  70. if (value) {
  71. const hour = value.getHours();
  72. const minutes = value.getMinutes();
  73. const seconds = value.getSeconds();
  74. const disabledHours = disabledTimeConfig.nzDisabledHours();
  75. if (disabledHours.indexOf(hour) === -1) {
  76. const disabledMinutes = disabledTimeConfig.nzDisabledMinutes(hour);
  77. if (disabledMinutes.indexOf(minutes) === -1) {
  78. const disabledSeconds = disabledTimeConfig.nzDisabledSeconds(hour, minutes);
  79. invalidTime = disabledSeconds.indexOf(seconds) !== -1;
  80. }
  81. else {
  82. invalidTime = true;
  83. }
  84. }
  85. else {
  86. invalidTime = true;
  87. }
  88. }
  89. return !invalidTime;
  90. }
  91. function isTimeValid(value, disabledTime) {
  92. const disabledTimeConfig = getTimeConfig(value, disabledTime);
  93. return isTimeValidByConfig(value, disabledTimeConfig);
  94. }
  95. function isAllowedDate(value, disabledDate, disabledTime) {
  96. if (!value) {
  97. return false;
  98. }
  99. if (disabledDate) {
  100. if (disabledDate(value.nativeDate)) {
  101. return false;
  102. }
  103. }
  104. if (disabledTime) {
  105. if (!isTimeValid(value, disabledTime)) {
  106. return false;
  107. }
  108. }
  109. return true;
  110. }
  111. /**
  112. * Use of this source code is governed by an MIT-style license that can be
  113. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  114. */
  115. /**
  116. * Compatible translate the moment-like format pattern to angular's pattern
  117. * Why? For now, we need to support the existing language formats in AntD, and AntD uses the default temporal syntax.
  118. *
  119. * TODO: compare and complete all format patterns
  120. * Each format docs as below:
  121. *
  122. * @link https://momentjs.com/docs/#/displaying/format/
  123. * @link https://angular.io/api/common/DatePipe#description
  124. * @param format input format pattern
  125. */
  126. function transCompatFormat(format) {
  127. return (format &&
  128. format
  129. .replace(/Y/g, 'y') // only support y, yy, yyy, yyyy
  130. .replace(/D/g, 'd')); // d, dd represent of D, DD for momentjs, others are not support
  131. }
  132. /**
  133. * Use of this source code is governed by an MIT-style license that can be
  134. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  135. */
  136. class CalendarFooterComponent {
  137. dateHelper;
  138. locale;
  139. showToday = false;
  140. showNow = false;
  141. hasTimePicker = false;
  142. isRange = false;
  143. okDisabled = false;
  144. disabledDate;
  145. extraFooter;
  146. rangeQuickSelector = null;
  147. clickOk = new EventEmitter();
  148. clickToday = new EventEmitter();
  149. prefixCls = PREFIX_CLASS;
  150. isTodayDisabled = false;
  151. todayTitle = '';
  152. constructor(dateHelper) {
  153. this.dateHelper = dateHelper;
  154. }
  155. ngOnChanges(changes) {
  156. const now = new Date();
  157. if (changes.disabledDate) {
  158. this.isTodayDisabled = !!(this.disabledDate && this.disabledDate(now));
  159. }
  160. if (changes.locale) {
  161. // NOTE: Compat for DatePipe formatting rules
  162. const dateFormat = transCompatFormat(this.locale.dateFormat);
  163. this.todayTitle = this.dateHelper.format(now, dateFormat);
  164. }
  165. }
  166. onClickToday() {
  167. const now = new CandyDate();
  168. this.clickToday.emit(now.clone()); // To prevent the "now" being modified from outside, we use clone
  169. }
  170. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: CalendarFooterComponent, deps: [{ token: i1.DateHelperService }], target: i0.ɵɵFactoryTarget.Component });
  171. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: CalendarFooterComponent, isStandalone: true, selector: "calendar-footer", inputs: { locale: "locale", showToday: ["showToday", "showToday", booleanAttribute], showNow: ["showNow", "showNow", booleanAttribute], hasTimePicker: ["hasTimePicker", "hasTimePicker", booleanAttribute], isRange: ["isRange", "isRange", booleanAttribute], okDisabled: ["okDisabled", "okDisabled", booleanAttribute], disabledDate: "disabledDate", extraFooter: "extraFooter", rangeQuickSelector: "rangeQuickSelector" }, outputs: { clickOk: "clickOk", clickToday: "clickToday" }, exportAs: ["calendarFooter"], usesOnChanges: true, ngImport: i0, template: `
  172. <div class="{{ prefixCls }}-footer">
  173. @if (extraFooter) {
  174. <div class="{{ prefixCls }}-footer-extra">
  175. <ng-template [nzStringTemplateOutlet]="extraFooter">{{ extraFooter }}</ng-template>
  176. </div>
  177. }
  178. @if (showToday) {
  179. <a
  180. class="{{ prefixCls }}-today-btn {{ isTodayDisabled ? prefixCls + '-today-btn-disabled' : '' }}"
  181. role="button"
  182. (click)="isTodayDisabled ? null : onClickToday()"
  183. title="{{ todayTitle }}"
  184. >
  185. {{ locale.today }}
  186. </a>
  187. }
  188. @if (hasTimePicker || rangeQuickSelector) {
  189. <ul class="{{ prefixCls }}-ranges">
  190. <ng-container *ngTemplateOutlet="rangeQuickSelector" />
  191. @if (showNow) {
  192. <li class="{{ prefixCls }}-now">
  193. <a class="{{ prefixCls }}-now-btn" (click)="isTodayDisabled ? null : onClickToday()">
  194. {{ locale.now }}
  195. </a>
  196. </li>
  197. }
  198. @if (hasTimePicker) {
  199. <li class="{{ prefixCls }}-ok">
  200. <button
  201. nz-button
  202. type="button"
  203. nzType="primary"
  204. nzSize="small"
  205. [disabled]="okDisabled"
  206. (click)="okDisabled ? null : clickOk.emit()"
  207. >
  208. {{ locale.ok }}
  209. </button>
  210. </li>
  211. }
  212. </ul>
  213. }
  214. </div>
  215. `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  216. }
  217. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: CalendarFooterComponent, decorators: [{
  218. type: Component,
  219. args: [{
  220. // eslint-disable-next-line @angular-eslint/component-selector
  221. selector: 'calendar-footer',
  222. exportAs: 'calendarFooter',
  223. imports: [NgTemplateOutlet, NzButtonModule, NzStringTemplateOutletDirective],
  224. template: `
  225. <div class="{{ prefixCls }}-footer">
  226. @if (extraFooter) {
  227. <div class="{{ prefixCls }}-footer-extra">
  228. <ng-template [nzStringTemplateOutlet]="extraFooter">{{ extraFooter }}</ng-template>
  229. </div>
  230. }
  231. @if (showToday) {
  232. <a
  233. class="{{ prefixCls }}-today-btn {{ isTodayDisabled ? prefixCls + '-today-btn-disabled' : '' }}"
  234. role="button"
  235. (click)="isTodayDisabled ? null : onClickToday()"
  236. title="{{ todayTitle }}"
  237. >
  238. {{ locale.today }}
  239. </a>
  240. }
  241. @if (hasTimePicker || rangeQuickSelector) {
  242. <ul class="{{ prefixCls }}-ranges">
  243. <ng-container *ngTemplateOutlet="rangeQuickSelector" />
  244. @if (showNow) {
  245. <li class="{{ prefixCls }}-now">
  246. <a class="{{ prefixCls }}-now-btn" (click)="isTodayDisabled ? null : onClickToday()">
  247. {{ locale.now }}
  248. </a>
  249. </li>
  250. }
  251. @if (hasTimePicker) {
  252. <li class="{{ prefixCls }}-ok">
  253. <button
  254. nz-button
  255. type="button"
  256. nzType="primary"
  257. nzSize="small"
  258. [disabled]="okDisabled"
  259. (click)="okDisabled ? null : clickOk.emit()"
  260. >
  261. {{ locale.ok }}
  262. </button>
  263. </li>
  264. }
  265. </ul>
  266. }
  267. </div>
  268. `,
  269. encapsulation: ViewEncapsulation.None,
  270. changeDetection: ChangeDetectionStrategy.OnPush
  271. }]
  272. }], ctorParameters: () => [{ type: i1.DateHelperService }], propDecorators: { locale: [{
  273. type: Input
  274. }], showToday: [{
  275. type: Input,
  276. args: [{ transform: booleanAttribute }]
  277. }], showNow: [{
  278. type: Input,
  279. args: [{ transform: booleanAttribute }]
  280. }], hasTimePicker: [{
  281. type: Input,
  282. args: [{ transform: booleanAttribute }]
  283. }], isRange: [{
  284. type: Input,
  285. args: [{ transform: booleanAttribute }]
  286. }], okDisabled: [{
  287. type: Input,
  288. args: [{ transform: booleanAttribute }]
  289. }], disabledDate: [{
  290. type: Input
  291. }], extraFooter: [{
  292. type: Input
  293. }], rangeQuickSelector: [{
  294. type: Input
  295. }], clickOk: [{
  296. type: Output
  297. }], clickToday: [{
  298. type: Output
  299. }] } });
  300. /**
  301. * Use of this source code is governed by an MIT-style license that can be
  302. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  303. */
  304. class DatePickerService {
  305. initialValue;
  306. value;
  307. activeDate;
  308. activeInput = 'left';
  309. arrowLeft = 0;
  310. isRange = false;
  311. valueChange$ = new ReplaySubject(1);
  312. emitValue$ = new Subject();
  313. inputPartChange$ = new Subject();
  314. initValue(reset = false) {
  315. if (reset) {
  316. this.initialValue = this.isRange ? [] : null;
  317. }
  318. this.setValue(this.initialValue);
  319. }
  320. hasValue(value = this.value) {
  321. if (Array.isArray(value)) {
  322. return !!value[0] || !!value[1];
  323. }
  324. else {
  325. return !!value;
  326. }
  327. }
  328. makeValue(value) {
  329. if (this.isRange) {
  330. return value ? value.map(val => new CandyDate(val)) : [];
  331. }
  332. else {
  333. return value ? new CandyDate(value) : null;
  334. }
  335. }
  336. setActiveDate(value, hasTimePicker = false, mode = 'month') {
  337. const parentPanels = {
  338. date: 'month',
  339. month: 'year',
  340. quarter: 'year',
  341. year: 'decade'
  342. };
  343. if (this.isRange) {
  344. this.activeDate = normalizeRangeValue(value, hasTimePicker, parentPanels[mode], this.activeInput);
  345. }
  346. else {
  347. this.activeDate = cloneDate(value);
  348. }
  349. }
  350. setValue(value) {
  351. this.value = value;
  352. this.valueChange$.next(this.value);
  353. }
  354. getActiveIndex(part = this.activeInput) {
  355. return { left: 0, right: 1 }[part];
  356. }
  357. ngOnDestroy() {
  358. this.valueChange$.complete();
  359. this.emitValue$.complete();
  360. this.inputPartChange$.complete();
  361. }
  362. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DatePickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
  363. static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DatePickerService });
  364. }
  365. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DatePickerService, decorators: [{
  366. type: Injectable
  367. }] });
  368. /**
  369. * Use of this source code is governed by an MIT-style license that can be
  370. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  371. */
  372. class AbstractPanelHeader {
  373. prefixCls = `ant-picker-header`;
  374. selectors = [];
  375. mode;
  376. value;
  377. locale;
  378. showSuperPreBtn = true;
  379. showSuperNextBtn = true;
  380. showPreBtn = true;
  381. showNextBtn = true;
  382. panelChange = new EventEmitter();
  383. valueChange = new EventEmitter();
  384. superPreviousTitle() {
  385. return this.locale.previousYear;
  386. }
  387. previousTitle() {
  388. return this.locale.previousMonth;
  389. }
  390. superNextTitle() {
  391. return this.locale.nextYear;
  392. }
  393. nextTitle() {
  394. return this.locale.nextMonth;
  395. }
  396. superPrevious() {
  397. this.changeValue(this.value.addYears(-1));
  398. }
  399. superNext() {
  400. this.changeValue(this.value.addYears(1));
  401. }
  402. previous() {
  403. this.changeValue(this.value.addMonths(-1));
  404. }
  405. next() {
  406. this.changeValue(this.value.addMonths(1));
  407. }
  408. changeValue(value) {
  409. if (this.value !== value) {
  410. this.value = value;
  411. this.valueChange.emit(this.value);
  412. this.changeMode(this.mode);
  413. this.render();
  414. }
  415. }
  416. changeMode(mode) {
  417. this.panelChange.emit({ mode, date: this.value.nativeDate });
  418. }
  419. render() {
  420. if (this.value) {
  421. this.selectors = this.getSelectors();
  422. }
  423. }
  424. ngOnInit() {
  425. if (!this.value) {
  426. this.value = new CandyDate(); // Show today by default
  427. }
  428. this.selectors = this.getSelectors();
  429. }
  430. ngOnChanges(changes) {
  431. if (changes.value || changes.locale) {
  432. this.render();
  433. }
  434. }
  435. trackBySelector(selector) {
  436. return `${selector.title}-${selector.label}`;
  437. }
  438. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AbstractPanelHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  439. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.2", type: AbstractPanelHeader, isStandalone: true, inputs: { value: "value", locale: "locale", showSuperPreBtn: ["showSuperPreBtn", "showSuperPreBtn", booleanAttribute], showSuperNextBtn: ["showSuperNextBtn", "showSuperNextBtn", booleanAttribute], showPreBtn: ["showPreBtn", "showPreBtn", booleanAttribute], showNextBtn: ["showNextBtn", "showNextBtn", booleanAttribute] }, outputs: { panelChange: "panelChange", valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0 });
  440. }
  441. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AbstractPanelHeader, decorators: [{
  442. type: Directive
  443. }], propDecorators: { value: [{
  444. type: Input
  445. }], locale: [{
  446. type: Input
  447. }], showSuperPreBtn: [{
  448. type: Input,
  449. args: [{ transform: booleanAttribute }]
  450. }], showSuperNextBtn: [{
  451. type: Input,
  452. args: [{ transform: booleanAttribute }]
  453. }], showPreBtn: [{
  454. type: Input,
  455. args: [{ transform: booleanAttribute }]
  456. }], showNextBtn: [{
  457. type: Input,
  458. args: [{ transform: booleanAttribute }]
  459. }], panelChange: [{
  460. type: Output
  461. }], valueChange: [{
  462. type: Output
  463. }] } });
  464. /**
  465. * Use of this source code is governed by an MIT-style license that can be
  466. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  467. */
  468. class DecadeHeaderComponent extends AbstractPanelHeader {
  469. previous() { }
  470. next() { }
  471. mode = 'decade';
  472. get startYear() {
  473. return parseInt(`${this.value.getYear() / 100}`, 10) * 100;
  474. }
  475. get endYear() {
  476. return this.startYear + 99;
  477. }
  478. superPrevious() {
  479. this.changeValue(this.value.addYears(-100));
  480. }
  481. superNext() {
  482. this.changeValue(this.value.addYears(100));
  483. }
  484. getSelectors() {
  485. return [
  486. {
  487. className: `${this.prefixCls}-decade-btn`,
  488. title: '',
  489. onClick: () => { },
  490. label: `${this.startYear}-${this.endYear}`
  491. }
  492. ];
  493. }
  494. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DecadeHeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
  495. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: DecadeHeaderComponent, isStandalone: true, selector: "decade-header", exportAs: ["decadeHeader"], usesInheritance: true, ngImport: i0, template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  496. }
  497. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DecadeHeaderComponent, decorators: [{
  498. type: Component,
  499. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'decade-header', exportAs: 'decadeHeader', template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n" }]
  500. }] });
  501. /**
  502. * Use of this source code is governed by an MIT-style license that can be
  503. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  504. */
  505. class AbstractTable {
  506. headRow = [];
  507. bodyRows = [];
  508. MAX_ROW = 6;
  509. MAX_COL = 7;
  510. prefixCls = 'ant-picker';
  511. value;
  512. locale;
  513. activeDate = new CandyDate();
  514. showWeek = false;
  515. selectedValue = []; // Range ONLY
  516. hoverValue = []; // Range ONLY
  517. disabledDate;
  518. cellRender;
  519. fullCellRender;
  520. canSelectWeek = false;
  521. valueChange = new EventEmitter();
  522. cellHover = new EventEmitter(); // Emitted when hover on a day by mouse enter
  523. render() {
  524. if (this.activeDate) {
  525. this.headRow = this.makeHeadRow();
  526. this.bodyRows = this.makeBodyRows();
  527. }
  528. }
  529. hasRangeValue() {
  530. return this.selectedValue?.length > 0 || this.hoverValue?.length > 0;
  531. }
  532. getClassMap(cell) {
  533. return {
  534. [`ant-picker-cell`]: true,
  535. [`ant-picker-cell-in-view`]: true,
  536. [`ant-picker-cell-selected`]: cell.isSelected,
  537. [`ant-picker-cell-disabled`]: cell.isDisabled,
  538. [`ant-picker-cell-in-range`]: !!cell.isInSelectedRange,
  539. [`ant-picker-cell-range-start`]: !!cell.isSelectedStart,
  540. [`ant-picker-cell-range-end`]: !!cell.isSelectedEnd,
  541. [`ant-picker-cell-range-start-single`]: !!cell.isStartSingle,
  542. [`ant-picker-cell-range-end-single`]: !!cell.isEndSingle,
  543. [`ant-picker-cell-range-hover`]: !!cell.isInHoverRange,
  544. [`ant-picker-cell-range-hover-start`]: !!cell.isHoverStart,
  545. [`ant-picker-cell-range-hover-end`]: !!cell.isHoverEnd,
  546. [`ant-picker-cell-range-hover-edge-start`]: !!cell.isFirstCellInPanel,
  547. [`ant-picker-cell-range-hover-edge-end`]: !!cell.isLastCellInPanel,
  548. [`ant-picker-cell-range-start-near-hover`]: !!cell.isRangeStartNearHover,
  549. [`ant-picker-cell-range-end-near-hover`]: !!cell.isRangeEndNearHover
  550. };
  551. }
  552. ngOnInit() {
  553. this.render();
  554. }
  555. ngOnChanges(changes) {
  556. if (changes.activeDate && !changes.activeDate.currentValue) {
  557. this.activeDate = new CandyDate();
  558. }
  559. if (changes.disabledDate ||
  560. changes.locale ||
  561. changes.showWeek ||
  562. changes.selectWeek ||
  563. this.isDateRealChange(changes.activeDate) ||
  564. this.isDateRealChange(changes.value) ||
  565. this.isDateRealChange(changes.selectedValue) ||
  566. this.isDateRealChange(changes.hoverValue)) {
  567. this.render();
  568. }
  569. }
  570. isDateRealChange(change) {
  571. if (change) {
  572. const previousValue = change.previousValue;
  573. const currentValue = change.currentValue;
  574. if (Array.isArray(currentValue)) {
  575. return (!Array.isArray(previousValue) ||
  576. currentValue.length !== previousValue.length ||
  577. currentValue.some((value, index) => {
  578. const previousCandyDate = previousValue[index];
  579. return previousCandyDate instanceof CandyDate
  580. ? previousCandyDate.isSameDay(value)
  581. : previousCandyDate !== value;
  582. }));
  583. }
  584. else {
  585. return !this.isSameDate(previousValue, currentValue);
  586. }
  587. }
  588. return false;
  589. }
  590. isSameDate(left, right) {
  591. return (!left && !right) || (left && right && right.isSameDay(left));
  592. }
  593. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AbstractTable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  594. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.2.2", type: AbstractTable, isStandalone: true, inputs: { prefixCls: "prefixCls", value: "value", locale: "locale", activeDate: "activeDate", showWeek: ["showWeek", "showWeek", booleanAttribute], selectedValue: "selectedValue", hoverValue: "hoverValue", disabledDate: "disabledDate", cellRender: "cellRender", fullCellRender: "fullCellRender", canSelectWeek: ["canSelectWeek", "canSelectWeek", booleanAttribute] }, outputs: { valueChange: "valueChange", cellHover: "cellHover" }, usesOnChanges: true, ngImport: i0 });
  595. }
  596. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AbstractTable, decorators: [{
  597. type: Directive
  598. }], propDecorators: { prefixCls: [{
  599. type: Input
  600. }], value: [{
  601. type: Input
  602. }], locale: [{
  603. type: Input
  604. }], activeDate: [{
  605. type: Input
  606. }], showWeek: [{
  607. type: Input,
  608. args: [{ transform: booleanAttribute }]
  609. }], selectedValue: [{
  610. type: Input
  611. }], hoverValue: [{
  612. type: Input
  613. }], disabledDate: [{
  614. type: Input
  615. }], cellRender: [{
  616. type: Input
  617. }], fullCellRender: [{
  618. type: Input
  619. }], canSelectWeek: [{
  620. type: Input,
  621. args: [{ transform: booleanAttribute }]
  622. }], valueChange: [{
  623. type: Output
  624. }], cellHover: [{
  625. type: Output
  626. }] } });
  627. /**
  628. * Use of this source code is governed by an MIT-style license that can be
  629. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  630. */
  631. const MAX_ROW = 4;
  632. const MAX_COL = 3;
  633. class DecadeTableComponent extends AbstractTable {
  634. get startYear() {
  635. return parseInt(`${this.activeDate.getYear() / 100}`, 10) * 100;
  636. }
  637. get endYear() {
  638. return this.startYear + 99;
  639. }
  640. makeHeadRow() {
  641. return [];
  642. }
  643. makeBodyRows() {
  644. const decades = [];
  645. const currentYear = this.value && this.value.getYear();
  646. const startYear = this.startYear;
  647. const endYear = this.endYear;
  648. const previousYear = startYear - 10;
  649. let index = 0;
  650. for (let rowIndex = 0; rowIndex < MAX_ROW; rowIndex++) {
  651. const row = {
  652. dateCells: [],
  653. trackByIndex: rowIndex
  654. };
  655. for (let colIndex = 0; colIndex < MAX_COL; colIndex++) {
  656. const start = previousYear + index * 10;
  657. const end = previousYear + index * 10 + 9;
  658. const content = `${start}-${end}`;
  659. const cell = {
  660. trackByIndex: colIndex,
  661. value: this.activeDate.setYear(start).nativeDate,
  662. content,
  663. title: content,
  664. isDisabled: false,
  665. isSelected: currentYear >= start && currentYear <= end,
  666. isLowerThanStart: end < startYear,
  667. isBiggerThanEnd: start > endYear,
  668. classMap: {},
  669. onClick() { },
  670. onMouseEnter() { }
  671. };
  672. cell.classMap = this.getClassMap(cell);
  673. cell.onClick = () => this.chooseDecade(start);
  674. index++;
  675. row.dateCells.push(cell);
  676. }
  677. decades.push(row);
  678. }
  679. return decades;
  680. }
  681. getClassMap(cell) {
  682. return {
  683. [`${this.prefixCls}-cell`]: true,
  684. [`${this.prefixCls}-cell-in-view`]: !cell.isBiggerThanEnd && !cell.isLowerThanStart,
  685. [`${this.prefixCls}-cell-selected`]: cell.isSelected,
  686. [`${this.prefixCls}-cell-disabled`]: cell.isDisabled
  687. };
  688. }
  689. chooseDecade(year) {
  690. this.value = this.activeDate.setYear(year);
  691. this.valueChange.emit(this.value);
  692. }
  693. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DecadeTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
  694. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: DecadeTableComponent, isStandalone: true, selector: "decade-table", exportAs: ["decadeTable"], usesInheritance: true, ngImport: i0, template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  695. }
  696. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DecadeTableComponent, decorators: [{
  697. type: Component,
  698. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'decade-table', exportAs: 'decadeTable', imports: [NzStringTemplateOutletDirective], template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n" }]
  699. }] });
  700. /**
  701. * Use of this source code is governed by an MIT-style license that can be
  702. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  703. */
  704. class YearHeaderComponent extends AbstractPanelHeader {
  705. mode = 'year';
  706. get startYear() {
  707. return parseInt(`${this.value.getYear() / 10}`, 10) * 10;
  708. }
  709. get endYear() {
  710. return this.startYear + 9;
  711. }
  712. superPrevious() {
  713. this.changeValue(this.value.addYears(-10));
  714. }
  715. superNext() {
  716. this.changeValue(this.value.addYears(10));
  717. }
  718. getSelectors() {
  719. return [
  720. {
  721. className: `${this.prefixCls}-year-btn`,
  722. title: '',
  723. onClick: () => {
  724. this.mode = 'decade';
  725. this.changeMode('decade');
  726. },
  727. label: `${this.startYear}-${this.endYear}`
  728. }
  729. ];
  730. }
  731. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: YearHeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
  732. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: YearHeaderComponent, isStandalone: true, selector: "year-header", exportAs: ["yearHeader"], usesInheritance: true, ngImport: i0, template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  733. }
  734. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: YearHeaderComponent, decorators: [{
  735. type: Component,
  736. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'year-header', exportAs: 'yearHeader', template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n" }]
  737. }] });
  738. /**
  739. * Use of this source code is governed by an MIT-style license that can be
  740. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  741. */
  742. class YearTableComponent extends AbstractTable {
  743. dateHelper;
  744. MAX_ROW = 4;
  745. MAX_COL = 3;
  746. constructor(dateHelper) {
  747. super();
  748. this.dateHelper = dateHelper;
  749. }
  750. makeHeadRow() {
  751. return [];
  752. }
  753. makeBodyRows() {
  754. const currentYear = this.activeDate && this.activeDate.getYear();
  755. const startYear = parseInt(`${currentYear / 10}`, 10) * 10;
  756. const endYear = startYear + 9;
  757. const previousYear = startYear - 1;
  758. const years = [];
  759. let yearValue = 0;
  760. for (let rowIndex = 0; rowIndex < this.MAX_ROW; rowIndex++) {
  761. const row = {
  762. dateCells: [],
  763. trackByIndex: rowIndex
  764. };
  765. for (let colIndex = 0; colIndex < this.MAX_COL; colIndex++) {
  766. const yearNum = previousYear + yearValue;
  767. const year = this.activeDate.setYear(yearNum);
  768. const content = this.dateHelper.format(year.nativeDate, 'yyyy');
  769. const isDisabled = this.isDisabledYear(year);
  770. const cell = {
  771. trackByIndex: colIndex,
  772. value: year.nativeDate,
  773. isDisabled,
  774. isSameDecade: yearNum >= startYear && yearNum <= endYear,
  775. isSelected: yearNum === (this.value && this.value.getYear()),
  776. content,
  777. title: content,
  778. classMap: {},
  779. isLastCellInPanel: year.getYear() === endYear,
  780. isFirstCellInPanel: year.getYear() === startYear,
  781. cellRender: valueFunctionProp(this.cellRender, year), // Customized content
  782. fullCellRender: valueFunctionProp(this.fullCellRender, year),
  783. onClick: () => this.chooseYear(cell.value.getFullYear()), // don't use yearValue here,
  784. onMouseEnter: () => this.cellHover.emit(year)
  785. };
  786. this.addCellProperty(cell, year);
  787. row.dateCells.push(cell);
  788. yearValue++;
  789. }
  790. years.push(row);
  791. }
  792. return years;
  793. }
  794. getClassMap(cell) {
  795. return {
  796. ...super.getClassMap(cell),
  797. [`ant-picker-cell-in-view`]: !!cell.isSameDecade
  798. };
  799. }
  800. isDisabledYear(year) {
  801. if (!this.disabledDate) {
  802. return false;
  803. }
  804. const firstOfMonth = year.setMonth(0).setDate(1);
  805. for (let date = firstOfMonth; date.getYear() === year.getYear(); date = date.addDays(1)) {
  806. if (!this.disabledDate(date.nativeDate)) {
  807. return false;
  808. }
  809. }
  810. return true;
  811. }
  812. addCellProperty(cell, year) {
  813. if (this.hasRangeValue()) {
  814. const [startHover, endHover] = this.hoverValue;
  815. const [startSelected, endSelected] = this.selectedValue;
  816. // Selected
  817. if (startSelected?.isSameYear(year)) {
  818. cell.isSelectedStart = true;
  819. cell.isSelected = true;
  820. }
  821. if (endSelected?.isSameYear(year)) {
  822. cell.isSelectedEnd = true;
  823. cell.isSelected = true;
  824. }
  825. if (startHover && endHover) {
  826. cell.isHoverStart = startHover.isSameYear(year);
  827. cell.isHoverEnd = endHover.isSameYear(year);
  828. cell.isInHoverRange = startHover.isBeforeYear(year) && year.isBeforeYear(endHover);
  829. }
  830. cell.isStartSingle = startSelected && !endSelected;
  831. cell.isEndSingle = !startSelected && endSelected;
  832. cell.isInSelectedRange = startSelected?.isBeforeYear(year) && year?.isBeforeYear(endSelected);
  833. cell.isRangeStartNearHover = startSelected && cell.isInHoverRange;
  834. cell.isRangeEndNearHover = endSelected && cell.isInHoverRange;
  835. }
  836. else if (year.isSameYear(this.value)) {
  837. cell.isSelected = true;
  838. }
  839. cell.classMap = this.getClassMap(cell);
  840. }
  841. chooseYear(year) {
  842. this.value = this.activeDate.setYear(year);
  843. this.valueChange.emit(this.value);
  844. this.render();
  845. }
  846. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: YearTableComponent, deps: [{ token: i1.DateHelperService }], target: i0.ɵɵFactoryTarget.Component });
  847. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: YearTableComponent, isStandalone: true, selector: "year-table", exportAs: ["yearTable"], usesInheritance: true, ngImport: i0, template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  848. }
  849. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: YearTableComponent, decorators: [{
  850. type: Component,
  851. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'year-table', exportAs: 'yearTable', imports: [NzStringTemplateOutletDirective], template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n" }]
  852. }], ctorParameters: () => [{ type: i1.DateHelperService }] });
  853. /**
  854. * Use of this source code is governed by an MIT-style license that can be
  855. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  856. */
  857. class QuarterHeaderComponent extends AbstractPanelHeader {
  858. dateHelper;
  859. mode = 'quarter';
  860. constructor(dateHelper) {
  861. super();
  862. this.dateHelper = dateHelper;
  863. }
  864. getSelectors() {
  865. return [
  866. {
  867. className: `${this.prefixCls}-quarter-btn`,
  868. title: this.locale.yearSelect,
  869. onClick: () => {
  870. this.mode = 'year';
  871. this.changeMode('year');
  872. },
  873. label: this.dateHelper.format(this.value.nativeDate, transCompatFormat(this.locale.yearFormat))
  874. }
  875. ];
  876. }
  877. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: QuarterHeaderComponent, deps: [{ token: i1.DateHelperService }], target: i0.ɵɵFactoryTarget.Component });
  878. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: QuarterHeaderComponent, isStandalone: true, selector: "quarter-header", exportAs: ["quarterHeader"], usesInheritance: true, ngImport: i0, template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  879. }
  880. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: QuarterHeaderComponent, decorators: [{
  881. type: Component,
  882. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'quarter-header', exportAs: 'quarterHeader', template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n" }]
  883. }], ctorParameters: () => [{ type: i1.DateHelperService }] });
  884. /**
  885. * Use of this source code is governed by an MIT-style license that can be
  886. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  887. */
  888. class QuarterTableComponent extends AbstractTable {
  889. dateHelper;
  890. MAX_ROW = 1;
  891. MAX_COL = 4;
  892. constructor(dateHelper) {
  893. super();
  894. this.dateHelper = dateHelper;
  895. }
  896. changeValueFromInside(value) {
  897. this.activeDate = value.clone();
  898. this.valueChange.emit(this.activeDate);
  899. if (!this.activeDate.isSameQuarter(this.value)) {
  900. this.render();
  901. }
  902. }
  903. makeHeadRow() {
  904. return [];
  905. }
  906. makeBodyRows() {
  907. const dateCells = [];
  908. const months = [{ dateCells, trackByIndex: 0 }];
  909. let quarterValue = 1;
  910. for (let colIndex = 1; colIndex <= this.MAX_COL; colIndex++, quarterValue++) {
  911. const date = this.activeDate.setQuarter(quarterValue);
  912. const isDisabled = this.isDisabledQuarter(date);
  913. const content = this.dateHelper.format(date.nativeDate, '[Q]Q');
  914. const cell = {
  915. trackByIndex: colIndex,
  916. value: date.nativeDate,
  917. isDisabled,
  918. isSelected: date.isSameQuarter(this.value),
  919. content,
  920. title: content,
  921. classMap: {},
  922. cellRender: valueFunctionProp(this.cellRender, date),
  923. fullCellRender: valueFunctionProp(this.fullCellRender, date),
  924. onClick: () => this.changeValueFromInside(date),
  925. onMouseEnter: () => this.cellHover.emit(date)
  926. };
  927. this.addCellProperty(cell, date);
  928. dateCells.push(cell);
  929. }
  930. return months;
  931. }
  932. isDisabledQuarter(quarter) {
  933. if (!this.disabledDate) {
  934. return false;
  935. }
  936. const firstDayOfQuarter = new CandyDate(startOfQuarter(quarter.nativeDate));
  937. for (let date = firstDayOfQuarter; date.getQuarter() === quarter.getQuarter(); date = date.addMonths(1)) {
  938. if (!this.disabledDate(date.nativeDate)) {
  939. return false;
  940. }
  941. }
  942. return true;
  943. }
  944. addCellProperty(cell, month) {
  945. if (this.hasRangeValue()) {
  946. const [startHover, endHover] = this.hoverValue;
  947. const [startSelected, endSelected] = this.selectedValue;
  948. if (startSelected?.isSameQuarter(month)) {
  949. cell.isSelectedStart = true;
  950. cell.isSelected = true;
  951. }
  952. if (endSelected?.isSameQuarter(month)) {
  953. cell.isSelectedEnd = true;
  954. cell.isSelected = true;
  955. }
  956. if (startHover && endHover) {
  957. cell.isHoverStart = startHover.isSameQuarter(month);
  958. cell.isHoverEnd = endHover.isSameQuarter(month);
  959. cell.isLastCellInPanel = month.getQuarter() === 4;
  960. cell.isFirstCellInPanel = month.getQuarter() === 1;
  961. cell.isInHoverRange = startHover.isBeforeQuarter(month) && month.isBeforeQuarter(endHover);
  962. }
  963. cell.isStartSingle = startSelected && !endSelected;
  964. cell.isEndSingle = !startSelected && endSelected;
  965. cell.isInSelectedRange = startSelected?.isBeforeQuarter(month) && month?.isBeforeQuarter(endSelected);
  966. cell.isRangeStartNearHover = startSelected && cell.isInHoverRange;
  967. cell.isRangeEndNearHover = endSelected && cell.isInHoverRange;
  968. }
  969. else if (month.isSameQuarter(this.value)) {
  970. cell.isSelected = true;
  971. }
  972. cell.classMap = this.getClassMap(cell);
  973. }
  974. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: QuarterTableComponent, deps: [{ token: i1.DateHelperService }], target: i0.ɵɵFactoryTarget.Component });
  975. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: QuarterTableComponent, isStandalone: true, selector: "quarter-table", exportAs: ["quarterTable"], usesInheritance: true, ngImport: i0, template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  976. }
  977. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: QuarterTableComponent, decorators: [{
  978. type: Component,
  979. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'quarter-table', exportAs: 'quarterTable', imports: [NzStringTemplateOutletDirective], template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n" }]
  980. }], ctorParameters: () => [{ type: i1.DateHelperService }] });
  981. /**
  982. * Use of this source code is governed by an MIT-style license that can be
  983. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  984. */
  985. class MonthHeaderComponent extends AbstractPanelHeader {
  986. dateHelper;
  987. mode = 'month';
  988. constructor(dateHelper) {
  989. super();
  990. this.dateHelper = dateHelper;
  991. }
  992. getSelectors() {
  993. return [
  994. {
  995. className: `${this.prefixCls}-month-btn`,
  996. title: this.locale.yearSelect,
  997. onClick: () => {
  998. this.mode = 'year';
  999. this.changeMode('year');
  1000. },
  1001. label: this.dateHelper.format(this.value.nativeDate, transCompatFormat(this.locale.yearFormat))
  1002. }
  1003. ];
  1004. }
  1005. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: MonthHeaderComponent, deps: [{ token: i1.DateHelperService }], target: i0.ɵɵFactoryTarget.Component });
  1006. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: MonthHeaderComponent, isStandalone: true, selector: "month-header", exportAs: ["monthHeader"], usesInheritance: true, ngImport: i0, template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  1007. }
  1008. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: MonthHeaderComponent, decorators: [{
  1009. type: Component,
  1010. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'month-header', exportAs: 'monthHeader', template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n" }]
  1011. }], ctorParameters: () => [{ type: i1.DateHelperService }] });
  1012. /**
  1013. * Use of this source code is governed by an MIT-style license that can be
  1014. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1015. */
  1016. class MonthTableComponent extends AbstractTable {
  1017. MAX_ROW = 4;
  1018. MAX_COL = 3;
  1019. dateHelper = inject(DateHelperService);
  1020. makeHeadRow() {
  1021. return [];
  1022. }
  1023. makeBodyRows() {
  1024. const months = [];
  1025. let monthValue = 0;
  1026. for (let rowIndex = 0; rowIndex < this.MAX_ROW; rowIndex++) {
  1027. const row = {
  1028. dateCells: [],
  1029. trackByIndex: rowIndex
  1030. };
  1031. for (let colIndex = 0; colIndex < this.MAX_COL; colIndex++) {
  1032. const month = this.activeDate.setMonth(monthValue);
  1033. const isDisabled = this.isDisabledMonth(month);
  1034. const content = this.dateHelper.format(month.nativeDate, 'MMM');
  1035. const cell = {
  1036. trackByIndex: colIndex,
  1037. value: month.nativeDate,
  1038. isDisabled,
  1039. isSelected: month.isSameMonth(this.value),
  1040. content,
  1041. title: content,
  1042. classMap: {},
  1043. cellRender: valueFunctionProp(this.cellRender, month), // Customized content
  1044. fullCellRender: valueFunctionProp(this.fullCellRender, month),
  1045. onClick: () => this.chooseMonth(cell.value.getMonth()), // don't use monthValue here,
  1046. onMouseEnter: () => this.cellHover.emit(month)
  1047. };
  1048. this.addCellProperty(cell, month);
  1049. row.dateCells.push(cell);
  1050. monthValue++;
  1051. }
  1052. months.push(row);
  1053. }
  1054. return months;
  1055. }
  1056. isDisabledMonth(month) {
  1057. if (!this.disabledDate) {
  1058. return false;
  1059. }
  1060. const firstOfMonth = month.setDate(1);
  1061. for (let date = firstOfMonth; date.getMonth() === month.getMonth(); date = date.addDays(1)) {
  1062. if (!this.disabledDate(date.nativeDate)) {
  1063. return false;
  1064. }
  1065. }
  1066. return true;
  1067. }
  1068. addCellProperty(cell, month) {
  1069. if (this.hasRangeValue()) {
  1070. const [startHover, endHover] = this.hoverValue;
  1071. const [startSelected, endSelected] = this.selectedValue;
  1072. // Selected
  1073. if (startSelected?.isSameMonth(month)) {
  1074. cell.isSelectedStart = true;
  1075. cell.isSelected = true;
  1076. }
  1077. if (endSelected?.isSameMonth(month)) {
  1078. cell.isSelectedEnd = true;
  1079. cell.isSelected = true;
  1080. }
  1081. if (startHover && endHover) {
  1082. cell.isHoverStart = startHover.isSameMonth(month);
  1083. cell.isHoverEnd = endHover.isSameMonth(month);
  1084. cell.isLastCellInPanel = month.getMonth() === 11;
  1085. cell.isFirstCellInPanel = month.getMonth() === 0;
  1086. cell.isInHoverRange = startHover.isBeforeMonth(month) && month.isBeforeMonth(endHover);
  1087. }
  1088. cell.isStartSingle = startSelected && !endSelected;
  1089. cell.isEndSingle = !startSelected && endSelected;
  1090. cell.isInSelectedRange = startSelected?.isBeforeMonth(month) && month?.isBeforeMonth(endSelected);
  1091. cell.isRangeStartNearHover = startSelected && cell.isInHoverRange;
  1092. cell.isRangeEndNearHover = endSelected && cell.isInHoverRange;
  1093. }
  1094. else if (month.isSameMonth(this.value)) {
  1095. cell.isSelected = true;
  1096. }
  1097. cell.classMap = this.getClassMap(cell);
  1098. }
  1099. chooseMonth(month) {
  1100. this.value = this.activeDate.setMonth(month);
  1101. this.valueChange.emit(this.value);
  1102. }
  1103. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: MonthTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
  1104. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: MonthTableComponent, isStandalone: true, selector: "month-table", exportAs: ["monthTable"], usesInheritance: true, ngImport: i0, template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  1105. }
  1106. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: MonthTableComponent, decorators: [{
  1107. type: Component,
  1108. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'month-table', exportAs: 'monthTable', imports: [NzStringTemplateOutletDirective], template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n" }]
  1109. }] });
  1110. /**
  1111. * Use of this source code is governed by an MIT-style license that can be
  1112. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1113. */
  1114. class DateHeaderComponent extends AbstractPanelHeader {
  1115. dateHelper;
  1116. mode = 'date';
  1117. constructor(dateHelper) {
  1118. super();
  1119. this.dateHelper = dateHelper;
  1120. }
  1121. getSelectors() {
  1122. return [
  1123. {
  1124. className: `${this.prefixCls}-year-btn`,
  1125. title: this.locale.yearSelect,
  1126. onClick: () => {
  1127. this.mode = 'year';
  1128. this.changeMode('year');
  1129. },
  1130. label: this.dateHelper.format(this.value.nativeDate, transCompatFormat(this.locale.yearFormat))
  1131. },
  1132. {
  1133. className: `${this.prefixCls}-month-btn`,
  1134. title: this.locale.monthSelect,
  1135. onClick: () => {
  1136. this.mode = 'month';
  1137. this.changeMode('month');
  1138. },
  1139. label: this.dateHelper.format(this.value.nativeDate, this.locale.monthFormat || 'MMM')
  1140. }
  1141. ];
  1142. }
  1143. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateHeaderComponent, deps: [{ token: i1.DateHelperService }], target: i0.ɵɵFactoryTarget.Component });
  1144. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: DateHeaderComponent, isStandalone: true, selector: "date-header", exportAs: ["dateHeader"], usesInheritance: true, ngImport: i0, template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  1145. }
  1146. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateHeaderComponent, decorators: [{
  1147. type: Component,
  1148. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'date-header', exportAs: 'dateHeader', template: "<div class=\"{{ prefixCls }}\">\n <button\n [style.visibility]=\"showSuperPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-prev-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superPreviousTitle() }}\"\n (click)=\"superPrevious()\"\n >\n <span class=\"ant-picker-super-prev-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showPreBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-prev-btn\"\n role=\"button\"\n type=\"button\"\n title=\"{{ previousTitle() }}\"\n tabindex=\"-1\"\n (click)=\"previous()\"\n >\n <span class=\"ant-picker-prev-icon\"></span>\n </button>\n\n <div class=\"{{ prefixCls }}-view\">\n @for (selector of selectors; track trackBySelector(selector)) {\n <button\n class=\"{{ selector.className }}\"\n role=\"button\"\n type=\"button\"\n title=\"{{ selector.title || null }}\"\n (click)=\"selector.onClick()\"\n >\n {{ selector.label }}\n </button>\n }\n </div>\n <button\n [style.visibility]=\"showNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ nextTitle() }}\"\n (click)=\"next()\"\n >\n <span class=\"ant-picker-next-icon\"></span>\n </button>\n <button\n [style.visibility]=\"showSuperNextBtn ? 'visible' : 'hidden'\"\n class=\"{{ prefixCls }}-super-next-btn\"\n role=\"button\"\n type=\"button\"\n tabindex=\"-1\"\n title=\"{{ superNextTitle() }}\"\n (click)=\"superNext()\"\n >\n <span class=\"ant-picker-super-next-icon\"></span>\n </button>\n</div>\n" }]
  1149. }], ctorParameters: () => [{ type: i1.DateHelperService }] });
  1150. /**
  1151. * Use of this source code is governed by an MIT-style license that can be
  1152. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1153. */
  1154. class DateTableComponent extends AbstractTable {
  1155. format;
  1156. i18n = inject(NzI18nService);
  1157. dateHelper = inject(DateHelperService);
  1158. changeValueFromInside(value) {
  1159. // Only change date not change time
  1160. this.activeDate = this.activeDate.setYear(value.getYear()).setMonth(value.getMonth()).setDate(value.getDate());
  1161. this.valueChange.emit(this.activeDate);
  1162. if (!this.activeDate.isSameMonth(this.value)) {
  1163. this.render();
  1164. }
  1165. }
  1166. makeHeadRow() {
  1167. const weekDays = [];
  1168. const start = this.activeDate.calendarStart({ weekStartsOn: this.dateHelper.getFirstDayOfWeek() });
  1169. for (let colIndex = 0; colIndex < this.MAX_COL; colIndex++) {
  1170. const day = start.addDays(colIndex);
  1171. weekDays.push({
  1172. trackByIndex: null,
  1173. value: day.nativeDate,
  1174. title: this.dateHelper.format(day.nativeDate, 'E'), // eg. Tue
  1175. content: this.dateHelper.format(day.nativeDate, this.getVeryShortWeekFormat()), // eg. Tu,
  1176. isSelected: false,
  1177. isDisabled: false,
  1178. onClick() { },
  1179. onMouseEnter() { }
  1180. });
  1181. }
  1182. return weekDays;
  1183. }
  1184. getVeryShortWeekFormat() {
  1185. return this.i18n.getLocaleId().toLowerCase().indexOf('zh') === 0 ? 'EEEEE' : 'EEEEEE'; // Use extreme short for chinese
  1186. }
  1187. makeBodyRows() {
  1188. const weekRows = [];
  1189. const firstDayOfMonth = this.activeDate.calendarStart({ weekStartsOn: this.dateHelper.getFirstDayOfWeek() });
  1190. for (let week = 0; week < this.MAX_ROW; week++) {
  1191. const weekStart = firstDayOfMonth.addDays(week * 7);
  1192. const row = {
  1193. isActive: false,
  1194. dateCells: [],
  1195. trackByIndex: week
  1196. };
  1197. for (let day = 0; day < 7; day++) {
  1198. const date = weekStart.addDays(day);
  1199. const dateFormat = transCompatFormat(this.format ?? this.i18n.getLocaleData('DatePicker.lang.dateFormat', 'YYYY-MM-DD'));
  1200. const title = this.dateHelper.format(date.nativeDate, dateFormat);
  1201. const label = this.dateHelper.format(date.nativeDate, 'dd');
  1202. const cell = {
  1203. trackByIndex: day,
  1204. value: date.nativeDate,
  1205. label,
  1206. isSelected: false,
  1207. isDisabled: false,
  1208. isToday: false,
  1209. title,
  1210. cellRender: valueFunctionProp(this.cellRender, date), // Customized content
  1211. fullCellRender: valueFunctionProp(this.fullCellRender, date),
  1212. content: `${date.getDate()}`,
  1213. onClick: () => this.changeValueFromInside(date),
  1214. onMouseEnter: () => this.cellHover.emit(date)
  1215. };
  1216. this.addCellProperty(cell, date);
  1217. if (this.showWeek && !row.weekNum) {
  1218. row.weekNum = this.dateHelper.getISOWeek(date.nativeDate);
  1219. }
  1220. if (date.isSameDay(this.value)) {
  1221. row.isActive = date.isSameDay(this.value);
  1222. }
  1223. row.dateCells.push(cell);
  1224. }
  1225. row.classMap = {
  1226. [`ant-picker-week-panel-row`]: this.canSelectWeek,
  1227. [`ant-picker-week-panel-row-selected`]: this.canSelectWeek && row.isActive
  1228. };
  1229. weekRows.push(row);
  1230. }
  1231. return weekRows;
  1232. }
  1233. addCellProperty(cell, date) {
  1234. if (this.hasRangeValue() && !this.canSelectWeek) {
  1235. const [startHover, endHover] = this.hoverValue;
  1236. const [startSelected, endSelected] = this.selectedValue;
  1237. // Selected
  1238. if (startSelected?.isSameDay(date)) {
  1239. cell.isSelectedStart = true;
  1240. cell.isSelected = true;
  1241. }
  1242. if (endSelected?.isSameDay(date)) {
  1243. cell.isSelectedEnd = true;
  1244. cell.isSelected = true;
  1245. }
  1246. if (startHover && endHover) {
  1247. cell.isHoverStart = startHover.isSameDay(date);
  1248. cell.isHoverEnd = endHover.isSameDay(date);
  1249. cell.isLastCellInPanel = date.isLastDayOfMonth();
  1250. cell.isFirstCellInPanel = date.isFirstDayOfMonth();
  1251. cell.isInHoverRange = startHover.isBeforeDay(date) && date.isBeforeDay(endHover);
  1252. }
  1253. cell.isStartSingle = startSelected && !endSelected;
  1254. cell.isEndSingle = !startSelected && endSelected;
  1255. cell.isInSelectedRange = startSelected?.isBeforeDay(date) && date.isBeforeDay(endSelected);
  1256. cell.isRangeStartNearHover = startSelected && cell.isInHoverRange;
  1257. cell.isRangeEndNearHover = endSelected && cell.isInHoverRange;
  1258. }
  1259. cell.isToday = date.isToday();
  1260. cell.isSelected = date.isSameDay(this.value);
  1261. cell.isDisabled = !!this.disabledDate?.(date.nativeDate);
  1262. cell.classMap = this.getClassMap(cell);
  1263. }
  1264. getClassMap(cell) {
  1265. const date = new CandyDate(cell.value);
  1266. return {
  1267. ...super.getClassMap(cell),
  1268. [`ant-picker-cell-today`]: !!cell.isToday,
  1269. [`ant-picker-cell-in-view`]: date.isSameMonth(this.activeDate)
  1270. };
  1271. }
  1272. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
  1273. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: DateTableComponent, isStandalone: true, selector: "date-table", inputs: { format: "format" }, exportAs: ["dateTable"], usesInheritance: true, ngImport: i0, template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  1274. }
  1275. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateTableComponent, decorators: [{
  1276. type: Component,
  1277. args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, selector: 'date-table', exportAs: 'dateTable', imports: [NzStringTemplateOutletDirective], template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n @if (headRow && headRow.length > 0) {\n <thead>\n <tr role=\"row\">\n @if (showWeek) {\n <th role=\"columnheader\"></th>\n }\n @for (cell of headRow; track $index) {\n <th role=\"columnheader\" [title]=\"cell.title\"> {{ cell.content }}</th>\n }\n </tr>\n </thead>\n }\n\n <tbody>\n @for (row of bodyRows; track row.trackByIndex) {\n <tr [class]=\"row.classMap!\" role=\"row\">\n @if (row.weekNum) {\n <td role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\"> {{ row.weekNum }}</td>\n }\n @for (cell of row.dateCells; track cell.trackByIndex) {\n <td\n [title]=\"cell.title\"\n role=\"gridcell\"\n [class]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n @switch (prefixCls) {\n @case ('ant-picker') {\n @if (cell.cellRender) {\n <ng-template\n [nzStringTemplateOutlet]=\"cell.cellRender\"\n [nzStringTemplateOutletContext]=\"{ $implicit: cell.value }\"\n >\n {{ cell.cellRender }}\n </ng-template>\n } @else {\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n }\n }\n @case ('ant-picker-calendar') {\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n @if (cell.fullCellRender) {\n <ng-container *nzStringTemplateOutlet=\"cell.fullCellRender; context: { $implicit: cell.value }\">\n {{ cell.fullCellRender }}\n </ng-container>\n } @else {\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container *nzStringTemplateOutlet=\"cell.cellRender; context: { $implicit: cell.value }\">\n {{ cell.cellRender }}\n </ng-container>\n </div>\n }\n </div>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n</table>\n" }]
  1278. }], propDecorators: { format: [{
  1279. type: Input
  1280. }] } });
  1281. /**
  1282. * Use of this source code is governed by an MIT-style license that can be
  1283. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1284. */
  1285. /**
  1286. * A collection module of standard output for all lib components
  1287. */
  1288. class LibPackerModule {
  1289. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LibPackerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
  1290. static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: LibPackerModule, imports: [DateHeaderComponent,
  1291. DateTableComponent,
  1292. DecadeHeaderComponent,
  1293. DecadeTableComponent,
  1294. MonthHeaderComponent,
  1295. MonthTableComponent,
  1296. YearHeaderComponent,
  1297. YearTableComponent,
  1298. QuarterHeaderComponent,
  1299. QuarterTableComponent], exports: [DateHeaderComponent,
  1300. DateTableComponent,
  1301. DecadeHeaderComponent,
  1302. DecadeTableComponent,
  1303. MonthHeaderComponent,
  1304. MonthTableComponent,
  1305. YearHeaderComponent,
  1306. YearTableComponent,
  1307. QuarterHeaderComponent,
  1308. QuarterTableComponent] });
  1309. static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LibPackerModule });
  1310. }
  1311. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LibPackerModule, decorators: [{
  1312. type: NgModule,
  1313. args: [{
  1314. imports: [
  1315. DateHeaderComponent,
  1316. DateTableComponent,
  1317. DecadeHeaderComponent,
  1318. DecadeTableComponent,
  1319. MonthHeaderComponent,
  1320. MonthTableComponent,
  1321. YearHeaderComponent,
  1322. YearTableComponent,
  1323. QuarterHeaderComponent,
  1324. QuarterTableComponent
  1325. ],
  1326. exports: [
  1327. DateHeaderComponent,
  1328. DateTableComponent,
  1329. DecadeHeaderComponent,
  1330. DecadeTableComponent,
  1331. MonthHeaderComponent,
  1332. MonthTableComponent,
  1333. YearHeaderComponent,
  1334. YearTableComponent,
  1335. QuarterHeaderComponent,
  1336. QuarterTableComponent
  1337. ]
  1338. }]
  1339. }] });
  1340. /**
  1341. * Use of this source code is governed by an MIT-style license that can be
  1342. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1343. */
  1344. /**
  1345. * Use of this source code is governed by an MIT-style license that can be
  1346. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1347. */
  1348. /**
  1349. * Use of this source code is governed by an MIT-style license that can be
  1350. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  1351. */
  1352. class InnerPopupComponent {
  1353. activeDate;
  1354. endPanelMode;
  1355. panelMode;
  1356. showWeek;
  1357. locale;
  1358. showTimePicker;
  1359. timeOptions;
  1360. disabledDate;
  1361. dateRender;
  1362. selectedValue; // Range ONLY
  1363. hoverValue; // Range ONLY
  1364. value;
  1365. partType;
  1366. format;
  1367. panelChange = new EventEmitter();
  1368. // TODO: name is not proper
  1369. headerChange = new EventEmitter(); // Emitted when user changed the header's value
  1370. selectDate = new EventEmitter(); // Emitted when the date is selected by click the date panel
  1371. selectTime = new EventEmitter();
  1372. cellHover = new EventEmitter(); // Emitted when hover on a day by mouse enter
  1373. prefixCls = PREFIX_CLASS;
  1374. /**
  1375. * Hide "next" arrow in left panel,
  1376. * hide "prev" arrow in right panel
  1377. *
  1378. * @param direction
  1379. * @param panelMode
  1380. */
  1381. enablePrevNext(direction, panelMode) {
  1382. return !(!this.showTimePicker &&
  1383. panelMode === this.endPanelMode &&
  1384. ((this.partType === 'left' && direction === 'next') || (this.partType === 'right' && direction === 'prev')));
  1385. }
  1386. onSelectTime(date) {
  1387. this.selectTime.emit(new CandyDate(date));
  1388. }
  1389. // The value real changed to outside
  1390. onSelectDate(date) {
  1391. const value = date instanceof CandyDate ? date : new CandyDate(date);
  1392. const timeValue = this.timeOptions && this.timeOptions.nzDefaultOpenValue;
  1393. // Display timeValue when value is null
  1394. if (!this.value && timeValue) {
  1395. value.setHms(timeValue.getHours(), timeValue.getMinutes(), timeValue.getSeconds());
  1396. }
  1397. this.selectDate.emit(value);
  1398. }
  1399. onChooseMonth(value) {
  1400. this.activeDate = this.activeDate.setMonth(value.getMonth());
  1401. if (this.endPanelMode === 'month') {
  1402. this.value = value;
  1403. this.selectDate.emit(value);
  1404. }
  1405. else {
  1406. this.headerChange.emit(value);
  1407. this.panelChange.emit({ mode: this.endPanelMode, date: value.nativeDate });
  1408. }
  1409. }
  1410. onChooseQuarter(value) {
  1411. this.activeDate = this.activeDate.setQuarter(value.getQuarter());
  1412. this.value = value;
  1413. this.selectDate.emit(value);
  1414. }
  1415. onChooseYear(value) {
  1416. this.activeDate = this.activeDate.setYear(value.getYear());
  1417. if (this.endPanelMode === 'year') {
  1418. this.value = value;
  1419. this.selectDate.emit(value);
  1420. }
  1421. else {
  1422. this.headerChange.emit(value);
  1423. this.panelChange.emit({ mode: this.endPanelMode, date: value.nativeDate });
  1424. }
  1425. }
  1426. onChooseDecade(value) {
  1427. this.activeDate = this.activeDate.setYear(value.getYear());
  1428. if (this.endPanelMode === 'decade') {
  1429. this.value = value;
  1430. this.selectDate.emit(value);
  1431. }
  1432. else {
  1433. this.headerChange.emit(value);
  1434. this.panelChange.emit({ mode: 'year', date: value.nativeDate });
  1435. }
  1436. }
  1437. ngOnChanges(changes) {
  1438. if (changes.activeDate && !changes.activeDate.currentValue) {
  1439. this.activeDate = new CandyDate();
  1440. }
  1441. // New Antd vesion has merged 'date' ant 'time' to one panel,
  1442. // So there is not 'time' panel
  1443. if (changes.panelMode && changes.panelMode.currentValue === 'time') {
  1444. this.panelMode = 'date';
  1445. }
  1446. }
  1447. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: InnerPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
  1448. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: InnerPopupComponent, isStandalone: true, selector: "inner-popup", inputs: { activeDate: "activeDate", endPanelMode: "endPanelMode", panelMode: "panelMode", showWeek: ["showWeek", "showWeek", booleanAttribute], locale: "locale", showTimePicker: ["showTimePicker", "showTimePicker", booleanAttribute], timeOptions: "timeOptions", disabledDate: "disabledDate", dateRender: "dateRender", selectedValue: "selectedValue", hoverValue: "hoverValue", value: "value", partType: "partType", format: "format" }, outputs: { panelChange: "panelChange", headerChange: "headerChange", selectDate: "selectDate", selectTime: "selectTime", cellHover: "cellHover" }, exportAs: ["innerPopup"], usesOnChanges: true, ngImport: i0, template: `
  1449. <div [class.ant-picker-datetime-panel]="showTimePicker">
  1450. <div class="{{ prefixCls }}-{{ panelMode }}-panel">
  1451. @switch (panelMode) {
  1452. @case ('decade') {
  1453. <decade-header
  1454. [(value)]="activeDate"
  1455. [locale]="locale"
  1456. [showSuperPreBtn]="enablePrevNext('prev', 'decade')"
  1457. [showSuperNextBtn]="enablePrevNext('next', 'decade')"
  1458. [showNextBtn]="false"
  1459. [showPreBtn]="false"
  1460. (panelChange)="panelChange.emit($event)"
  1461. (valueChange)="headerChange.emit($event)"
  1462. />
  1463. <div class="{{ prefixCls }}-body">
  1464. <decade-table
  1465. [activeDate]="activeDate"
  1466. [value]="value"
  1467. [locale]="locale"
  1468. (valueChange)="onChooseDecade($event)"
  1469. [disabledDate]="disabledDate"
  1470. />
  1471. </div>
  1472. }
  1473. @case ('year') {
  1474. <year-header
  1475. [(value)]="activeDate"
  1476. [locale]="locale"
  1477. [showSuperPreBtn]="enablePrevNext('prev', 'year')"
  1478. [showSuperNextBtn]="enablePrevNext('next', 'year')"
  1479. [showNextBtn]="false"
  1480. [showPreBtn]="false"
  1481. (panelChange)="panelChange.emit($event)"
  1482. (valueChange)="headerChange.emit($event)"
  1483. />
  1484. <div class="{{ prefixCls }}-body">
  1485. <year-table
  1486. [activeDate]="activeDate"
  1487. [value]="value"
  1488. [locale]="locale"
  1489. [disabledDate]="disabledDate"
  1490. [selectedValue]="selectedValue"
  1491. [hoverValue]="hoverValue"
  1492. (valueChange)="onChooseYear($event)"
  1493. (cellHover)="cellHover.emit($event)"
  1494. />
  1495. </div>
  1496. }
  1497. @case ('month') {
  1498. <month-header
  1499. [(value)]="activeDate"
  1500. [locale]="locale"
  1501. [showSuperPreBtn]="enablePrevNext('prev', 'month')"
  1502. [showSuperNextBtn]="enablePrevNext('next', 'month')"
  1503. [showNextBtn]="false"
  1504. [showPreBtn]="false"
  1505. (panelChange)="panelChange.emit($event)"
  1506. (valueChange)="headerChange.emit($event)"
  1507. />
  1508. <div class="{{ prefixCls }}-body">
  1509. <month-table
  1510. [value]="value"
  1511. [activeDate]="activeDate"
  1512. [locale]="locale"
  1513. [disabledDate]="disabledDate"
  1514. [selectedValue]="selectedValue"
  1515. [hoverValue]="hoverValue"
  1516. (valueChange)="onChooseMonth($event)"
  1517. (cellHover)="cellHover.emit($event)"
  1518. />
  1519. </div>
  1520. }
  1521. @case ('quarter') {
  1522. <quarter-header
  1523. [(value)]="activeDate"
  1524. [locale]="locale"
  1525. [showSuperPreBtn]="enablePrevNext('prev', 'month')"
  1526. [showSuperNextBtn]="enablePrevNext('next', 'month')"
  1527. [showNextBtn]="false"
  1528. [showPreBtn]="false"
  1529. (panelChange)="panelChange.emit($event)"
  1530. (valueChange)="headerChange.emit($event)"
  1531. />
  1532. <div class="{{ prefixCls }}-body">
  1533. <quarter-table
  1534. [value]="value"
  1535. [activeDate]="activeDate"
  1536. [locale]="locale"
  1537. [disabledDate]="disabledDate"
  1538. [selectedValue]="selectedValue"
  1539. [hoverValue]="hoverValue"
  1540. (valueChange)="onChooseQuarter($event)"
  1541. (cellHover)="cellHover.emit($event)"
  1542. [cellRender]="dateRender"
  1543. />
  1544. </div>
  1545. }
  1546. @default {
  1547. <date-header
  1548. [(value)]="activeDate"
  1549. [locale]="locale"
  1550. [showSuperPreBtn]="panelMode === 'week' ? enablePrevNext('prev', 'week') : enablePrevNext('prev', 'date')"
  1551. [showSuperNextBtn]="
  1552. panelMode === 'week' ? enablePrevNext('next', 'week') : enablePrevNext('next', 'date')
  1553. "
  1554. [showPreBtn]="panelMode === 'week' ? enablePrevNext('prev', 'week') : enablePrevNext('prev', 'date')"
  1555. [showNextBtn]="panelMode === 'week' ? enablePrevNext('next', 'week') : enablePrevNext('next', 'date')"
  1556. (panelChange)="panelChange.emit($event)"
  1557. (valueChange)="headerChange.emit($event)"
  1558. />
  1559. <div class="{{ prefixCls }}-body">
  1560. <date-table
  1561. [locale]="locale"
  1562. [showWeek]="showWeek"
  1563. [value]="value"
  1564. [activeDate]="activeDate"
  1565. [disabledDate]="disabledDate"
  1566. [cellRender]="dateRender"
  1567. [selectedValue]="selectedValue"
  1568. [hoverValue]="hoverValue"
  1569. [canSelectWeek]="panelMode === 'week'"
  1570. [format]="format"
  1571. (valueChange)="onSelectDate($event)"
  1572. (cellHover)="cellHover.emit($event)"
  1573. />
  1574. </div>
  1575. }
  1576. }
  1577. </div>
  1578. @if (showTimePicker && timeOptions) {
  1579. <nz-time-picker-panel
  1580. [nzInDatePicker]="true"
  1581. [ngModel]="value?.nativeDate"
  1582. (ngModelChange)="onSelectTime($event)"
  1583. [format]="$any(timeOptions.nzFormat)"
  1584. [nzHourStep]="$any(timeOptions.nzHourStep)"
  1585. [nzMinuteStep]="$any(timeOptions.nzMinuteStep)"
  1586. [nzSecondStep]="$any(timeOptions.nzSecondStep)"
  1587. [nzDisabledHours]="$any(timeOptions.nzDisabledHours)"
  1588. [nzDisabledMinutes]="$any(timeOptions.nzDisabledMinutes)"
  1589. [nzDisabledSeconds]="$any(timeOptions.nzDisabledSeconds)"
  1590. [nzHideDisabledOptions]="!!timeOptions.nzHideDisabledOptions"
  1591. [nzDefaultOpenValue]="$any(timeOptions.nzDefaultOpenValue)"
  1592. [nzUse12Hours]="!!timeOptions.nzUse12Hours"
  1593. [nzAddOn]="$any(timeOptions.nzAddOn)"
  1594. />
  1595. }
  1596. </div>
  1597. `, isInline: true, dependencies: [{ kind: "ngmodule", type: LibPackerModule }, { kind: "component", type: DateHeaderComponent, selector: "date-header", exportAs: ["dateHeader"] }, { kind: "component", type: DateTableComponent, selector: "date-table", inputs: ["format"], exportAs: ["dateTable"] }, { kind: "component", type: DecadeHeaderComponent, selector: "decade-header", exportAs: ["decadeHeader"] }, { kind: "component", type: DecadeTableComponent, selector: "decade-table", exportAs: ["decadeTable"] }, { kind: "component", type: MonthHeaderComponent, selector: "month-header", exportAs: ["monthHeader"] }, { kind: "component", type: MonthTableComponent, selector: "month-table", exportAs: ["monthTable"] }, { kind: "component", type: YearHeaderComponent, selector: "year-header", exportAs: ["yearHeader"] }, { kind: "component", type: YearTableComponent, selector: "year-table", exportAs: ["yearTable"] }, { kind: "component", type: QuarterHeaderComponent, selector: "quarter-header", exportAs: ["quarterHeader"] }, { kind: "component", type: QuarterTableComponent, selector: "quarter-table", exportAs: ["quarterTable"] }, { kind: "ngmodule", type: NzTimePickerModule }, { kind: "component", type: i11.NzTimePickerPanelComponent, selector: "nz-time-picker-panel", inputs: ["nzInDatePicker", "nzAddOn", "nzHideDisabledOptions", "nzClearText", "nzNowText", "nzOkText", "nzPlaceHolder", "nzUse12Hours", "nzDefaultOpenValue", "nzAllowEmpty", "nzDisabledHours", "nzDisabledMinutes", "nzDisabledSeconds", "format", "nzHourStep", "nzMinuteStep", "nzSecondStep"], outputs: ["closePanel"], exportAs: ["nzTimePickerPanel"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  1598. }
  1599. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: InnerPopupComponent, decorators: [{
  1600. type: Component,
  1601. args: [{
  1602. // eslint-disable-next-line @angular-eslint/component-selector
  1603. selector: 'inner-popup',
  1604. exportAs: 'innerPopup',
  1605. encapsulation: ViewEncapsulation.None,
  1606. changeDetection: ChangeDetectionStrategy.OnPush,
  1607. template: `
  1608. <div [class.ant-picker-datetime-panel]="showTimePicker">
  1609. <div class="{{ prefixCls }}-{{ panelMode }}-panel">
  1610. @switch (panelMode) {
  1611. @case ('decade') {
  1612. <decade-header
  1613. [(value)]="activeDate"
  1614. [locale]="locale"
  1615. [showSuperPreBtn]="enablePrevNext('prev', 'decade')"
  1616. [showSuperNextBtn]="enablePrevNext('next', 'decade')"
  1617. [showNextBtn]="false"
  1618. [showPreBtn]="false"
  1619. (panelChange)="panelChange.emit($event)"
  1620. (valueChange)="headerChange.emit($event)"
  1621. />
  1622. <div class="{{ prefixCls }}-body">
  1623. <decade-table
  1624. [activeDate]="activeDate"
  1625. [value]="value"
  1626. [locale]="locale"
  1627. (valueChange)="onChooseDecade($event)"
  1628. [disabledDate]="disabledDate"
  1629. />
  1630. </div>
  1631. }
  1632. @case ('year') {
  1633. <year-header
  1634. [(value)]="activeDate"
  1635. [locale]="locale"
  1636. [showSuperPreBtn]="enablePrevNext('prev', 'year')"
  1637. [showSuperNextBtn]="enablePrevNext('next', 'year')"
  1638. [showNextBtn]="false"
  1639. [showPreBtn]="false"
  1640. (panelChange)="panelChange.emit($event)"
  1641. (valueChange)="headerChange.emit($event)"
  1642. />
  1643. <div class="{{ prefixCls }}-body">
  1644. <year-table
  1645. [activeDate]="activeDate"
  1646. [value]="value"
  1647. [locale]="locale"
  1648. [disabledDate]="disabledDate"
  1649. [selectedValue]="selectedValue"
  1650. [hoverValue]="hoverValue"
  1651. (valueChange)="onChooseYear($event)"
  1652. (cellHover)="cellHover.emit($event)"
  1653. />
  1654. </div>
  1655. }
  1656. @case ('month') {
  1657. <month-header
  1658. [(value)]="activeDate"
  1659. [locale]="locale"
  1660. [showSuperPreBtn]="enablePrevNext('prev', 'month')"
  1661. [showSuperNextBtn]="enablePrevNext('next', 'month')"
  1662. [showNextBtn]="false"
  1663. [showPreBtn]="false"
  1664. (panelChange)="panelChange.emit($event)"
  1665. (valueChange)="headerChange.emit($event)"
  1666. />
  1667. <div class="{{ prefixCls }}-body">
  1668. <month-table
  1669. [value]="value"
  1670. [activeDate]="activeDate"
  1671. [locale]="locale"
  1672. [disabledDate]="disabledDate"
  1673. [selectedValue]="selectedValue"
  1674. [hoverValue]="hoverValue"
  1675. (valueChange)="onChooseMonth($event)"
  1676. (cellHover)="cellHover.emit($event)"
  1677. />
  1678. </div>
  1679. }
  1680. @case ('quarter') {
  1681. <quarter-header
  1682. [(value)]="activeDate"
  1683. [locale]="locale"
  1684. [showSuperPreBtn]="enablePrevNext('prev', 'month')"
  1685. [showSuperNextBtn]="enablePrevNext('next', 'month')"
  1686. [showNextBtn]="false"
  1687. [showPreBtn]="false"
  1688. (panelChange)="panelChange.emit($event)"
  1689. (valueChange)="headerChange.emit($event)"
  1690. />
  1691. <div class="{{ prefixCls }}-body">
  1692. <quarter-table
  1693. [value]="value"
  1694. [activeDate]="activeDate"
  1695. [locale]="locale"
  1696. [disabledDate]="disabledDate"
  1697. [selectedValue]="selectedValue"
  1698. [hoverValue]="hoverValue"
  1699. (valueChange)="onChooseQuarter($event)"
  1700. (cellHover)="cellHover.emit($event)"
  1701. [cellRender]="dateRender"
  1702. />
  1703. </div>
  1704. }
  1705. @default {
  1706. <date-header
  1707. [(value)]="activeDate"
  1708. [locale]="locale"
  1709. [showSuperPreBtn]="panelMode === 'week' ? enablePrevNext('prev', 'week') : enablePrevNext('prev', 'date')"
  1710. [showSuperNextBtn]="
  1711. panelMode === 'week' ? enablePrevNext('next', 'week') : enablePrevNext('next', 'date')
  1712. "
  1713. [showPreBtn]="panelMode === 'week' ? enablePrevNext('prev', 'week') : enablePrevNext('prev', 'date')"
  1714. [showNextBtn]="panelMode === 'week' ? enablePrevNext('next', 'week') : enablePrevNext('next', 'date')"
  1715. (panelChange)="panelChange.emit($event)"
  1716. (valueChange)="headerChange.emit($event)"
  1717. />
  1718. <div class="{{ prefixCls }}-body">
  1719. <date-table
  1720. [locale]="locale"
  1721. [showWeek]="showWeek"
  1722. [value]="value"
  1723. [activeDate]="activeDate"
  1724. [disabledDate]="disabledDate"
  1725. [cellRender]="dateRender"
  1726. [selectedValue]="selectedValue"
  1727. [hoverValue]="hoverValue"
  1728. [canSelectWeek]="panelMode === 'week'"
  1729. [format]="format"
  1730. (valueChange)="onSelectDate($event)"
  1731. (cellHover)="cellHover.emit($event)"
  1732. />
  1733. </div>
  1734. }
  1735. }
  1736. </div>
  1737. @if (showTimePicker && timeOptions) {
  1738. <nz-time-picker-panel
  1739. [nzInDatePicker]="true"
  1740. [ngModel]="value?.nativeDate"
  1741. (ngModelChange)="onSelectTime($event)"
  1742. [format]="$any(timeOptions.nzFormat)"
  1743. [nzHourStep]="$any(timeOptions.nzHourStep)"
  1744. [nzMinuteStep]="$any(timeOptions.nzMinuteStep)"
  1745. [nzSecondStep]="$any(timeOptions.nzSecondStep)"
  1746. [nzDisabledHours]="$any(timeOptions.nzDisabledHours)"
  1747. [nzDisabledMinutes]="$any(timeOptions.nzDisabledMinutes)"
  1748. [nzDisabledSeconds]="$any(timeOptions.nzDisabledSeconds)"
  1749. [nzHideDisabledOptions]="!!timeOptions.nzHideDisabledOptions"
  1750. [nzDefaultOpenValue]="$any(timeOptions.nzDefaultOpenValue)"
  1751. [nzUse12Hours]="!!timeOptions.nzUse12Hours"
  1752. [nzAddOn]="$any(timeOptions.nzAddOn)"
  1753. />
  1754. }
  1755. </div>
  1756. `,
  1757. imports: [LibPackerModule, NzTimePickerModule, FormsModule]
  1758. }]
  1759. }], propDecorators: { activeDate: [{
  1760. type: Input
  1761. }], endPanelMode: [{
  1762. type: Input
  1763. }], panelMode: [{
  1764. type: Input
  1765. }], showWeek: [{
  1766. type: Input,
  1767. args: [{ transform: booleanAttribute }]
  1768. }], locale: [{
  1769. type: Input
  1770. }], showTimePicker: [{
  1771. type: Input,
  1772. args: [{ transform: booleanAttribute }]
  1773. }], timeOptions: [{
  1774. type: Input
  1775. }], disabledDate: [{
  1776. type: Input
  1777. }], dateRender: [{
  1778. type: Input
  1779. }], selectedValue: [{
  1780. type: Input
  1781. }], hoverValue: [{
  1782. type: Input
  1783. }], value: [{
  1784. type: Input
  1785. }], partType: [{
  1786. type: Input
  1787. }], format: [{
  1788. type: Input
  1789. }], panelChange: [{
  1790. type: Output
  1791. }], headerChange: [{
  1792. type: Output
  1793. }], selectDate: [{
  1794. type: Output
  1795. }], selectTime: [{
  1796. type: Output
  1797. }], cellHover: [{
  1798. type: Output
  1799. }] } });
  1800. class DateRangePopupComponent {
  1801. datePickerService;
  1802. cdr;
  1803. host;
  1804. isRange;
  1805. inline = false;
  1806. showWeek;
  1807. locale;
  1808. disabledDate;
  1809. disabledTime; // This will lead to rebuild time options
  1810. showToday;
  1811. showNow;
  1812. showTime;
  1813. extraFooter;
  1814. ranges;
  1815. dateRender;
  1816. panelMode;
  1817. defaultPickerValue;
  1818. dir = 'ltr';
  1819. format;
  1820. panelModeChange = new EventEmitter();
  1821. calendarChange = new EventEmitter();
  1822. resultOk = new EventEmitter(); // Emitted when done with date selecting
  1823. prefixCls = PREFIX_CLASS;
  1824. endPanelMode = 'date';
  1825. timeOptions = null;
  1826. hoverValue = []; // Range ONLY
  1827. checkedPartArr = [false, false];
  1828. destroy$ = new Subject();
  1829. get hasTimePicker() {
  1830. return !!this.showTime;
  1831. }
  1832. get hasFooter() {
  1833. return this.showToday || this.hasTimePicker || !!this.extraFooter || !!this.ranges;
  1834. }
  1835. get arrowPosition() {
  1836. return this.dir === 'rtl'
  1837. ? { right: `${this.datePickerService?.arrowLeft}px` }
  1838. : { left: `${this.datePickerService?.arrowLeft}px` };
  1839. }
  1840. constructor(datePickerService, cdr, host) {
  1841. this.datePickerService = datePickerService;
  1842. this.cdr = cdr;
  1843. this.host = host;
  1844. }
  1845. ngOnInit() {
  1846. merge(this.datePickerService.valueChange$, this.datePickerService.inputPartChange$)
  1847. .pipe(takeUntil(this.destroy$))
  1848. .subscribe(() => {
  1849. this.updateActiveDate();
  1850. this.cdr.markForCheck();
  1851. });
  1852. fromEventOutsideAngular(this.host.nativeElement, 'mousedown')
  1853. .pipe(takeUntil(this.destroy$))
  1854. .subscribe(event => event.preventDefault());
  1855. }
  1856. ngOnChanges(changes) {
  1857. // Parse showTime options
  1858. if (changes.showTime || changes.disabledTime) {
  1859. if (this.showTime) {
  1860. this.buildTimeOptions();
  1861. }
  1862. }
  1863. if (changes.panelMode) {
  1864. this.endPanelMode = this.panelMode;
  1865. }
  1866. if (changes.defaultPickerValue) {
  1867. this.updateActiveDate();
  1868. }
  1869. }
  1870. ngOnDestroy() {
  1871. this.destroy$.next(true);
  1872. this.destroy$.complete();
  1873. }
  1874. updateActiveDate() {
  1875. const activeDate = this.datePickerService.hasValue()
  1876. ? this.datePickerService.value
  1877. : this.datePickerService.makeValue(this.defaultPickerValue);
  1878. this.datePickerService.setActiveDate(activeDate, this.hasTimePicker, this.getPanelMode(this.endPanelMode));
  1879. }
  1880. onClickOk() {
  1881. const inputIndex = { left: 0, right: 1 }[this.datePickerService.activeInput];
  1882. const value = this.isRange
  1883. ? this.datePickerService.value[inputIndex]
  1884. : this.datePickerService.value;
  1885. this.changeValueFromSelect(value);
  1886. this.resultOk.emit();
  1887. }
  1888. onClickToday(value) {
  1889. this.changeValueFromSelect(value, !this.showTime);
  1890. }
  1891. onCellHover(value) {
  1892. if (!this.isRange) {
  1893. return;
  1894. }
  1895. const otherInputIndex = { left: 1, right: 0 }[this.datePickerService.activeInput];
  1896. const base = this.datePickerService.value[otherInputIndex];
  1897. if (base) {
  1898. if (base.isBeforeDay(value)) {
  1899. this.hoverValue = [base, value];
  1900. }
  1901. else {
  1902. this.hoverValue = [value, base];
  1903. }
  1904. }
  1905. }
  1906. onPanelModeChange(panelChangeEvent, partType) {
  1907. if (this.isRange) {
  1908. const index = this.datePickerService.getActiveIndex(partType);
  1909. if (index === 0) {
  1910. this.panelMode = [panelChangeEvent.mode, this.panelMode[1]];
  1911. }
  1912. else {
  1913. this.panelMode = [this.panelMode[0], panelChangeEvent.mode];
  1914. }
  1915. this.panelModeChange.emit({
  1916. mode: this.panelMode,
  1917. date: this.datePickerService.activeDate.map(d => d.nativeDate)
  1918. });
  1919. }
  1920. else {
  1921. this.panelMode = panelChangeEvent.mode;
  1922. this.panelModeChange.emit({ mode: this.panelMode, date: panelChangeEvent.date });
  1923. }
  1924. }
  1925. onActiveDateChange(value, partType) {
  1926. if (this.isRange) {
  1927. const activeDate = [];
  1928. activeDate[this.datePickerService.getActiveIndex(partType)] = value;
  1929. this.datePickerService.setActiveDate(activeDate, this.hasTimePicker, this.getPanelMode(this.endPanelMode, partType));
  1930. }
  1931. else {
  1932. this.datePickerService.setActiveDate(value);
  1933. }
  1934. }
  1935. onSelectTime(value, partType) {
  1936. if (this.isRange) {
  1937. const newValue = cloneDate(this.datePickerService.value);
  1938. const index = this.datePickerService.getActiveIndex(partType);
  1939. newValue[index] = this.overrideHms(value, newValue[index]);
  1940. this.datePickerService.setValue(newValue);
  1941. }
  1942. else {
  1943. const newValue = this.overrideHms(value, this.datePickerService.value);
  1944. this.datePickerService.setValue(newValue); // If not select a date currently, use today
  1945. }
  1946. this.datePickerService.inputPartChange$.next(null);
  1947. this.buildTimeOptions();
  1948. }
  1949. changeValueFromSelect(value, emitValue = true) {
  1950. if (this.isRange) {
  1951. const selectedValue = cloneDate(this.datePickerService.value);
  1952. const checkedPart = this.datePickerService.activeInput;
  1953. let nextPart = checkedPart;
  1954. selectedValue[this.datePickerService.getActiveIndex(checkedPart)] = value;
  1955. this.checkedPartArr[this.datePickerService.getActiveIndex(checkedPart)] = true;
  1956. this.hoverValue = selectedValue;
  1957. if (emitValue) {
  1958. if (this.inline) {
  1959. // For UE, Should always be reversed, and clear vaue when next part is right
  1960. nextPart = this.reversedPart(checkedPart);
  1961. if (nextPart === 'right') {
  1962. selectedValue[this.datePickerService.getActiveIndex(nextPart)] = null;
  1963. this.checkedPartArr[this.datePickerService.getActiveIndex(nextPart)] = false;
  1964. }
  1965. this.datePickerService.setValue(selectedValue);
  1966. this.calendarChange.emit(selectedValue);
  1967. if (this.isBothAllowed(selectedValue) && this.checkedPartArr[0] && this.checkedPartArr[1]) {
  1968. this.clearHoverValue();
  1969. this.datePickerService.emitValue$.next();
  1970. }
  1971. }
  1972. else {
  1973. /**
  1974. * if sort order is wrong, clear the other part's value
  1975. */
  1976. if (wrongSortOrder(selectedValue)) {
  1977. nextPart = this.reversedPart(checkedPart);
  1978. selectedValue[this.datePickerService.getActiveIndex(nextPart)] = null;
  1979. this.checkedPartArr[this.datePickerService.getActiveIndex(nextPart)] = false;
  1980. }
  1981. this.datePickerService.setValue(selectedValue);
  1982. /**
  1983. * range date usually selected paired,
  1984. * so we emit the date value only both date is allowed and both part are checked
  1985. */
  1986. if (this.isBothAllowed(selectedValue) && this.checkedPartArr[0] && this.checkedPartArr[1]) {
  1987. this.calendarChange.emit(selectedValue);
  1988. this.clearHoverValue();
  1989. this.datePickerService.emitValue$.next();
  1990. }
  1991. else if (this.isAllowed(selectedValue)) {
  1992. nextPart = this.reversedPart(checkedPart);
  1993. this.calendarChange.emit([value.clone()]);
  1994. }
  1995. }
  1996. }
  1997. else {
  1998. this.datePickerService.setValue(selectedValue);
  1999. }
  2000. this.datePickerService.inputPartChange$.next(nextPart);
  2001. }
  2002. else {
  2003. this.datePickerService.setValue(value);
  2004. this.datePickerService.inputPartChange$.next(null);
  2005. if (emitValue && this.isAllowed(value)) {
  2006. this.datePickerService.emitValue$.next();
  2007. }
  2008. }
  2009. this.buildTimeOptions();
  2010. }
  2011. reversedPart(part) {
  2012. return part === 'left' ? 'right' : 'left';
  2013. }
  2014. getPanelMode(panelMode, partType) {
  2015. if (this.isRange) {
  2016. return panelMode[this.datePickerService.getActiveIndex(partType)];
  2017. }
  2018. else {
  2019. return panelMode;
  2020. }
  2021. }
  2022. // Get single value or part value of a range
  2023. getValue(partType) {
  2024. if (this.isRange) {
  2025. return (this.datePickerService.value || [])[this.datePickerService.getActiveIndex(partType)];
  2026. }
  2027. else {
  2028. return this.datePickerService.value;
  2029. }
  2030. }
  2031. getActiveDate(partType) {
  2032. if (this.isRange) {
  2033. return this.datePickerService.activeDate[this.datePickerService.getActiveIndex(partType)];
  2034. }
  2035. else {
  2036. return this.datePickerService.activeDate;
  2037. }
  2038. }
  2039. disabledStartTime = (value) => this.disabledTime && this.disabledTime(value, 'start');
  2040. disabledEndTime = (value) => this.disabledTime && this.disabledTime(value, 'end');
  2041. isOneAllowed(selectedValue) {
  2042. const index = this.datePickerService.getActiveIndex();
  2043. const disabledTimeArr = [this.disabledStartTime, this.disabledEndTime];
  2044. return isAllowedDate(selectedValue[index], this.disabledDate, disabledTimeArr[index]);
  2045. }
  2046. isBothAllowed(selectedValue) {
  2047. return (isAllowedDate(selectedValue[0], this.disabledDate, this.disabledStartTime) &&
  2048. isAllowedDate(selectedValue[1], this.disabledDate, this.disabledEndTime));
  2049. }
  2050. isAllowed(value, isBoth = false) {
  2051. if (this.isRange) {
  2052. return isBoth ? this.isBothAllowed(value) : this.isOneAllowed(value);
  2053. }
  2054. else {
  2055. return isAllowedDate(value, this.disabledDate, this.disabledTime);
  2056. }
  2057. }
  2058. getTimeOptions(partType) {
  2059. if (this.showTime && this.timeOptions) {
  2060. return this.timeOptions instanceof Array
  2061. ? this.timeOptions[this.datePickerService.getActiveIndex(partType)]
  2062. : this.timeOptions;
  2063. }
  2064. return null;
  2065. }
  2066. onClickPresetRange(val) {
  2067. const value = typeof val === 'function' ? val() : val;
  2068. if (value) {
  2069. this.datePickerService.setValue([new CandyDate(value[0]), new CandyDate(value[1])]);
  2070. this.datePickerService.emitValue$.next();
  2071. }
  2072. }
  2073. onPresetRangeMouseLeave() {
  2074. this.clearHoverValue();
  2075. }
  2076. onHoverPresetRange(val) {
  2077. if (typeof val !== 'function') {
  2078. this.hoverValue = [new CandyDate(val[0]), new CandyDate(val[1])];
  2079. }
  2080. }
  2081. getObjectKeys(obj) {
  2082. return obj ? Object.keys(obj) : [];
  2083. }
  2084. show(partType) {
  2085. const hide = this.showTime && this.isRange && this.datePickerService.activeInput !== partType;
  2086. return !hide;
  2087. }
  2088. clearHoverValue() {
  2089. this.hoverValue = [];
  2090. }
  2091. buildTimeOptions() {
  2092. if (this.showTime) {
  2093. const showTime = typeof this.showTime === 'object' ? this.showTime : {};
  2094. if (this.isRange) {
  2095. const value = this.datePickerService.value;
  2096. this.timeOptions = [
  2097. this.overrideTimeOptions(showTime, value[0], 'start'),
  2098. this.overrideTimeOptions(showTime, value[1], 'end')
  2099. ];
  2100. }
  2101. else {
  2102. this.timeOptions = this.overrideTimeOptions(showTime, this.datePickerService.value);
  2103. }
  2104. }
  2105. else {
  2106. this.timeOptions = null;
  2107. }
  2108. }
  2109. overrideTimeOptions(origin, value, partial) {
  2110. let disabledTimeFn;
  2111. if (partial) {
  2112. disabledTimeFn = partial === 'start' ? this.disabledStartTime : this.disabledEndTime;
  2113. }
  2114. else {
  2115. disabledTimeFn = this.disabledTime;
  2116. }
  2117. return { ...origin, ...getTimeConfig(value, disabledTimeFn) };
  2118. }
  2119. overrideHms(newValue, oldValue) {
  2120. newValue = newValue || new CandyDate();
  2121. oldValue = oldValue || new CandyDate();
  2122. return oldValue.setHms(newValue.getHours(), newValue.getMinutes(), newValue.getSeconds());
  2123. }
  2124. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateRangePopupComponent, deps: [{ token: DatePickerService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
  2125. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: DateRangePopupComponent, isStandalone: true, selector: "date-range-popup", inputs: { isRange: ["isRange", "isRange", booleanAttribute], inline: ["inline", "inline", booleanAttribute], showWeek: ["showWeek", "showWeek", booleanAttribute], locale: "locale", disabledDate: "disabledDate", disabledTime: "disabledTime", showToday: ["showToday", "showToday", booleanAttribute], showNow: ["showNow", "showNow", booleanAttribute], showTime: "showTime", extraFooter: "extraFooter", ranges: "ranges", dateRender: "dateRender", panelMode: "panelMode", defaultPickerValue: "defaultPickerValue", dir: "dir", format: "format" }, outputs: { panelModeChange: "panelModeChange", calendarChange: "calendarChange", resultOk: "resultOk" }, exportAs: ["dateRangePopup"], usesOnChanges: true, ngImport: i0, template: `
  2126. @if (isRange) {
  2127. <div class="{{ prefixCls }}-range-wrapper {{ prefixCls }}-date-range-wrapper">
  2128. <div class="{{ prefixCls }}-range-arrow" [style]="arrowPosition"></div>
  2129. <div class="{{ prefixCls }}-panel-container {{ showWeek ? prefixCls + '-week-number' : '' }}">
  2130. <div class="{{ prefixCls }}-panels">
  2131. @if (hasTimePicker) {
  2132. <ng-container *ngTemplateOutlet="tplInnerPopup; context: { partType: datePickerService.activeInput }" />
  2133. } @else {
  2134. <ng-container *ngTemplateOutlet="tplInnerPopup; context: { partType: 'left' }" />
  2135. <ng-container *ngTemplateOutlet="tplInnerPopup; context: { partType: 'right' }" />
  2136. }
  2137. </div>
  2138. <ng-container *ngTemplateOutlet="tplFooter" />
  2139. </div>
  2140. </div>
  2141. } @else {
  2142. <div
  2143. class="{{ prefixCls }}-panel-container {{ showWeek ? prefixCls + '-week-number' : '' }} {{
  2144. hasTimePicker ? prefixCls + '-time' : ''
  2145. }} {{ isRange ? prefixCls + '-range' : '' }}"
  2146. >
  2147. <div class="{{ prefixCls }}-panel" [class.ant-picker-panel-rtl]="dir === 'rtl'" tabindex="-1">
  2148. <!-- Single ONLY -->
  2149. <ng-container *ngTemplateOutlet="tplInnerPopup" />
  2150. <ng-container *ngTemplateOutlet="tplFooter" />
  2151. </div>
  2152. </div>
  2153. }
  2154. <ng-template #tplInnerPopup let-partType="partType">
  2155. <div class="{{ prefixCls }}-panel" [class.ant-picker-panel-rtl]="dir === 'rtl'">
  2156. <!-- TODO(@wenqi73) [selectedValue] [hoverValue] types-->
  2157. <inner-popup
  2158. [showWeek]="showWeek"
  2159. [endPanelMode]="getPanelMode(endPanelMode, partType)"
  2160. [partType]="partType"
  2161. [locale]="locale!"
  2162. [showTimePicker]="hasTimePicker"
  2163. [timeOptions]="getTimeOptions(partType)"
  2164. [panelMode]="getPanelMode(panelMode, partType)"
  2165. (panelChange)="onPanelModeChange($event, partType)"
  2166. [activeDate]="getActiveDate(partType)"
  2167. [value]="getValue(partType)"
  2168. [disabledDate]="disabledDate"
  2169. [dateRender]="dateRender"
  2170. [selectedValue]="$any(datePickerService?.value)"
  2171. [hoverValue]="$any(hoverValue)"
  2172. [format]="format"
  2173. (cellHover)="onCellHover($event)"
  2174. (selectDate)="changeValueFromSelect($event, !showTime)"
  2175. (selectTime)="onSelectTime($event, partType)"
  2176. (headerChange)="onActiveDateChange($event, partType)"
  2177. />
  2178. </div>
  2179. </ng-template>
  2180. <ng-template #tplFooter>
  2181. @if (hasFooter) {
  2182. <calendar-footer
  2183. [locale]="locale!"
  2184. [isRange]="isRange"
  2185. [showToday]="showToday"
  2186. [showNow]="showNow"
  2187. [hasTimePicker]="hasTimePicker"
  2188. [okDisabled]="!isAllowed($any(datePickerService?.value))"
  2189. [extraFooter]="extraFooter"
  2190. [rangeQuickSelector]="ranges ? tplRangeQuickSelector : null"
  2191. (clickOk)="onClickOk()"
  2192. (clickToday)="onClickToday($event)"
  2193. />
  2194. }
  2195. </ng-template>
  2196. <!-- Range ONLY: Range Quick Selector -->
  2197. <ng-template #tplRangeQuickSelector>
  2198. @for (name of getObjectKeys(ranges); track name) {
  2199. <li
  2200. class="{{ prefixCls }}-preset"
  2201. (click)="onClickPresetRange(ranges![name])"
  2202. (mouseenter)="onHoverPresetRange(ranges![name])"
  2203. (mouseleave)="onPresetRangeMouseLeave()"
  2204. >
  2205. <span class="ant-tag ant-tag-blue">{{ name }}</span>
  2206. </li>
  2207. }
  2208. </ng-template>
  2209. `, isInline: true, dependencies: [{ kind: "component", type: InnerPopupComponent, selector: "inner-popup", inputs: ["activeDate", "endPanelMode", "panelMode", "showWeek", "locale", "showTimePicker", "timeOptions", "disabledDate", "dateRender", "selectedValue", "hoverValue", "value", "partType", "format"], outputs: ["panelChange", "headerChange", "selectDate", "selectTime", "cellHover"], exportAs: ["innerPopup"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CalendarFooterComponent, selector: "calendar-footer", inputs: ["locale", "showToday", "showNow", "hasTimePicker", "isRange", "okDisabled", "disabledDate", "extraFooter", "rangeQuickSelector"], outputs: ["clickOk", "clickToday"], exportAs: ["calendarFooter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  2210. }
  2211. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateRangePopupComponent, decorators: [{
  2212. type: Component,
  2213. args: [{
  2214. encapsulation: ViewEncapsulation.None,
  2215. changeDetection: ChangeDetectionStrategy.OnPush,
  2216. // eslint-disable-next-line @angular-eslint/component-selector
  2217. selector: 'date-range-popup',
  2218. exportAs: 'dateRangePopup',
  2219. template: `
  2220. @if (isRange) {
  2221. <div class="{{ prefixCls }}-range-wrapper {{ prefixCls }}-date-range-wrapper">
  2222. <div class="{{ prefixCls }}-range-arrow" [style]="arrowPosition"></div>
  2223. <div class="{{ prefixCls }}-panel-container {{ showWeek ? prefixCls + '-week-number' : '' }}">
  2224. <div class="{{ prefixCls }}-panels">
  2225. @if (hasTimePicker) {
  2226. <ng-container *ngTemplateOutlet="tplInnerPopup; context: { partType: datePickerService.activeInput }" />
  2227. } @else {
  2228. <ng-container *ngTemplateOutlet="tplInnerPopup; context: { partType: 'left' }" />
  2229. <ng-container *ngTemplateOutlet="tplInnerPopup; context: { partType: 'right' }" />
  2230. }
  2231. </div>
  2232. <ng-container *ngTemplateOutlet="tplFooter" />
  2233. </div>
  2234. </div>
  2235. } @else {
  2236. <div
  2237. class="{{ prefixCls }}-panel-container {{ showWeek ? prefixCls + '-week-number' : '' }} {{
  2238. hasTimePicker ? prefixCls + '-time' : ''
  2239. }} {{ isRange ? prefixCls + '-range' : '' }}"
  2240. >
  2241. <div class="{{ prefixCls }}-panel" [class.ant-picker-panel-rtl]="dir === 'rtl'" tabindex="-1">
  2242. <!-- Single ONLY -->
  2243. <ng-container *ngTemplateOutlet="tplInnerPopup" />
  2244. <ng-container *ngTemplateOutlet="tplFooter" />
  2245. </div>
  2246. </div>
  2247. }
  2248. <ng-template #tplInnerPopup let-partType="partType">
  2249. <div class="{{ prefixCls }}-panel" [class.ant-picker-panel-rtl]="dir === 'rtl'">
  2250. <!-- TODO(@wenqi73) [selectedValue] [hoverValue] types-->
  2251. <inner-popup
  2252. [showWeek]="showWeek"
  2253. [endPanelMode]="getPanelMode(endPanelMode, partType)"
  2254. [partType]="partType"
  2255. [locale]="locale!"
  2256. [showTimePicker]="hasTimePicker"
  2257. [timeOptions]="getTimeOptions(partType)"
  2258. [panelMode]="getPanelMode(panelMode, partType)"
  2259. (panelChange)="onPanelModeChange($event, partType)"
  2260. [activeDate]="getActiveDate(partType)"
  2261. [value]="getValue(partType)"
  2262. [disabledDate]="disabledDate"
  2263. [dateRender]="dateRender"
  2264. [selectedValue]="$any(datePickerService?.value)"
  2265. [hoverValue]="$any(hoverValue)"
  2266. [format]="format"
  2267. (cellHover)="onCellHover($event)"
  2268. (selectDate)="changeValueFromSelect($event, !showTime)"
  2269. (selectTime)="onSelectTime($event, partType)"
  2270. (headerChange)="onActiveDateChange($event, partType)"
  2271. />
  2272. </div>
  2273. </ng-template>
  2274. <ng-template #tplFooter>
  2275. @if (hasFooter) {
  2276. <calendar-footer
  2277. [locale]="locale!"
  2278. [isRange]="isRange"
  2279. [showToday]="showToday"
  2280. [showNow]="showNow"
  2281. [hasTimePicker]="hasTimePicker"
  2282. [okDisabled]="!isAllowed($any(datePickerService?.value))"
  2283. [extraFooter]="extraFooter"
  2284. [rangeQuickSelector]="ranges ? tplRangeQuickSelector : null"
  2285. (clickOk)="onClickOk()"
  2286. (clickToday)="onClickToday($event)"
  2287. />
  2288. }
  2289. </ng-template>
  2290. <!-- Range ONLY: Range Quick Selector -->
  2291. <ng-template #tplRangeQuickSelector>
  2292. @for (name of getObjectKeys(ranges); track name) {
  2293. <li
  2294. class="{{ prefixCls }}-preset"
  2295. (click)="onClickPresetRange(ranges![name])"
  2296. (mouseenter)="onHoverPresetRange(ranges![name])"
  2297. (mouseleave)="onPresetRangeMouseLeave()"
  2298. >
  2299. <span class="ant-tag ant-tag-blue">{{ name }}</span>
  2300. </li>
  2301. }
  2302. </ng-template>
  2303. `,
  2304. imports: [InnerPopupComponent, NgTemplateOutlet, CalendarFooterComponent]
  2305. }]
  2306. }], ctorParameters: () => [{ type: DatePickerService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { isRange: [{
  2307. type: Input,
  2308. args: [{ transform: booleanAttribute }]
  2309. }], inline: [{
  2310. type: Input,
  2311. args: [{ transform: booleanAttribute }]
  2312. }], showWeek: [{
  2313. type: Input,
  2314. args: [{ transform: booleanAttribute }]
  2315. }], locale: [{
  2316. type: Input
  2317. }], disabledDate: [{
  2318. type: Input
  2319. }], disabledTime: [{
  2320. type: Input
  2321. }], showToday: [{
  2322. type: Input,
  2323. args: [{ transform: booleanAttribute }]
  2324. }], showNow: [{
  2325. type: Input,
  2326. args: [{ transform: booleanAttribute }]
  2327. }], showTime: [{
  2328. type: Input
  2329. }], extraFooter: [{
  2330. type: Input
  2331. }], ranges: [{
  2332. type: Input
  2333. }], dateRender: [{
  2334. type: Input
  2335. }], panelMode: [{
  2336. type: Input
  2337. }], defaultPickerValue: [{
  2338. type: Input
  2339. }], dir: [{
  2340. type: Input
  2341. }], format: [{
  2342. type: Input
  2343. }], panelModeChange: [{
  2344. type: Output
  2345. }], calendarChange: [{
  2346. type: Output
  2347. }], resultOk: [{
  2348. type: Output
  2349. }] } });
  2350. const POPUP_STYLE_PATCH = { position: 'relative' }; // Aim to override antd's style to support overlay's position strategy (position:absolute will cause it not working because the overlay can't get the height/width of it's content)
  2351. const NZ_CONFIG_MODULE_NAME = 'datePicker';
  2352. /**
  2353. * The base picker for all common APIs
  2354. */
  2355. let NzDatePickerComponent = (() => {
  2356. let _nzSeparator_decorators;
  2357. let _nzSeparator_initializers = [];
  2358. let _nzSeparator_extraInitializers = [];
  2359. let _nzSuffixIcon_decorators;
  2360. let _nzSuffixIcon_initializers = [];
  2361. let _nzSuffixIcon_extraInitializers = [];
  2362. let _nzBackdrop_decorators;
  2363. let _nzBackdrop_initializers = [];
  2364. let _nzBackdrop_extraInitializers = [];
  2365. return class NzDatePickerComponent {
  2366. static {
  2367. const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
  2368. _nzSeparator_decorators = [WithConfig()];
  2369. _nzSuffixIcon_decorators = [WithConfig()];
  2370. _nzBackdrop_decorators = [WithConfig()];
  2371. __esDecorate(null, null, _nzSeparator_decorators, { kind: "field", name: "nzSeparator", static: false, private: false, access: { has: obj => "nzSeparator" in obj, get: obj => obj.nzSeparator, set: (obj, value) => { obj.nzSeparator = value; } }, metadata: _metadata }, _nzSeparator_initializers, _nzSeparator_extraInitializers);
  2372. __esDecorate(null, null, _nzSuffixIcon_decorators, { kind: "field", name: "nzSuffixIcon", static: false, private: false, access: { has: obj => "nzSuffixIcon" in obj, get: obj => obj.nzSuffixIcon, set: (obj, value) => { obj.nzSuffixIcon = value; } }, metadata: _metadata }, _nzSuffixIcon_initializers, _nzSuffixIcon_extraInitializers);
  2373. __esDecorate(null, null, _nzBackdrop_decorators, { kind: "field", name: "nzBackdrop", static: false, private: false, access: { has: obj => "nzBackdrop" in obj, get: obj => obj.nzBackdrop, set: (obj, value) => { obj.nzBackdrop = value; } }, metadata: _metadata }, _nzBackdrop_initializers, _nzBackdrop_extraInitializers);
  2374. if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
  2375. }
  2376. nzConfigService;
  2377. datePickerService;
  2378. i18n;
  2379. cdr;
  2380. renderer;
  2381. elementRef;
  2382. dateHelper;
  2383. nzResizeObserver;
  2384. platform;
  2385. destroy$;
  2386. directionality;
  2387. _nzModuleName = NZ_CONFIG_MODULE_NAME;
  2388. static ngAcceptInputType_nzShowTime;
  2389. static ngAcceptInputType_nzMode;
  2390. isRange = false; // Indicate whether the value is a range value
  2391. extraFooter;
  2392. dir = 'ltr';
  2393. // status
  2394. statusCls = {};
  2395. status = '';
  2396. hasFeedback = false;
  2397. panelMode = 'date';
  2398. isCustomPlaceHolder = false;
  2399. isCustomFormat = false;
  2400. showTime = false;
  2401. isNzDisableFirstChange = true;
  2402. // --- Common API
  2403. nzAllowClear = true;
  2404. nzAutoFocus = false;
  2405. nzDisabled = false;
  2406. nzBorderless = false;
  2407. nzInputReadOnly = false;
  2408. nzInline = false;
  2409. nzOpen;
  2410. nzDisabledDate;
  2411. nzLocale;
  2412. nzPlaceHolder = '';
  2413. nzPopupStyle = POPUP_STYLE_PATCH;
  2414. nzDropdownClassName;
  2415. nzSize = 'default';
  2416. nzStatus = '';
  2417. nzFormat;
  2418. nzDateRender;
  2419. nzDisabledTime;
  2420. nzRenderExtraFooter;
  2421. nzShowToday = true;
  2422. nzMode = 'date';
  2423. nzShowNow = true;
  2424. nzRanges;
  2425. nzDefaultPickerValue = null;
  2426. nzSeparator = __runInitializers(this, _nzSeparator_initializers, undefined);
  2427. nzSuffixIcon = (__runInitializers(this, _nzSeparator_extraInitializers), __runInitializers(this, _nzSuffixIcon_initializers, 'calendar'));
  2428. nzBackdrop = (__runInitializers(this, _nzSuffixIcon_extraInitializers), __runInitializers(this, _nzBackdrop_initializers, false));
  2429. nzId = (__runInitializers(this, _nzBackdrop_extraInitializers), null);
  2430. nzPlacement = 'bottomLeft';
  2431. nzShowWeekNumber = false;
  2432. nzOnPanelChange = new EventEmitter();
  2433. nzOnCalendarChange = new EventEmitter();
  2434. nzOnOk = new EventEmitter();
  2435. nzOnOpenChange = new EventEmitter();
  2436. get nzShowTime() {
  2437. return this.showTime;
  2438. }
  2439. set nzShowTime(value) {
  2440. this.showTime = typeof value === 'object' ? value : toBoolean(value);
  2441. }
  2442. // ------------------------------------------------------------------------
  2443. // Input API Start
  2444. // ------------------------------------------------------------------------
  2445. cdkConnectedOverlay;
  2446. panel;
  2447. separatorElement;
  2448. pickerInput;
  2449. rangePickerInputs;
  2450. get origin() {
  2451. return this.elementRef;
  2452. }
  2453. inputSize = 12;
  2454. inputWidth;
  2455. prefixCls = PREFIX_CLASS;
  2456. inputValue;
  2457. activeBarStyle = {};
  2458. overlayOpen = false; // Available when "nzOpen" = undefined
  2459. overlayPositions = [...DEFAULT_DATE_PICKER_POSITIONS];
  2460. currentPositionX = 'start';
  2461. currentPositionY = 'bottom';
  2462. get realOpenState() {
  2463. // The value that really decide the open state of overlay
  2464. return this.isOpenHandledByUser() ? !!this.nzOpen : this.overlayOpen;
  2465. }
  2466. finalSize = computed(() => {
  2467. if (this.compactSize) {
  2468. return this.compactSize();
  2469. }
  2470. return this.size();
  2471. });
  2472. size = signal(this.nzSize);
  2473. compactSize = inject(NZ_SPACE_COMPACT_SIZE, { optional: true });
  2474. document = inject(DOCUMENT);
  2475. ngAfterViewInit() {
  2476. if (this.nzAutoFocus) {
  2477. this.focus();
  2478. }
  2479. if (this.isRange && this.platform.isBrowser) {
  2480. this.nzResizeObserver
  2481. .observe(this.elementRef)
  2482. .pipe(takeUntil(this.destroy$))
  2483. .subscribe(() => {
  2484. this.updateInputWidthAndArrowLeft();
  2485. });
  2486. }
  2487. this.datePickerService.inputPartChange$.pipe(takeUntil(this.destroy$)).subscribe(partType => {
  2488. if (partType) {
  2489. this.datePickerService.activeInput = partType;
  2490. }
  2491. this.focus();
  2492. this.updateInputWidthAndArrowLeft();
  2493. });
  2494. if (this.platform.isBrowser) {
  2495. // prevent mousedown event to trigger focusout event when click in date picker
  2496. // see: https://github.com/NG-ZORRO/ng-zorro-antd/issues/7450
  2497. fromEventOutsideAngular(this.elementRef.nativeElement, 'mousedown')
  2498. .pipe(takeUntil(this.destroy$))
  2499. .subscribe(event => {
  2500. if (event.target.tagName.toLowerCase() !== 'input') {
  2501. event.preventDefault();
  2502. }
  2503. });
  2504. }
  2505. }
  2506. updateInputWidthAndArrowLeft() {
  2507. this.inputWidth = this.rangePickerInputs?.first?.nativeElement.offsetWidth || 0;
  2508. const baseStyle = { position: 'absolute', width: `${this.inputWidth}px` };
  2509. this.datePickerService.arrowLeft =
  2510. this.datePickerService.activeInput === 'left'
  2511. ? 0
  2512. : this.inputWidth + this.separatorElement?.nativeElement.offsetWidth || 0;
  2513. if (this.dir === 'rtl') {
  2514. this.activeBarStyle = { ...baseStyle, right: `${this.datePickerService.arrowLeft}px` };
  2515. }
  2516. else {
  2517. this.activeBarStyle = { ...baseStyle, left: `${this.datePickerService.arrowLeft}px` };
  2518. }
  2519. this.cdr.markForCheck();
  2520. }
  2521. getInput(partType) {
  2522. if (this.nzInline) {
  2523. return undefined;
  2524. }
  2525. return this.isRange
  2526. ? partType === 'left'
  2527. ? this.rangePickerInputs?.first.nativeElement
  2528. : this.rangePickerInputs?.last.nativeElement
  2529. : this.pickerInput.nativeElement;
  2530. }
  2531. focus() {
  2532. const activeInputElement = this.getInput(this.datePickerService.activeInput);
  2533. if (this.document.activeElement !== activeInputElement) {
  2534. activeInputElement?.focus();
  2535. }
  2536. }
  2537. onFocus(event, partType) {
  2538. event.preventDefault();
  2539. if (partType) {
  2540. this.datePickerService.inputPartChange$.next(partType);
  2541. }
  2542. this.renderClass(true);
  2543. }
  2544. // blur event has not the relatedTarget in IE11, use focusout instead.
  2545. onFocusout(event) {
  2546. event.preventDefault();
  2547. this.onTouchedFn();
  2548. if (!this.elementRef.nativeElement.contains(event.relatedTarget)) {
  2549. this.checkAndClose();
  2550. }
  2551. this.renderClass(false);
  2552. }
  2553. // Show overlay content
  2554. open() {
  2555. if (this.nzInline) {
  2556. return;
  2557. }
  2558. if (!this.realOpenState && !this.nzDisabled) {
  2559. this.updateInputWidthAndArrowLeft();
  2560. this.overlayOpen = true;
  2561. this.nzOnOpenChange.emit(true);
  2562. this.focus();
  2563. this.cdr.markForCheck();
  2564. }
  2565. }
  2566. close() {
  2567. if (this.nzInline) {
  2568. return;
  2569. }
  2570. if (this.realOpenState) {
  2571. this.overlayOpen = false;
  2572. this.nzOnOpenChange.emit(false);
  2573. }
  2574. }
  2575. get showClear() {
  2576. return !this.nzDisabled && !this.isEmptyValue(this.datePickerService.value) && this.nzAllowClear;
  2577. }
  2578. checkAndClose() {
  2579. if (!this.realOpenState) {
  2580. return;
  2581. }
  2582. if (this.panel.isAllowed(this.datePickerService.value, true)) {
  2583. if (Array.isArray(this.datePickerService.value) && wrongSortOrder(this.datePickerService.value)) {
  2584. const index = this.datePickerService.getActiveIndex();
  2585. const value = this.datePickerService.value[index];
  2586. this.panel.changeValueFromSelect(value, true);
  2587. return;
  2588. }
  2589. this.updateInputValue();
  2590. this.datePickerService.emitValue$.next();
  2591. }
  2592. else {
  2593. this.datePickerService.setValue(this.datePickerService.initialValue);
  2594. this.close();
  2595. }
  2596. }
  2597. onClickInputBox(event) {
  2598. event.stopPropagation();
  2599. this.focus();
  2600. if (!this.isOpenHandledByUser()) {
  2601. this.open();
  2602. }
  2603. }
  2604. onOverlayKeydown(event) {
  2605. if (event.keyCode === ESCAPE) {
  2606. this.datePickerService.initValue();
  2607. }
  2608. }
  2609. // NOTE: A issue here, the first time position change, the animation will not be triggered.
  2610. // Because the overlay's "positionChange" event is emitted after the content's full shown up.
  2611. // All other components like "nz-dropdown" which depends on overlay also has the same issue.
  2612. // See: https://github.com/NG-ZORRO/ng-zorro-antd/issues/1429
  2613. onPositionChange(position) {
  2614. this.currentPositionX = position.connectionPair.originX;
  2615. this.currentPositionY = position.connectionPair.originY;
  2616. this.cdr.detectChanges(); // Take side effects to position styles
  2617. }
  2618. onClickClear(event) {
  2619. event.preventDefault();
  2620. event.stopPropagation();
  2621. this.datePickerService.initValue(true);
  2622. this.datePickerService.emitValue$.next();
  2623. }
  2624. updateInputValue() {
  2625. const newValue = this.datePickerService.value;
  2626. if (this.isRange) {
  2627. this.inputValue = newValue ? newValue.map(v => this.formatValue(v)) : ['', ''];
  2628. }
  2629. else {
  2630. this.inputValue = this.formatValue(newValue);
  2631. }
  2632. this.cdr.markForCheck();
  2633. }
  2634. formatValue(value) {
  2635. return this.dateHelper.format(value && value.nativeDate, this.nzFormat);
  2636. }
  2637. onInputChange(value, isEnter = false) {
  2638. /**
  2639. * in IE11 focus/blur will trigger ngModelChange if placeholder changes,
  2640. * so we forbid IE11 to open panel through input change
  2641. */
  2642. if (!this.platform.TRIDENT &&
  2643. this.document.activeElement === this.getInput(this.datePickerService.activeInput) &&
  2644. !this.realOpenState) {
  2645. this.open();
  2646. return;
  2647. }
  2648. const date = this.checkValidDate(value);
  2649. // Can only change date when it's open
  2650. if (date && this.realOpenState) {
  2651. this.panel.changeValueFromSelect(date, isEnter);
  2652. }
  2653. }
  2654. onKeyupEnter(event) {
  2655. this.onInputChange(event.target.value, true);
  2656. }
  2657. checkValidDate(value) {
  2658. const date = new CandyDate(this.dateHelper.parseDate(value, this.nzFormat));
  2659. if (!date.isValid() || value !== this.dateHelper.format(date.nativeDate, this.nzFormat)) {
  2660. return null;
  2661. }
  2662. return date;
  2663. }
  2664. getPlaceholder(partType) {
  2665. return this.isRange
  2666. ? this.nzPlaceHolder[this.datePickerService.getActiveIndex(partType)]
  2667. : this.nzPlaceHolder;
  2668. }
  2669. isEmptyValue(value) {
  2670. if (value === null) {
  2671. return true;
  2672. }
  2673. else if (this.isRange) {
  2674. return !value || !Array.isArray(value) || value.every(val => !val);
  2675. }
  2676. else {
  2677. return !value;
  2678. }
  2679. }
  2680. // Whether open state is permanently controlled by user himself
  2681. isOpenHandledByUser() {
  2682. return this.nzOpen !== undefined;
  2683. }
  2684. noAnimation = inject(NzNoAnimationDirective, { host: true, optional: true });
  2685. nzFormStatusService = inject(NzFormStatusService, { optional: true });
  2686. nzFormNoStatusService = inject(NzFormNoStatusService, { optional: true });
  2687. // ------------------------------------------------------------------------
  2688. // Input API End
  2689. // ------------------------------------------------------------------------
  2690. constructor(nzConfigService, datePickerService, i18n, cdr, renderer, elementRef, dateHelper, nzResizeObserver, platform, destroy$, directionality) {
  2691. this.nzConfigService = nzConfigService;
  2692. this.datePickerService = datePickerService;
  2693. this.i18n = i18n;
  2694. this.cdr = cdr;
  2695. this.renderer = renderer;
  2696. this.elementRef = elementRef;
  2697. this.dateHelper = dateHelper;
  2698. this.nzResizeObserver = nzResizeObserver;
  2699. this.platform = platform;
  2700. this.destroy$ = destroy$;
  2701. this.directionality = directionality;
  2702. }
  2703. ngOnInit() {
  2704. this.nzFormStatusService?.formStatusChanges
  2705. .pipe(distinctUntilChanged((pre, cur) => {
  2706. return pre.status === cur.status && pre.hasFeedback === cur.hasFeedback;
  2707. }), withLatestFrom(this.nzFormNoStatusService ? this.nzFormNoStatusService.noFormStatus : of(false)), map(([{ status, hasFeedback }, noStatus]) => ({ status: noStatus ? '' : status, hasFeedback })), takeUntil(this.destroy$))
  2708. .subscribe(({ status, hasFeedback }) => {
  2709. this.setStatusStyles(status, hasFeedback);
  2710. });
  2711. // Subscribe the every locale change if the nzLocale is not handled by user
  2712. if (!this.nzLocale) {
  2713. this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => this.setLocale());
  2714. }
  2715. // Default value
  2716. this.datePickerService.isRange = this.isRange;
  2717. this.datePickerService.initValue(true);
  2718. this.datePickerService.emitValue$.pipe(takeUntil(this.destroy$)).subscribe(() => {
  2719. const granularityComparison = this.showTime ? 'second' : 'day';
  2720. const value = this.datePickerService.value;
  2721. const datePickerPreviousValue = this.datePickerService.initialValue;
  2722. // Check if the value has change for a simple datepicker, let us avoid notify the control for nothing
  2723. if (!this.isRange &&
  2724. value?.isSame(datePickerPreviousValue?.nativeDate, granularityComparison)) {
  2725. this.onTouchedFn();
  2726. return this.close();
  2727. }
  2728. // check if the value has change for a range picker, let us avoid notify the control for nothing
  2729. if (this.isRange) {
  2730. const [previousStartDate, previousEndDate] = datePickerPreviousValue;
  2731. const [currentStartDate, currentEndDate] = value;
  2732. if (previousStartDate?.isSame(currentStartDate?.nativeDate, granularityComparison) &&
  2733. previousEndDate?.isSame(currentEndDate?.nativeDate, granularityComparison)) {
  2734. this.onTouchedFn();
  2735. return this.close();
  2736. }
  2737. }
  2738. this.datePickerService.initialValue = cloneDate(value);
  2739. if (this.isRange) {
  2740. const vAsRange = value;
  2741. if (vAsRange.length) {
  2742. this.onChangeFn([vAsRange[0]?.nativeDate ?? null, vAsRange[1]?.nativeDate ?? null]);
  2743. }
  2744. else {
  2745. this.onChangeFn([]);
  2746. }
  2747. }
  2748. else {
  2749. if (value) {
  2750. this.onChangeFn(value.nativeDate);
  2751. }
  2752. else {
  2753. this.onChangeFn(null);
  2754. }
  2755. }
  2756. this.onTouchedFn();
  2757. // When value emitted, overlay will be closed
  2758. this.close();
  2759. });
  2760. this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => {
  2761. this.dir = direction;
  2762. this.cdr.detectChanges();
  2763. });
  2764. this.dir = this.directionality.value;
  2765. this.inputValue = this.isRange ? ['', ''] : '';
  2766. this.setModeAndFormat();
  2767. this.datePickerService.valueChange$.pipe(takeUntil(this.destroy$)).subscribe(() => {
  2768. this.updateInputValue();
  2769. });
  2770. }
  2771. ngOnChanges({ nzStatus, nzPlacement, nzPopupStyle, nzPlaceHolder, nzLocale, nzFormat, nzRenderExtraFooter, nzMode, nzSize }) {
  2772. if (nzPopupStyle) {
  2773. // Always assign the popup style patch
  2774. this.nzPopupStyle = this.nzPopupStyle ? { ...this.nzPopupStyle, ...POPUP_STYLE_PATCH } : POPUP_STYLE_PATCH;
  2775. }
  2776. // Mark as customized placeholder by user once nzPlaceHolder assigned at the first time
  2777. if (nzPlaceHolder?.currentValue) {
  2778. this.isCustomPlaceHolder = true;
  2779. }
  2780. if (nzFormat?.currentValue) {
  2781. this.isCustomFormat = true;
  2782. }
  2783. if (nzLocale) {
  2784. // The nzLocale is currently handled by user
  2785. this.setDefaultPlaceHolder();
  2786. }
  2787. if (nzRenderExtraFooter) {
  2788. this.extraFooter = valueFunctionProp(this.nzRenderExtraFooter);
  2789. }
  2790. if (nzMode) {
  2791. this.setDefaultPlaceHolder();
  2792. this.setModeAndFormat();
  2793. }
  2794. if (nzStatus) {
  2795. this.setStatusStyles(this.nzStatus, this.hasFeedback);
  2796. }
  2797. if (nzPlacement) {
  2798. this.setPlacement(this.nzPlacement);
  2799. }
  2800. if (nzSize) {
  2801. this.size.set(nzSize.currentValue);
  2802. }
  2803. }
  2804. setModeAndFormat() {
  2805. const inputFormats = {
  2806. year: 'yyyy',
  2807. quarter: 'yyyy-[Q]Q',
  2808. month: 'yyyy-MM',
  2809. week: 'YYYY-ww',
  2810. date: this.nzShowTime ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd'
  2811. };
  2812. if (!this.nzMode) {
  2813. this.nzMode = 'date';
  2814. }
  2815. this.panelMode = this.isRange ? [this.nzMode, this.nzMode] : this.nzMode;
  2816. // Default format when it's empty
  2817. if (!this.isCustomFormat) {
  2818. this.nzFormat = inputFormats[this.nzMode];
  2819. }
  2820. this.inputSize = Math.max(10, this.nzFormat.length) + 2;
  2821. this.updateInputValue();
  2822. }
  2823. /**
  2824. * Triggered when overlayOpen changes (different with realOpenState)
  2825. *
  2826. * @param open The overlayOpen in picker component
  2827. */
  2828. onOpenChange(open) {
  2829. this.nzOnOpenChange.emit(open);
  2830. }
  2831. // ------------------------------------------------------------------------
  2832. // | Control value accessor implements
  2833. // ------------------------------------------------------------------------
  2834. // NOTE: onChangeFn/onTouchedFn will not be assigned if user not use as ngModel
  2835. onChangeFn = () => void 0;
  2836. onTouchedFn = () => void 0;
  2837. writeValue(value) {
  2838. this.setValue(value);
  2839. this.cdr.markForCheck();
  2840. }
  2841. registerOnChange(fn) {
  2842. this.onChangeFn = fn;
  2843. }
  2844. registerOnTouched(fn) {
  2845. this.onTouchedFn = fn;
  2846. }
  2847. setDisabledState(isDisabled) {
  2848. this.nzDisabled = (this.isNzDisableFirstChange && this.nzDisabled) || isDisabled;
  2849. this.cdr.markForCheck();
  2850. this.isNzDisableFirstChange = false;
  2851. }
  2852. // ------------------------------------------------------------------------
  2853. // | Internal methods
  2854. // ------------------------------------------------------------------------
  2855. // Reload locale from i18n with side effects
  2856. setLocale() {
  2857. this.nzLocale = this.i18n.getLocaleData('DatePicker', {});
  2858. this.setDefaultPlaceHolder();
  2859. this.cdr.markForCheck();
  2860. }
  2861. setDefaultPlaceHolder() {
  2862. if (!this.isCustomPlaceHolder && this.nzLocale) {
  2863. const defaultPlaceholder = {
  2864. year: this.getPropertyOfLocale('yearPlaceholder'),
  2865. quarter: this.getPropertyOfLocale('quarterPlaceholder'),
  2866. month: this.getPropertyOfLocale('monthPlaceholder'),
  2867. week: this.getPropertyOfLocale('weekPlaceholder'),
  2868. date: this.getPropertyOfLocale('placeholder')
  2869. };
  2870. const defaultRangePlaceholder = {
  2871. year: this.getPropertyOfLocale('rangeYearPlaceholder'),
  2872. quarter: this.getPropertyOfLocale('rangeQuarterPlaceholder'),
  2873. month: this.getPropertyOfLocale('rangeMonthPlaceholder'),
  2874. week: this.getPropertyOfLocale('rangeWeekPlaceholder'),
  2875. date: this.getPropertyOfLocale('rangePlaceholder')
  2876. };
  2877. this.nzPlaceHolder = this.isRange
  2878. ? defaultRangePlaceholder[this.nzMode]
  2879. : defaultPlaceholder[this.nzMode];
  2880. }
  2881. }
  2882. getPropertyOfLocale(type) {
  2883. return this.nzLocale.lang[type] || this.i18n.getLocaleData(`DatePicker.lang.${type}`);
  2884. }
  2885. // Safe way of setting value with default
  2886. setValue(value) {
  2887. const newValue = this.datePickerService.makeValue(value);
  2888. this.datePickerService.setValue(newValue);
  2889. this.datePickerService.initialValue = cloneDate(newValue);
  2890. this.cdr.detectChanges();
  2891. }
  2892. renderClass(value) {
  2893. // TODO: avoid autoFocus cause change after checked error
  2894. if (value) {
  2895. this.renderer.addClass(this.elementRef.nativeElement, 'ant-picker-focused');
  2896. }
  2897. else {
  2898. this.renderer.removeClass(this.elementRef.nativeElement, 'ant-picker-focused');
  2899. }
  2900. }
  2901. onPanelModeChange(panelChange) {
  2902. this.nzOnPanelChange.emit(panelChange);
  2903. }
  2904. // Emit nzOnCalendarChange when select date by nz-range-picker
  2905. onCalendarChange(value) {
  2906. if (this.isRange && Array.isArray(value)) {
  2907. const rangeValue = value.filter(x => x instanceof CandyDate).map(x => x.nativeDate);
  2908. this.nzOnCalendarChange.emit(rangeValue);
  2909. }
  2910. }
  2911. onResultOk() {
  2912. if (this.isRange) {
  2913. const value = this.datePickerService.value;
  2914. if (value.length) {
  2915. this.nzOnOk.emit([value[0]?.nativeDate || null, value[1]?.nativeDate || null]);
  2916. }
  2917. else {
  2918. this.nzOnOk.emit([]);
  2919. }
  2920. }
  2921. else {
  2922. if (this.datePickerService.value) {
  2923. this.nzOnOk.emit(this.datePickerService.value.nativeDate);
  2924. }
  2925. else {
  2926. this.nzOnOk.emit(null);
  2927. }
  2928. }
  2929. }
  2930. // status
  2931. setStatusStyles(status, hasFeedback) {
  2932. // set inner status
  2933. this.status = status;
  2934. this.hasFeedback = hasFeedback;
  2935. this.cdr.markForCheck();
  2936. // render status if nzStatus is set
  2937. this.statusCls = getStatusClassNames(this.prefixCls, status, hasFeedback);
  2938. Object.keys(this.statusCls).forEach(status => {
  2939. if (this.statusCls[status]) {
  2940. this.renderer.addClass(this.elementRef.nativeElement, status);
  2941. }
  2942. else {
  2943. this.renderer.removeClass(this.elementRef.nativeElement, status);
  2944. }
  2945. });
  2946. }
  2947. setPlacement(placement) {
  2948. const position = DATE_PICKER_POSITION_MAP[placement];
  2949. this.overlayPositions = [position, ...DEFAULT_DATE_PICKER_POSITIONS];
  2950. this.currentPositionX = position.originX;
  2951. this.currentPositionY = position.originY;
  2952. }
  2953. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzDatePickerComponent, deps: [{ token: i1$1.NzConfigService }, { token: DatePickerService }, { token: i1.NzI18nService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.DateHelperService }, { token: i4$1.NzResizeObserver }, { token: i5.Platform }, { token: i6.NzDestroyService }, { token: i7.Directionality }], target: i0.ɵɵFactoryTarget.Component });
  2954. static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: NzDatePickerComponent, isStandalone: true, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-quarter-picker,nz-year-picker,nz-range-picker", inputs: { nzAllowClear: ["nzAllowClear", "nzAllowClear", booleanAttribute], nzAutoFocus: ["nzAutoFocus", "nzAutoFocus", booleanAttribute], nzDisabled: ["nzDisabled", "nzDisabled", booleanAttribute], nzBorderless: ["nzBorderless", "nzBorderless", booleanAttribute], nzInputReadOnly: ["nzInputReadOnly", "nzInputReadOnly", booleanAttribute], nzInline: ["nzInline", "nzInline", booleanAttribute], nzOpen: ["nzOpen", "nzOpen", booleanAttribute], nzDisabledDate: "nzDisabledDate", nzLocale: "nzLocale", nzPlaceHolder: "nzPlaceHolder", nzPopupStyle: "nzPopupStyle", nzDropdownClassName: "nzDropdownClassName", nzSize: "nzSize", nzStatus: "nzStatus", nzFormat: "nzFormat", nzDateRender: "nzDateRender", nzDisabledTime: "nzDisabledTime", nzRenderExtraFooter: "nzRenderExtraFooter", nzShowToday: ["nzShowToday", "nzShowToday", booleanAttribute], nzMode: "nzMode", nzShowNow: ["nzShowNow", "nzShowNow", booleanAttribute], nzRanges: "nzRanges", nzDefaultPickerValue: "nzDefaultPickerValue", nzSeparator: "nzSeparator", nzSuffixIcon: "nzSuffixIcon", nzBackdrop: "nzBackdrop", nzId: "nzId", nzPlacement: "nzPlacement", nzShowWeekNumber: ["nzShowWeekNumber", "nzShowWeekNumber", booleanAttribute], nzShowTime: "nzShowTime" }, outputs: { nzOnPanelChange: "nzOnPanelChange", nzOnCalendarChange: "nzOnCalendarChange", nzOnOk: "nzOnOk", nzOnOpenChange: "nzOnOpenChange" }, host: { listeners: { "click": "onClickInputBox($event)" }, properties: { "class.ant-picker": "true", "class.ant-picker-range": "isRange", "class.ant-picker-large": "finalSize() === 'large'", "class.ant-picker-small": "finalSize() === 'small'", "class.ant-picker-disabled": "nzDisabled", "class.ant-picker-rtl": "dir === 'rtl'", "class.ant-picker-borderless": "nzBorderless", "class.ant-picker-inline": "nzInline" } }, providers: [
  2955. NzDestroyService,
  2956. DatePickerService,
  2957. { provide: NZ_SPACE_COMPACT_ITEM_TYPE, useValue: 'picker' },
  2958. {
  2959. provide: NG_VALUE_ACCESSOR,
  2960. multi: true,
  2961. useExisting: forwardRef(() => NzDatePickerComponent)
  2962. }
  2963. ], viewQueries: [{ propertyName: "cdkConnectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "panel", first: true, predicate: DateRangePopupComponent, descendants: true }, { propertyName: "separatorElement", first: true, predicate: ["separatorElement"], descendants: true }, { propertyName: "pickerInput", first: true, predicate: ["pickerInput"], descendants: true }, { propertyName: "rangePickerInputs", predicate: ["rangePickerInput"], descendants: true }], exportAs: ["nzDatePicker"], usesOnChanges: true, hostDirectives: [{ directive: i8.NzSpaceCompactItemDirective }], ngImport: i0, template: `
  2964. @if (!nzInline) {
  2965. @if (!isRange) {
  2966. <div class="{{ prefixCls }}-input">
  2967. <input
  2968. #pickerInput
  2969. [attr.id]="nzId"
  2970. [class.ant-input-disabled]="nzDisabled"
  2971. [disabled]="nzDisabled"
  2972. [readOnly]="nzInputReadOnly"
  2973. [(ngModel)]="inputValue"
  2974. placeholder="{{ getPlaceholder() }}"
  2975. [size]="inputSize"
  2976. autocomplete="off"
  2977. (focus)="onFocus($event)"
  2978. (focusout)="onFocusout($event)"
  2979. (ngModelChange)="onInputChange($event)"
  2980. (keyup.enter)="onKeyupEnter($event)"
  2981. />
  2982. <ng-container *ngTemplateOutlet="tplRightRest" />
  2983. </div>
  2984. } @else {
  2985. <div class="{{ prefixCls }}-input">
  2986. <ng-container *ngTemplateOutlet="tplRangeInput; context: { partType: 'left' }" />
  2987. </div>
  2988. <div #separatorElement class="{{ prefixCls }}-range-separator">
  2989. <span class="{{ prefixCls }}-separator">
  2990. <ng-container *nzStringTemplateOutlet="nzSeparator; let separator">
  2991. @if (nzSeparator) {
  2992. {{ nzSeparator }}
  2993. } @else {
  2994. <nz-icon nzType="swap-right" nzTheme="outline" />
  2995. }
  2996. </ng-container>
  2997. </span>
  2998. </div>
  2999. <div class="{{ prefixCls }}-input">
  3000. <ng-container *ngTemplateOutlet="tplRangeInput; context: { partType: 'right' }" />
  3001. </div>
  3002. <ng-container *ngTemplateOutlet="tplRightRest" />
  3003. }
  3004. } @else {
  3005. <ng-template [ngTemplateOutlet]="inlineMode" />
  3006. }
  3007. <!-- Input for Range ONLY -->
  3008. <ng-template #tplRangeInput let-partType="partType">
  3009. <input
  3010. #rangePickerInput
  3011. [attr.id]="nzId"
  3012. [disabled]="nzDisabled"
  3013. [readOnly]="nzInputReadOnly"
  3014. [size]="inputSize"
  3015. autocomplete="off"
  3016. (click)="onClickInputBox($event)"
  3017. (focusout)="onFocusout($event)"
  3018. (focus)="onFocus($event, partType)"
  3019. (keyup.enter)="onKeyupEnter($event)"
  3020. [(ngModel)]="inputValue[datePickerService.getActiveIndex(partType)]"
  3021. (ngModelChange)="onInputChange($event)"
  3022. placeholder="{{ getPlaceholder(partType) }}"
  3023. />
  3024. </ng-template>
  3025. <!-- Right operator icons -->
  3026. <ng-template #tplRightRest>
  3027. <div class="{{ prefixCls }}-active-bar" [style]="activeBarStyle"></div>
  3028. @if (showClear) {
  3029. <span class="{{ prefixCls }}-clear" (click)="onClickClear($event)">
  3030. <nz-icon nzType="close-circle" nzTheme="fill" />
  3031. </span>
  3032. }
  3033. <span class="{{ prefixCls }}-suffix">
  3034. <ng-container *nzStringTemplateOutlet="nzSuffixIcon; let suffixIcon">
  3035. <nz-icon [nzType]="suffixIcon" />
  3036. </ng-container>
  3037. @if (hasFeedback && !!status) {
  3038. <nz-form-item-feedback-icon [status]="status" />
  3039. }
  3040. </span>
  3041. </ng-template>
  3042. <ng-template #inlineMode>
  3043. <div
  3044. class="{{ prefixCls }}-dropdown {{ nzDropdownClassName }}"
  3045. [class.ant-picker-dropdown-rtl]="dir === 'rtl'"
  3046. [class.ant-picker-dropdown-placement-bottomLeft]="currentPositionY === 'bottom' && currentPositionX === 'start'"
  3047. [class.ant-picker-dropdown-placement-topLeft]="currentPositionY === 'top' && currentPositionX === 'start'"
  3048. [class.ant-picker-dropdown-placement-bottomRight]="currentPositionY === 'bottom' && currentPositionX === 'end'"
  3049. [class.ant-picker-dropdown-placement-topRight]="currentPositionY === 'top' && currentPositionX === 'end'"
  3050. [class.ant-picker-dropdown-range]="isRange"
  3051. [class.ant-picker-active-left]="datePickerService.activeInput === 'left'"
  3052. [class.ant-picker-active-right]="datePickerService.activeInput === 'right'"
  3053. [style]="nzPopupStyle"
  3054. >
  3055. <date-range-popup
  3056. [isRange]="isRange"
  3057. [inline]="nzInline"
  3058. [defaultPickerValue]="nzDefaultPickerValue"
  3059. [showWeek]="nzShowWeekNumber || nzMode === 'week'"
  3060. [panelMode]="panelMode"
  3061. (panelModeChange)="onPanelModeChange($event)"
  3062. (calendarChange)="onCalendarChange($event)"
  3063. [locale]="nzLocale?.lang!"
  3064. [showToday]="nzMode === 'date' && nzShowToday && !isRange && !nzShowTime"
  3065. [showNow]="nzMode === 'date' && nzShowNow && !isRange && !!nzShowTime"
  3066. [showTime]="nzShowTime"
  3067. [dateRender]="nzDateRender"
  3068. [disabledDate]="nzDisabledDate"
  3069. [disabledTime]="nzDisabledTime"
  3070. [extraFooter]="extraFooter"
  3071. [ranges]="nzRanges"
  3072. [dir]="dir"
  3073. [format]="nzFormat"
  3074. (resultOk)="onResultOk()"
  3075. />
  3076. </div>
  3077. </ng-template>
  3078. <!-- Overlay -->
  3079. <ng-template
  3080. cdkConnectedOverlay
  3081. nzConnectedOverlay
  3082. [cdkConnectedOverlayHasBackdrop]="nzBackdrop"
  3083. [cdkConnectedOverlayOrigin]="origin"
  3084. [cdkConnectedOverlayOpen]="realOpenState"
  3085. [cdkConnectedOverlayPositions]="overlayPositions"
  3086. [cdkConnectedOverlayTransformOriginOn]="'.ant-picker-wrapper'"
  3087. (positionChange)="onPositionChange($event)"
  3088. (detach)="close()"
  3089. (overlayKeydown)="onOverlayKeydown($event)"
  3090. >
  3091. <div
  3092. class="ant-picker-wrapper"
  3093. [nzNoAnimation]="!!noAnimation?.nzNoAnimation"
  3094. [@slideMotion]="'enter'"
  3095. [style.position]="'relative'"
  3096. >
  3097. <ng-container *ngTemplateOutlet="inlineMode"></ng-container>
  3098. </div>
  3099. </ng-template>
  3100. `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzOutletModule }, { kind: "directive", type: i10.NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i11$1.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: NzFormItemFeedbackIconComponent, selector: "nz-form-item-feedback-icon", inputs: ["status"], exportAs: ["nzFormFeedbackIcon"] }, { kind: "component", type: DateRangePopupComponent, selector: "date-range-popup", inputs: ["isRange", "inline", "showWeek", "locale", "disabledDate", "disabledTime", "showToday", "showNow", "showTime", "extraFooter", "ranges", "dateRender", "panelMode", "defaultPickerValue", "dir", "format"], outputs: ["panelModeChange", "calendarChange", "resultOk"], exportAs: ["dateRangePopup"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: NzOverlayModule }, { kind: "directive", type: i12.NzConnectedOverlayDirective, selector: "[cdkConnectedOverlay][nzConnectedOverlay]", inputs: ["nzArrowPointAtCenter"], exportAs: ["nzConnectedOverlay"] }, { kind: "directive", type: NzNoAnimationDirective, selector: "[nzNoAnimation]", inputs: ["nzNoAnimation"], exportAs: ["nzNoAnimation"] }], animations: [slideMotion], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
  3101. };
  3102. })();
  3103. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzDatePickerComponent, decorators: [{
  3104. type: Component,
  3105. args: [{
  3106. encapsulation: ViewEncapsulation.None,
  3107. changeDetection: ChangeDetectionStrategy.OnPush,
  3108. selector: 'nz-date-picker,nz-week-picker,nz-month-picker,nz-quarter-picker,nz-year-picker,nz-range-picker',
  3109. exportAs: 'nzDatePicker',
  3110. template: `
  3111. @if (!nzInline) {
  3112. @if (!isRange) {
  3113. <div class="{{ prefixCls }}-input">
  3114. <input
  3115. #pickerInput
  3116. [attr.id]="nzId"
  3117. [class.ant-input-disabled]="nzDisabled"
  3118. [disabled]="nzDisabled"
  3119. [readOnly]="nzInputReadOnly"
  3120. [(ngModel)]="inputValue"
  3121. placeholder="{{ getPlaceholder() }}"
  3122. [size]="inputSize"
  3123. autocomplete="off"
  3124. (focus)="onFocus($event)"
  3125. (focusout)="onFocusout($event)"
  3126. (ngModelChange)="onInputChange($event)"
  3127. (keyup.enter)="onKeyupEnter($event)"
  3128. />
  3129. <ng-container *ngTemplateOutlet="tplRightRest" />
  3130. </div>
  3131. } @else {
  3132. <div class="{{ prefixCls }}-input">
  3133. <ng-container *ngTemplateOutlet="tplRangeInput; context: { partType: 'left' }" />
  3134. </div>
  3135. <div #separatorElement class="{{ prefixCls }}-range-separator">
  3136. <span class="{{ prefixCls }}-separator">
  3137. <ng-container *nzStringTemplateOutlet="nzSeparator; let separator">
  3138. @if (nzSeparator) {
  3139. {{ nzSeparator }}
  3140. } @else {
  3141. <nz-icon nzType="swap-right" nzTheme="outline" />
  3142. }
  3143. </ng-container>
  3144. </span>
  3145. </div>
  3146. <div class="{{ prefixCls }}-input">
  3147. <ng-container *ngTemplateOutlet="tplRangeInput; context: { partType: 'right' }" />
  3148. </div>
  3149. <ng-container *ngTemplateOutlet="tplRightRest" />
  3150. }
  3151. } @else {
  3152. <ng-template [ngTemplateOutlet]="inlineMode" />
  3153. }
  3154. <!-- Input for Range ONLY -->
  3155. <ng-template #tplRangeInput let-partType="partType">
  3156. <input
  3157. #rangePickerInput
  3158. [attr.id]="nzId"
  3159. [disabled]="nzDisabled"
  3160. [readOnly]="nzInputReadOnly"
  3161. [size]="inputSize"
  3162. autocomplete="off"
  3163. (click)="onClickInputBox($event)"
  3164. (focusout)="onFocusout($event)"
  3165. (focus)="onFocus($event, partType)"
  3166. (keyup.enter)="onKeyupEnter($event)"
  3167. [(ngModel)]="inputValue[datePickerService.getActiveIndex(partType)]"
  3168. (ngModelChange)="onInputChange($event)"
  3169. placeholder="{{ getPlaceholder(partType) }}"
  3170. />
  3171. </ng-template>
  3172. <!-- Right operator icons -->
  3173. <ng-template #tplRightRest>
  3174. <div class="{{ prefixCls }}-active-bar" [style]="activeBarStyle"></div>
  3175. @if (showClear) {
  3176. <span class="{{ prefixCls }}-clear" (click)="onClickClear($event)">
  3177. <nz-icon nzType="close-circle" nzTheme="fill" />
  3178. </span>
  3179. }
  3180. <span class="{{ prefixCls }}-suffix">
  3181. <ng-container *nzStringTemplateOutlet="nzSuffixIcon; let suffixIcon">
  3182. <nz-icon [nzType]="suffixIcon" />
  3183. </ng-container>
  3184. @if (hasFeedback && !!status) {
  3185. <nz-form-item-feedback-icon [status]="status" />
  3186. }
  3187. </span>
  3188. </ng-template>
  3189. <ng-template #inlineMode>
  3190. <div
  3191. class="{{ prefixCls }}-dropdown {{ nzDropdownClassName }}"
  3192. [class.ant-picker-dropdown-rtl]="dir === 'rtl'"
  3193. [class.ant-picker-dropdown-placement-bottomLeft]="currentPositionY === 'bottom' && currentPositionX === 'start'"
  3194. [class.ant-picker-dropdown-placement-topLeft]="currentPositionY === 'top' && currentPositionX === 'start'"
  3195. [class.ant-picker-dropdown-placement-bottomRight]="currentPositionY === 'bottom' && currentPositionX === 'end'"
  3196. [class.ant-picker-dropdown-placement-topRight]="currentPositionY === 'top' && currentPositionX === 'end'"
  3197. [class.ant-picker-dropdown-range]="isRange"
  3198. [class.ant-picker-active-left]="datePickerService.activeInput === 'left'"
  3199. [class.ant-picker-active-right]="datePickerService.activeInput === 'right'"
  3200. [style]="nzPopupStyle"
  3201. >
  3202. <date-range-popup
  3203. [isRange]="isRange"
  3204. [inline]="nzInline"
  3205. [defaultPickerValue]="nzDefaultPickerValue"
  3206. [showWeek]="nzShowWeekNumber || nzMode === 'week'"
  3207. [panelMode]="panelMode"
  3208. (panelModeChange)="onPanelModeChange($event)"
  3209. (calendarChange)="onCalendarChange($event)"
  3210. [locale]="nzLocale?.lang!"
  3211. [showToday]="nzMode === 'date' && nzShowToday && !isRange && !nzShowTime"
  3212. [showNow]="nzMode === 'date' && nzShowNow && !isRange && !!nzShowTime"
  3213. [showTime]="nzShowTime"
  3214. [dateRender]="nzDateRender"
  3215. [disabledDate]="nzDisabledDate"
  3216. [disabledTime]="nzDisabledTime"
  3217. [extraFooter]="extraFooter"
  3218. [ranges]="nzRanges"
  3219. [dir]="dir"
  3220. [format]="nzFormat"
  3221. (resultOk)="onResultOk()"
  3222. />
  3223. </div>
  3224. </ng-template>
  3225. <!-- Overlay -->
  3226. <ng-template
  3227. cdkConnectedOverlay
  3228. nzConnectedOverlay
  3229. [cdkConnectedOverlayHasBackdrop]="nzBackdrop"
  3230. [cdkConnectedOverlayOrigin]="origin"
  3231. [cdkConnectedOverlayOpen]="realOpenState"
  3232. [cdkConnectedOverlayPositions]="overlayPositions"
  3233. [cdkConnectedOverlayTransformOriginOn]="'.ant-picker-wrapper'"
  3234. (positionChange)="onPositionChange($event)"
  3235. (detach)="close()"
  3236. (overlayKeydown)="onOverlayKeydown($event)"
  3237. >
  3238. <div
  3239. class="ant-picker-wrapper"
  3240. [nzNoAnimation]="!!noAnimation?.nzNoAnimation"
  3241. [@slideMotion]="'enter'"
  3242. [style.position]="'relative'"
  3243. >
  3244. <ng-container *ngTemplateOutlet="inlineMode"></ng-container>
  3245. </div>
  3246. </ng-template>
  3247. `,
  3248. host: {
  3249. '[class.ant-picker]': `true`,
  3250. '[class.ant-picker-range]': `isRange`,
  3251. '[class.ant-picker-large]': `finalSize() === 'large'`,
  3252. '[class.ant-picker-small]': `finalSize() === 'small'`,
  3253. '[class.ant-picker-disabled]': `nzDisabled`,
  3254. '[class.ant-picker-rtl]': `dir === 'rtl'`,
  3255. '[class.ant-picker-borderless]': `nzBorderless`,
  3256. '[class.ant-picker-inline]': `nzInline`,
  3257. '(click)': 'onClickInputBox($event)'
  3258. },
  3259. hostDirectives: [NzSpaceCompactItemDirective],
  3260. providers: [
  3261. NzDestroyService,
  3262. DatePickerService,
  3263. { provide: NZ_SPACE_COMPACT_ITEM_TYPE, useValue: 'picker' },
  3264. {
  3265. provide: NG_VALUE_ACCESSOR,
  3266. multi: true,
  3267. useExisting: forwardRef(() => NzDatePickerComponent)
  3268. }
  3269. ],
  3270. animations: [slideMotion],
  3271. imports: [
  3272. FormsModule,
  3273. NgTemplateOutlet,
  3274. NzOutletModule,
  3275. NzIconModule,
  3276. NzFormItemFeedbackIconComponent,
  3277. DateRangePopupComponent,
  3278. CdkConnectedOverlay,
  3279. NzOverlayModule,
  3280. NzNoAnimationDirective
  3281. ]
  3282. }]
  3283. }], ctorParameters: () => [{ type: i1$1.NzConfigService }, { type: DatePickerService }, { type: i1.NzI18nService }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DateHelperService }, { type: i4$1.NzResizeObserver }, { type: i5.Platform }, { type: i6.NzDestroyService }, { type: i7.Directionality }], propDecorators: { nzAllowClear: [{
  3284. type: Input,
  3285. args: [{ transform: booleanAttribute }]
  3286. }], nzAutoFocus: [{
  3287. type: Input,
  3288. args: [{ transform: booleanAttribute }]
  3289. }], nzDisabled: [{
  3290. type: Input,
  3291. args: [{ transform: booleanAttribute }]
  3292. }], nzBorderless: [{
  3293. type: Input,
  3294. args: [{ transform: booleanAttribute }]
  3295. }], nzInputReadOnly: [{
  3296. type: Input,
  3297. args: [{ transform: booleanAttribute }]
  3298. }], nzInline: [{
  3299. type: Input,
  3300. args: [{ transform: booleanAttribute }]
  3301. }], nzOpen: [{
  3302. type: Input,
  3303. args: [{ transform: booleanAttribute }]
  3304. }], nzDisabledDate: [{
  3305. type: Input
  3306. }], nzLocale: [{
  3307. type: Input
  3308. }], nzPlaceHolder: [{
  3309. type: Input
  3310. }], nzPopupStyle: [{
  3311. type: Input
  3312. }], nzDropdownClassName: [{
  3313. type: Input
  3314. }], nzSize: [{
  3315. type: Input
  3316. }], nzStatus: [{
  3317. type: Input
  3318. }], nzFormat: [{
  3319. type: Input
  3320. }], nzDateRender: [{
  3321. type: Input
  3322. }], nzDisabledTime: [{
  3323. type: Input
  3324. }], nzRenderExtraFooter: [{
  3325. type: Input
  3326. }], nzShowToday: [{
  3327. type: Input,
  3328. args: [{ transform: booleanAttribute }]
  3329. }], nzMode: [{
  3330. type: Input
  3331. }], nzShowNow: [{
  3332. type: Input,
  3333. args: [{ transform: booleanAttribute }]
  3334. }], nzRanges: [{
  3335. type: Input
  3336. }], nzDefaultPickerValue: [{
  3337. type: Input
  3338. }], nzSeparator: [{
  3339. type: Input
  3340. }], nzSuffixIcon: [{
  3341. type: Input
  3342. }], nzBackdrop: [{
  3343. type: Input
  3344. }], nzId: [{
  3345. type: Input
  3346. }], nzPlacement: [{
  3347. type: Input
  3348. }], nzShowWeekNumber: [{
  3349. type: Input,
  3350. args: [{ transform: booleanAttribute }]
  3351. }], nzOnPanelChange: [{
  3352. type: Output
  3353. }], nzOnCalendarChange: [{
  3354. type: Output
  3355. }], nzOnOk: [{
  3356. type: Output
  3357. }], nzOnOpenChange: [{
  3358. type: Output
  3359. }], nzShowTime: [{
  3360. type: Input
  3361. }], cdkConnectedOverlay: [{
  3362. type: ViewChild,
  3363. args: [CdkConnectedOverlay, { static: false }]
  3364. }], panel: [{
  3365. type: ViewChild,
  3366. args: [DateRangePopupComponent, { static: false }]
  3367. }], separatorElement: [{
  3368. type: ViewChild,
  3369. args: ['separatorElement', { static: false }]
  3370. }], pickerInput: [{
  3371. type: ViewChild,
  3372. args: ['pickerInput', { static: false }]
  3373. }], rangePickerInputs: [{
  3374. type: ViewChildren,
  3375. args: ['rangePickerInput']
  3376. }] } });
  3377. /**
  3378. * Use of this source code is governed by an MIT-style license that can be
  3379. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3380. */
  3381. class NzMonthPickerComponent {
  3382. datePicker = inject(NzDatePickerComponent, { host: true });
  3383. constructor() {
  3384. this.datePicker.nzMode = 'month';
  3385. }
  3386. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzMonthPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  3387. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: NzMonthPickerComponent, isStandalone: true, selector: "nz-month-picker", exportAs: ["nzMonthPicker"], ngImport: i0 });
  3388. }
  3389. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzMonthPickerComponent, decorators: [{
  3390. type: Directive,
  3391. args: [{
  3392. selector: 'nz-month-picker',
  3393. exportAs: 'nzMonthPicker'
  3394. }]
  3395. }], ctorParameters: () => [] });
  3396. /**
  3397. * Use of this source code is governed by an MIT-style license that can be
  3398. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3399. */
  3400. class NzQuarterPickerComponent {
  3401. datePicker = inject(NzDatePickerComponent, { host: true });
  3402. constructor() {
  3403. this.datePicker.nzMode = 'quarter';
  3404. }
  3405. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzQuarterPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  3406. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: NzQuarterPickerComponent, isStandalone: true, selector: "nz-quarter-picker", exportAs: ["nzQuarterPicker"], ngImport: i0 });
  3407. }
  3408. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzQuarterPickerComponent, decorators: [{
  3409. type: Directive,
  3410. args: [{
  3411. selector: 'nz-quarter-picker',
  3412. exportAs: 'nzQuarterPicker'
  3413. }]
  3414. }], ctorParameters: () => [] });
  3415. /**
  3416. * Use of this source code is governed by an MIT-style license that can be
  3417. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3418. */
  3419. class NzRangePickerComponent {
  3420. datePicker = inject(NzDatePickerComponent, { host: true });
  3421. constructor() {
  3422. this.datePicker.isRange = true;
  3423. }
  3424. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  3425. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: NzRangePickerComponent, isStandalone: true, selector: "nz-range-picker", exportAs: ["nzRangePicker"], ngImport: i0 });
  3426. }
  3427. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzRangePickerComponent, decorators: [{
  3428. type: Directive,
  3429. args: [{
  3430. selector: 'nz-range-picker',
  3431. exportAs: 'nzRangePicker'
  3432. }]
  3433. }], ctorParameters: () => [] });
  3434. /**
  3435. * Use of this source code is governed by an MIT-style license that can be
  3436. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3437. */
  3438. class NzWeekPickerComponent {
  3439. datePicker = inject(NzDatePickerComponent, { host: true });
  3440. constructor() {
  3441. this.datePicker.nzMode = 'week';
  3442. }
  3443. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzWeekPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  3444. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: NzWeekPickerComponent, isStandalone: true, selector: "nz-week-picker", exportAs: ["nzWeekPicker"], ngImport: i0 });
  3445. }
  3446. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzWeekPickerComponent, decorators: [{
  3447. type: Directive,
  3448. args: [{
  3449. selector: 'nz-week-picker',
  3450. exportAs: 'nzWeekPicker'
  3451. }]
  3452. }], ctorParameters: () => [] });
  3453. /**
  3454. * Use of this source code is governed by an MIT-style license that can be
  3455. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3456. */
  3457. class NzYearPickerComponent {
  3458. datePicker = inject(NzDatePickerComponent, { host: true });
  3459. constructor() {
  3460. this.datePicker.nzMode = 'year';
  3461. }
  3462. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzYearPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
  3463. static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: NzYearPickerComponent, isStandalone: true, selector: "nz-year-picker", exportAs: ["nzYearPicker"], ngImport: i0 });
  3464. }
  3465. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzYearPickerComponent, decorators: [{
  3466. type: Directive,
  3467. args: [{
  3468. selector: 'nz-year-picker',
  3469. exportAs: 'nzYearPicker'
  3470. }]
  3471. }], ctorParameters: () => [] });
  3472. /**
  3473. * Use of this source code is governed by an MIT-style license that can be
  3474. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3475. */
  3476. class NzDatePickerModule {
  3477. static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzDatePickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
  3478. static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: NzDatePickerModule, imports: [NzDatePickerComponent,
  3479. NzMonthPickerComponent,
  3480. NzYearPickerComponent,
  3481. NzWeekPickerComponent,
  3482. NzRangePickerComponent,
  3483. CalendarFooterComponent,
  3484. InnerPopupComponent,
  3485. DateRangePopupComponent,
  3486. NzQuarterPickerComponent], exports: [NzDatePickerComponent,
  3487. NzRangePickerComponent,
  3488. NzMonthPickerComponent,
  3489. NzYearPickerComponent,
  3490. NzWeekPickerComponent,
  3491. NzQuarterPickerComponent] });
  3492. static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzDatePickerModule, imports: [NzDatePickerComponent,
  3493. CalendarFooterComponent,
  3494. InnerPopupComponent,
  3495. DateRangePopupComponent] });
  3496. }
  3497. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NzDatePickerModule, decorators: [{
  3498. type: NgModule,
  3499. args: [{
  3500. imports: [
  3501. NzDatePickerComponent,
  3502. NzMonthPickerComponent,
  3503. NzYearPickerComponent,
  3504. NzWeekPickerComponent,
  3505. NzRangePickerComponent,
  3506. CalendarFooterComponent,
  3507. InnerPopupComponent,
  3508. DateRangePopupComponent,
  3509. NzQuarterPickerComponent
  3510. ],
  3511. exports: [
  3512. NzDatePickerComponent,
  3513. NzRangePickerComponent,
  3514. NzMonthPickerComponent,
  3515. NzYearPickerComponent,
  3516. NzWeekPickerComponent,
  3517. NzQuarterPickerComponent
  3518. ]
  3519. }]
  3520. }] });
  3521. /**
  3522. * Use of this source code is governed by an MIT-style license that can be
  3523. * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
  3524. */
  3525. /**
  3526. * Generated bundle index. Do not edit.
  3527. */
  3528. export { LibPackerModule, NzDatePickerComponent, NzDatePickerModule, NzMonthPickerComponent, NzQuarterPickerComponent, NzRangePickerComponent, NzWeekPickerComponent, NzYearPickerComponent, PREFIX_CLASS, getTimeConfig, isAllowedDate, isTimeValid, isTimeValidByConfig, transCompatFormat, AbstractPanelHeader as ɵAbstractPanelHeader, AbstractTable as ɵAbstractTable, CalendarFooterComponent as ɵCalendarFooterComponent, DateHeaderComponent as ɵDateHeaderComponent, DatePickerService as ɵDatePickerService, DateRangePopupComponent as ɵDateRangePopupComponent, DateTableComponent as ɵDateTableComponent, DecadeHeaderComponent as ɵDecadeHeaderComponent, DecadeTableComponent as ɵDecadeTableComponent, InnerPopupComponent as ɵInnerPopupComponent, MonthHeaderComponent as ɵMonthHeaderComponent, MonthTableComponent as ɵMonthTableComponent, QuarterHeaderComponent as ɵQuarterHeaderComponent, QuarterTableComponent as ɵQuarterTableComponent, YearHeaderComponent as ɵYearHeaderComponent, YearTableComponent as ɵYearTableComponent };
  3529. //# sourceMappingURL=ng-zorro-antd-date-picker.mjs.map