123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204 |
- import {
- D,
- G,
- _,
- d,
- i,
- j,
- l,
- x,
- y
- } from "./chunk-PTVH4XAB.js";
- // node_modules/.pnpm/preact@10.12.1/node_modules/preact/hooks/dist/hooks.module.js
- var t;
- var r;
- var u;
- var i2;
- var f = [];
- var c = [];
- var e = l.__b;
- var a = l.__r;
- var v = l.diffed;
- var l2 = l.__c;
- var m = l.unmount;
- function b() {
- for (var t2; t2 = f.shift(); )
- if (t2.__P && t2.__H)
- try {
- t2.__H.__h.forEach(k), t2.__H.__h.forEach(w), t2.__H.__h = [];
- } catch (r2) {
- t2.__H.__h = [], l.__e(r2, t2.__v);
- }
- }
- l.__b = function(n) {
- r = null, e && e(n);
- }, l.__r = function(n) {
- a && a(n), t = 0;
- var i3 = (r = n.__c).__H;
- i3 && (u === r ? (i3.__h = [], r.__h = [], i3.__.forEach(function(n2) {
- n2.__N && (n2.__ = n2.__N), n2.__V = c, n2.__N = n2.i = void 0;
- })) : (i3.__h.forEach(k), i3.__h.forEach(w), i3.__h = [])), u = r;
- }, l.diffed = function(t2) {
- v && v(t2);
- var o = t2.__c;
- o && o.__H && (o.__H.__h.length && (1 !== f.push(o) && i2 === l.requestAnimationFrame || ((i2 = l.requestAnimationFrame) || j2)(b)), o.__H.__.forEach(function(n) {
- n.i && (n.__H = n.i), n.__V !== c && (n.__ = n.__V), n.i = void 0, n.__V = c;
- })), u = r = null;
- }, l.__c = function(t2, r2) {
- r2.some(function(t3) {
- try {
- t3.__h.forEach(k), t3.__h = t3.__h.filter(function(n) {
- return !n.__ || w(n);
- });
- } catch (u2) {
- r2.some(function(n) {
- n.__h && (n.__h = []);
- }), r2 = [], l.__e(u2, t3.__v);
- }
- }), l2 && l2(t2, r2);
- }, l.unmount = function(t2) {
- m && m(t2);
- var r2, u2 = t2.__c;
- u2 && u2.__H && (u2.__H.__.forEach(function(n) {
- try {
- k(n);
- } catch (n2) {
- r2 = n2;
- }
- }), u2.__H = void 0, r2 && l.__e(r2, u2.__v));
- };
- var g = "function" == typeof requestAnimationFrame;
- function j2(n) {
- var t2, r2 = function() {
- clearTimeout(u2), g && cancelAnimationFrame(t2), setTimeout(n);
- }, u2 = setTimeout(r2, 100);
- g && (t2 = requestAnimationFrame(r2));
- }
- function k(n) {
- var t2 = r, u2 = n.__c;
- "function" == typeof u2 && (n.__c = void 0, u2()), r = t2;
- }
- function w(n) {
- var t2 = r;
- n.__c = n.__(), r = t2;
- }
- // node_modules/.pnpm/preact@10.12.1/node_modules/preact/compat/dist/compat.module.js
- function g2(n, t2) {
- for (var e2 in t2)
- n[e2] = t2[e2];
- return n;
- }
- function C(n, t2) {
- for (var e2 in n)
- if ("__source" !== e2 && !(e2 in t2))
- return true;
- for (var r2 in t2)
- if ("__source" !== r2 && n[r2] !== t2[r2])
- return true;
- return false;
- }
- function w2(n) {
- this.props = n;
- }
- (w2.prototype = new x()).isPureReactComponent = true, w2.prototype.shouldComponentUpdate = function(n, t2) {
- return C(this.props, n) || C(this.state, t2);
- };
- var x3 = l.__b;
- l.__b = function(n) {
- n.type && n.type.__f && n.ref && (n.props.ref = n.ref, n.ref = null), x3 && x3(n);
- };
- var N = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.forward_ref") || 3911;
- var T2 = l.__e;
- l.__e = function(n, t2, e2, r2) {
- if (n.then) {
- for (var u2, o = t2; o = o.__; )
- if ((u2 = o.__c) && u2.__c)
- return null == t2.__e && (t2.__e = e2.__e, t2.__k = e2.__k), u2.__c(n, t2);
- }
- T2(n, t2, e2, r2);
- };
- var I = l.unmount;
- function L(n, t2, e2) {
- return n && (n.__c && n.__c.__H && (n.__c.__H.__.forEach(function(n2) {
- "function" == typeof n2.__c && n2.__c();
- }), n.__c.__H = null), null != (n = g2({}, n)).__c && (n.__c.__P === e2 && (n.__c.__P = t2), n.__c = null), n.__k = n.__k && n.__k.map(function(n2) {
- return L(n2, t2, e2);
- })), n;
- }
- function U(n, t2, e2) {
- return n && (n.__v = null, n.__k = n.__k && n.__k.map(function(n2) {
- return U(n2, t2, e2);
- }), n.__c && n.__c.__P === t2 && (n.__e && e2.insertBefore(n.__e, n.__d), n.__c.__e = true, n.__c.__P = e2)), n;
- }
- function D2() {
- this.__u = 0, this.t = null, this.__b = null;
- }
- function F3(n) {
- var t2 = n.__.__c;
- return t2 && t2.__a && t2.__a(n);
- }
- function V2() {
- this.u = null, this.o = null;
- }
- l.unmount = function(n) {
- var t2 = n.__c;
- t2 && t2.__R && t2.__R(), t2 && true === n.__h && (n.type = null), I && I(n);
- }, (D2.prototype = new x()).__c = function(n, t2) {
- var e2 = t2.__c, r2 = this;
- null == r2.t && (r2.t = []), r2.t.push(e2);
- var u2 = F3(r2.__v), o = false, i3 = function() {
- o || (o = true, e2.__R = null, u2 ? u2(l3) : l3());
- };
- e2.__R = i3;
- var l3 = function() {
- if (!--r2.__u) {
- if (r2.state.__a) {
- var n2 = r2.state.__a;
- r2.__v.__k[0] = U(n2, n2.__c.__P, n2.__c.__O);
- }
- var t3;
- for (r2.setState({ __a: r2.__b = null }); t3 = r2.t.pop(); )
- t3.forceUpdate();
- }
- }, c2 = true === t2.__h;
- r2.__u++ || c2 || r2.setState({ __a: r2.__b = r2.__v.__k[0] }), n.then(i3, i3);
- }, D2.prototype.componentWillUnmount = function() {
- this.t = [];
- }, D2.prototype.render = function(n, e2) {
- if (this.__b) {
- if (this.__v.__k) {
- var r2 = document.createElement("div"), o = this.__v.__k[0].__c;
- this.__v.__k[0] = L(this.__b, r2, o.__O = o.__P);
- }
- this.__b = null;
- }
- var i3 = e2.__a && y(_, null, n.fallback);
- return i3 && (i3.__h = null), [y(_, null, e2.__a ? null : n.children), i3];
- };
- var W = function(n, t2, e2) {
- if (++e2[1] === e2[0] && n.o.delete(t2), n.props.revealOrder && ("t" !== n.props.revealOrder[0] || !n.o.size))
- for (e2 = n.u; e2; ) {
- for (; e2.length > 3; )
- e2.pop()();
- if (e2[1] < e2[0])
- break;
- n.u = e2 = e2[2];
- }
- };
- function P(n) {
- return this.getChildContext = function() {
- return n.context;
- }, n.children;
- }
- function $(n) {
- var e2 = this, r2 = n.i;
- e2.componentWillUnmount = function() {
- D(null, e2.l), e2.l = null, e2.i = null;
- }, e2.i && e2.i !== r2 && e2.componentWillUnmount(), n.__v ? (e2.l || (e2.i = r2, e2.l = { nodeType: 1, parentNode: r2, childNodes: [], appendChild: function(n2) {
- this.childNodes.push(n2), e2.i.appendChild(n2);
- }, insertBefore: function(n2, t2) {
- this.childNodes.push(n2), e2.i.appendChild(n2);
- }, removeChild: function(n2) {
- this.childNodes.splice(this.childNodes.indexOf(n2) >>> 1, 1), e2.i.removeChild(n2);
- } }), D(y(P, { context: e2.context }, n.__v), e2.l)) : e2.l && e2.componentWillUnmount();
- }
- function j3(n, e2) {
- var r2 = y($, { __v: n, i: e2 });
- return r2.containerInfo = e2, r2;
- }
- (V2.prototype = new x()).__a = function(n) {
- var t2 = this, e2 = F3(t2.__v), r2 = t2.o.get(n);
- return r2[0]++, function(u2) {
- var o = function() {
- t2.props.revealOrder ? (r2.push(u2), W(t2, n, r2)) : u2();
- };
- e2 ? e2(o) : o();
- };
- }, V2.prototype.render = function(n) {
- this.u = null, this.o = /* @__PURE__ */ new Map();
- var t2 = j(n.children);
- n.revealOrder && "b" === n.revealOrder[0] && t2.reverse();
- for (var e2 = t2.length; e2--; )
- this.o.set(t2[e2], this.u = [1, 0, this.u]);
- return n.children;
- }, V2.prototype.componentDidUpdate = V2.prototype.componentDidMount = function() {
- var n = this;
- this.o.forEach(function(t2, e2) {
- W(n, e2, t2);
- });
- };
- var z = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103;
- var B = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/;
- var H = "undefined" != typeof document;
- var Z = function(n) {
- return ("undefined" != typeof Symbol && "symbol" == typeof Symbol() ? /fil|che|rad/i : /fil|che|ra/i).test(n);
- };
- x.prototype.isReactComponent = {}, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t2) {
- Object.defineProperty(x.prototype, t2, { configurable: true, get: function() {
- return this["UNSAFE_" + t2];
- }, set: function(n) {
- Object.defineProperty(this, t2, { configurable: true, writable: true, value: n });
- } });
- });
- var G2 = l.event;
- function J() {
- }
- function K() {
- return this.cancelBubble;
- }
- function Q() {
- return this.defaultPrevented;
- }
- l.event = function(n) {
- return G2 && (n = G2(n)), n.persist = J, n.isPropagationStopped = K, n.isDefaultPrevented = Q, n.nativeEvent = n;
- };
- var X;
- var nn = { configurable: true, get: function() {
- return this.class;
- } };
- var tn = l.vnode;
- l.vnode = function(n) {
- var t2 = n.type, e2 = n.props, u2 = e2;
- if ("string" == typeof t2) {
- var o = -1 === t2.indexOf("-");
- for (var i3 in u2 = {}, e2) {
- var l3 = e2[i3];
- H && "children" === i3 && "noscript" === t2 || "value" === i3 && "defaultValue" in e2 && null == l3 || ("defaultValue" === i3 && "value" in e2 && null == e2.value ? i3 = "value" : "download" === i3 && true === l3 ? l3 = "" : /ondoubleclick/i.test(i3) ? i3 = "ondblclick" : /^onchange(textarea|input)/i.test(i3 + t2) && !Z(e2.type) ? i3 = "oninput" : /^onfocus$/i.test(i3) ? i3 = "onfocusin" : /^onblur$/i.test(i3) ? i3 = "onfocusout" : /^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i3) ? i3 = i3.toLowerCase() : o && B.test(i3) ? i3 = i3.replace(/[A-Z0-9]/g, "-$&").toLowerCase() : null === l3 && (l3 = void 0), /^oninput$/i.test(i3) && (i3 = i3.toLowerCase(), u2[i3] && (i3 = "oninputCapture")), u2[i3] = l3);
- }
- "select" == t2 && u2.multiple && Array.isArray(u2.value) && (u2.value = j(e2.children).forEach(function(n2) {
- n2.props.selected = -1 != u2.value.indexOf(n2.props.value);
- })), "select" == t2 && null != u2.defaultValue && (u2.value = j(e2.children).forEach(function(n2) {
- n2.props.selected = u2.multiple ? -1 != u2.defaultValue.indexOf(n2.props.value) : u2.defaultValue == n2.props.value;
- })), n.props = u2, e2.class != e2.className && (nn.enumerable = "className" in e2, null != e2.className && (u2.class = e2.className), Object.defineProperty(u2, "className", nn));
- }
- n.$$typeof = z, tn && tn(n);
- };
- var en = l.__r;
- l.__r = function(n) {
- en && en(n), X = n.__c;
- };
- // node_modules/.pnpm/@fullcalendar+core@6.1.14/node_modules/@fullcalendar/core/internal-common.js
- var styleTexts = [];
- var styleEls = /* @__PURE__ */ new Map();
- function injectStyles(styleText) {
- styleTexts.push(styleText);
- styleEls.forEach((styleEl) => {
- appendStylesTo(styleEl, styleText);
- });
- }
- function ensureElHasStyles(el) {
- if (el.isConnected && // sometimes true if SSR system simulates DOM
- el.getRootNode) {
- registerStylesRoot(el.getRootNode());
- }
- }
- function registerStylesRoot(rootNode) {
- let styleEl = styleEls.get(rootNode);
- if (!styleEl || !styleEl.isConnected) {
- styleEl = rootNode.querySelector("style[data-fullcalendar]");
- if (!styleEl) {
- styleEl = document.createElement("style");
- styleEl.setAttribute("data-fullcalendar", "");
- const nonce = getNonceValue();
- if (nonce) {
- styleEl.nonce = nonce;
- }
- const parentEl = rootNode === document ? document.head : rootNode;
- const insertBefore = rootNode === document ? parentEl.querySelector("script,link[rel=stylesheet],link[as=style],style") : parentEl.firstChild;
- parentEl.insertBefore(styleEl, insertBefore);
- }
- styleEls.set(rootNode, styleEl);
- hydrateStylesRoot(styleEl);
- }
- }
- function hydrateStylesRoot(styleEl) {
- for (const styleText of styleTexts) {
- appendStylesTo(styleEl, styleText);
- }
- }
- function appendStylesTo(styleEl, styleText) {
- const { sheet } = styleEl;
- const ruleCnt = sheet.cssRules.length;
- styleText.split("}").forEach((styleStr, i3) => {
- styleStr = styleStr.trim();
- if (styleStr) {
- sheet.insertRule(styleStr + "}", ruleCnt + i3);
- }
- });
- }
- var queriedNonceValue;
- function getNonceValue() {
- if (queriedNonceValue === void 0) {
- queriedNonceValue = queryNonceValue();
- }
- return queriedNonceValue;
- }
- function queryNonceValue() {
- const metaWithNonce = document.querySelector('meta[name="csp-nonce"]');
- if (metaWithNonce && metaWithNonce.hasAttribute("content")) {
- return metaWithNonce.getAttribute("content");
- }
- const elWithNonce = document.querySelector("script[nonce]");
- if (elWithNonce) {
- return elWithNonce.nonce || "";
- }
- return "";
- }
- if (typeof document !== "undefined") {
- registerStylesRoot(document);
- }
- var css_248z = ':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}';
- injectStyles(css_248z);
- var DelayedRunner = class {
- constructor(drainedOption) {
- this.drainedOption = drainedOption;
- this.isRunning = false;
- this.isDirty = false;
- this.pauseDepths = {};
- this.timeoutId = 0;
- }
- request(delay) {
- this.isDirty = true;
- if (!this.isPaused()) {
- this.clearTimeout();
- if (delay == null) {
- this.tryDrain();
- } else {
- this.timeoutId = setTimeout(
- // NOT OPTIMAL! TODO: look at debounce
- this.tryDrain.bind(this),
- delay
- );
- }
- }
- }
- pause(scope = "") {
- let { pauseDepths } = this;
- pauseDepths[scope] = (pauseDepths[scope] || 0) + 1;
- this.clearTimeout();
- }
- resume(scope = "", force) {
- let { pauseDepths } = this;
- if (scope in pauseDepths) {
- if (force) {
- delete pauseDepths[scope];
- } else {
- pauseDepths[scope] -= 1;
- let depth = pauseDepths[scope];
- if (depth <= 0) {
- delete pauseDepths[scope];
- }
- }
- this.tryDrain();
- }
- }
- isPaused() {
- return Object.keys(this.pauseDepths).length;
- }
- tryDrain() {
- if (!this.isRunning && !this.isPaused()) {
- this.isRunning = true;
- while (this.isDirty) {
- this.isDirty = false;
- this.drained();
- }
- this.isRunning = false;
- }
- }
- clear() {
- this.clearTimeout();
- this.isDirty = false;
- this.pauseDepths = {};
- }
- clearTimeout() {
- if (this.timeoutId) {
- clearTimeout(this.timeoutId);
- this.timeoutId = 0;
- }
- }
- drained() {
- if (this.drainedOption) {
- this.drainedOption();
- }
- }
- };
- function removeElement(el) {
- if (el.parentNode) {
- el.parentNode.removeChild(el);
- }
- }
- function elementClosest(el, selector) {
- if (el.closest) {
- return el.closest(selector);
- }
- if (!document.documentElement.contains(el)) {
- return null;
- }
- do {
- if (elementMatches(el, selector)) {
- return el;
- }
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
- }
- function elementMatches(el, selector) {
- let method = el.matches || el.matchesSelector || el.msMatchesSelector;
- return method.call(el, selector);
- }
- function findElements(container, selector) {
- let containers = container instanceof HTMLElement ? [container] : container;
- let allMatches = [];
- for (let i3 = 0; i3 < containers.length; i3 += 1) {
- let matches = containers[i3].querySelectorAll(selector);
- for (let j4 = 0; j4 < matches.length; j4 += 1) {
- allMatches.push(matches[j4]);
- }
- }
- return allMatches;
- }
- var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
- function applyStyle(el, props) {
- for (let propName in props) {
- applyStyleProp(el, propName, props[propName]);
- }
- }
- function applyStyleProp(el, name, val) {
- if (val == null) {
- el.style[name] = "";
- } else if (typeof val === "number" && PIXEL_PROP_RE.test(name)) {
- el.style[name] = `${val}px`;
- } else {
- el.style[name] = val;
- }
- }
- function getEventTargetViaRoot(ev) {
- var _a, _b;
- return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target;
- }
- var guid$1 = 0;
- function getUniqueDomId() {
- guid$1 += 1;
- return "fc-dom-" + guid$1;
- }
- function preventDefault(ev) {
- ev.preventDefault();
- }
- function buildDelegationHandler(selector, handler) {
- return (ev) => {
- let matchedChild = elementClosest(ev.target, selector);
- if (matchedChild) {
- handler.call(matchedChild, ev, matchedChild);
- }
- };
- }
- function listenBySelector(container, eventType, selector, handler) {
- let attachedHandler = buildDelegationHandler(selector, handler);
- container.addEventListener(eventType, attachedHandler);
- return () => {
- container.removeEventListener(eventType, attachedHandler);
- };
- }
- function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
- let currentMatchedChild;
- return listenBySelector(container, "mouseover", selector, (mouseOverEv, matchedChild) => {
- if (matchedChild !== currentMatchedChild) {
- currentMatchedChild = matchedChild;
- onMouseEnter(mouseOverEv, matchedChild);
- let realOnMouseLeave = (mouseLeaveEv) => {
- currentMatchedChild = null;
- onMouseLeave(mouseLeaveEv, matchedChild);
- matchedChild.removeEventListener("mouseleave", realOnMouseLeave);
- };
- matchedChild.addEventListener("mouseleave", realOnMouseLeave);
- }
- });
- }
- var transitionEventNames = [
- "webkitTransitionEnd",
- "otransitionend",
- "oTransitionEnd",
- "msTransitionEnd",
- "transitionend"
- ];
- function whenTransitionDone(el, callback) {
- let realCallback = (ev) => {
- callback(ev);
- transitionEventNames.forEach((eventName) => {
- el.removeEventListener(eventName, realCallback);
- });
- };
- transitionEventNames.forEach((eventName) => {
- el.addEventListener(eventName, realCallback);
- });
- }
- function createAriaClickAttrs(handler) {
- return Object.assign({ onClick: handler }, createAriaKeyboardAttrs(handler));
- }
- function createAriaKeyboardAttrs(handler) {
- return {
- tabIndex: 0,
- onKeyDown(ev) {
- if (ev.key === "Enter" || ev.key === " ") {
- handler(ev);
- ev.preventDefault();
- }
- }
- };
- }
- var guidNumber = 0;
- function guid() {
- guidNumber += 1;
- return String(guidNumber);
- }
- function disableCursor() {
- document.body.classList.add("fc-not-allowed");
- }
- function enableCursor() {
- document.body.classList.remove("fc-not-allowed");
- }
- function preventSelection(el) {
- el.style.userSelect = "none";
- el.style.webkitUserSelect = "none";
- el.addEventListener("selectstart", preventDefault);
- }
- function allowSelection(el) {
- el.style.userSelect = "";
- el.style.webkitUserSelect = "";
- el.removeEventListener("selectstart", preventDefault);
- }
- function preventContextMenu(el) {
- el.addEventListener("contextmenu", preventDefault);
- }
- function allowContextMenu(el) {
- el.removeEventListener("contextmenu", preventDefault);
- }
- function parseFieldSpecs(input) {
- let specs = [];
- let tokens = [];
- let i3;
- let token;
- if (typeof input === "string") {
- tokens = input.split(/\s*,\s*/);
- } else if (typeof input === "function") {
- tokens = [input];
- } else if (Array.isArray(input)) {
- tokens = input;
- }
- for (i3 = 0; i3 < tokens.length; i3 += 1) {
- token = tokens[i3];
- if (typeof token === "string") {
- specs.push(token.charAt(0) === "-" ? { field: token.substring(1), order: -1 } : { field: token, order: 1 });
- } else if (typeof token === "function") {
- specs.push({ func: token });
- }
- }
- return specs;
- }
- function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
- let i3;
- let cmp;
- for (i3 = 0; i3 < fieldSpecs.length; i3 += 1) {
- cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i3]);
- if (cmp) {
- return cmp;
- }
- }
- return 0;
- }
- function compareByFieldSpec(obj0, obj1, fieldSpec) {
- if (fieldSpec.func) {
- return fieldSpec.func(obj0, obj1);
- }
- return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) * (fieldSpec.order || 1);
- }
- function flexibleCompare(a2, b2) {
- if (!a2 && !b2) {
- return 0;
- }
- if (b2 == null) {
- return -1;
- }
- if (a2 == null) {
- return 1;
- }
- if (typeof a2 === "string" || typeof b2 === "string") {
- return String(a2).localeCompare(String(b2));
- }
- return a2 - b2;
- }
- function padStart(val, len) {
- let s2 = String(val);
- return "000".substr(0, len - s2.length) + s2;
- }
- function formatWithOrdinals(formatter, args, fallbackText) {
- if (typeof formatter === "function") {
- return formatter(...args);
- }
- if (typeof formatter === "string") {
- return args.reduce((str, arg, index) => str.replace("$" + index, arg || ""), formatter);
- }
- return fallbackText;
- }
- function compareNumbers(a2, b2) {
- return a2 - b2;
- }
- function isInt(n) {
- return n % 1 === 0;
- }
- function computeSmallestCellWidth(cellEl) {
- let allWidthEl = cellEl.querySelector(".fc-scrollgrid-shrink-frame");
- let contentWidthEl = cellEl.querySelector(".fc-scrollgrid-shrink-cushion");
- if (!allWidthEl) {
- throw new Error("needs fc-scrollgrid-shrink-frame className");
- }
- if (!contentWidthEl) {
- throw new Error("needs fc-scrollgrid-shrink-cushion className");
- }
- return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border
- contentWidthEl.getBoundingClientRect().width;
- }
- var INTERNAL_UNITS = ["years", "months", "days", "milliseconds"];
- var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
- function createDuration(input, unit) {
- if (typeof input === "string") {
- return parseString(input);
- }
- if (typeof input === "object" && input) {
- return parseObject(input);
- }
- if (typeof input === "number") {
- return parseObject({ [unit || "milliseconds"]: input });
- }
- return null;
- }
- function parseString(s2) {
- let m2 = PARSE_RE.exec(s2);
- if (m2) {
- let sign = m2[1] ? -1 : 1;
- return {
- years: 0,
- months: 0,
- days: sign * (m2[2] ? parseInt(m2[2], 10) : 0),
- milliseconds: sign * ((m2[3] ? parseInt(m2[3], 10) : 0) * 60 * 60 * 1e3 + // hours
- (m2[4] ? parseInt(m2[4], 10) : 0) * 60 * 1e3 + // minutes
- (m2[5] ? parseInt(m2[5], 10) : 0) * 1e3 + // seconds
- (m2[6] ? parseInt(m2[6], 10) : 0))
- };
- }
- return null;
- }
- function parseObject(obj) {
- let duration = {
- years: obj.years || obj.year || 0,
- months: obj.months || obj.month || 0,
- days: obj.days || obj.day || 0,
- milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1e3 + // hours
- (obj.minutes || obj.minute || 0) * 60 * 1e3 + // minutes
- (obj.seconds || obj.second || 0) * 1e3 + // seconds
- (obj.milliseconds || obj.millisecond || obj.ms || 0)
- // ms
- };
- let weeks = obj.weeks || obj.week;
- if (weeks) {
- duration.days += weeks * 7;
- duration.specifiedWeeks = true;
- }
- return duration;
- }
- function durationsEqual(d0, d1) {
- return d0.years === d1.years && d0.months === d1.months && d0.days === d1.days && d0.milliseconds === d1.milliseconds;
- }
- function addDurations(d0, d1) {
- return {
- years: d0.years + d1.years,
- months: d0.months + d1.months,
- days: d0.days + d1.days,
- milliseconds: d0.milliseconds + d1.milliseconds
- };
- }
- function subtractDurations(d1, d0) {
- return {
- years: d1.years - d0.years,
- months: d1.months - d0.months,
- days: d1.days - d0.days,
- milliseconds: d1.milliseconds - d0.milliseconds
- };
- }
- function multiplyDuration(d2, n) {
- return {
- years: d2.years * n,
- months: d2.months * n,
- days: d2.days * n,
- milliseconds: d2.milliseconds * n
- };
- }
- function asRoughYears(dur) {
- return asRoughDays(dur) / 365;
- }
- function asRoughMonths(dur) {
- return asRoughDays(dur) / 30;
- }
- function asRoughDays(dur) {
- return asRoughMs(dur) / 864e5;
- }
- function asRoughMs(dur) {
- return dur.years * (365 * 864e5) + dur.months * (30 * 864e5) + dur.days * 864e5 + dur.milliseconds;
- }
- function wholeDivideDurations(numerator, denominator) {
- let res = null;
- for (let i3 = 0; i3 < INTERNAL_UNITS.length; i3 += 1) {
- let unit = INTERNAL_UNITS[i3];
- if (denominator[unit]) {
- let localRes = numerator[unit] / denominator[unit];
- if (!isInt(localRes) || res !== null && res !== localRes) {
- return null;
- }
- res = localRes;
- } else if (numerator[unit]) {
- return null;
- }
- }
- return res;
- }
- function greatestDurationDenominator(dur) {
- let ms = dur.milliseconds;
- if (ms) {
- if (ms % 1e3 !== 0) {
- return { unit: "millisecond", value: ms };
- }
- if (ms % (1e3 * 60) !== 0) {
- return { unit: "second", value: ms / 1e3 };
- }
- if (ms % (1e3 * 60 * 60) !== 0) {
- return { unit: "minute", value: ms / (1e3 * 60) };
- }
- if (ms) {
- return { unit: "hour", value: ms / (1e3 * 60 * 60) };
- }
- }
- if (dur.days) {
- if (dur.specifiedWeeks && dur.days % 7 === 0) {
- return { unit: "week", value: dur.days / 7 };
- }
- return { unit: "day", value: dur.days };
- }
- if (dur.months) {
- return { unit: "month", value: dur.months };
- }
- if (dur.years) {
- return { unit: "year", value: dur.years };
- }
- return { unit: "millisecond", value: 0 };
- }
- function isArraysEqual(a0, a1, equalityFunc) {
- if (a0 === a1) {
- return true;
- }
- let len = a0.length;
- let i3;
- if (len !== a1.length) {
- return false;
- }
- for (i3 = 0; i3 < len; i3 += 1) {
- if (!(equalityFunc ? equalityFunc(a0[i3], a1[i3]) : a0[i3] === a1[i3])) {
- return false;
- }
- }
- return true;
- }
- var DAY_IDS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
- function addWeeks(m2, n) {
- let a2 = dateToUtcArray(m2);
- a2[2] += n * 7;
- return arrayToUtcDate(a2);
- }
- function addDays(m2, n) {
- let a2 = dateToUtcArray(m2);
- a2[2] += n;
- return arrayToUtcDate(a2);
- }
- function addMs(m2, n) {
- let a2 = dateToUtcArray(m2);
- a2[6] += n;
- return arrayToUtcDate(a2);
- }
- function diffWeeks(m0, m1) {
- return diffDays(m0, m1) / 7;
- }
- function diffDays(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1e3 * 60 * 60 * 24);
- }
- function diffHours(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1e3 * 60 * 60);
- }
- function diffMinutes(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1e3 * 60);
- }
- function diffSeconds(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / 1e3;
- }
- function diffDayAndTime(m0, m1) {
- let m0day = startOfDay(m0);
- let m1day = startOfDay(m1);
- return {
- years: 0,
- months: 0,
- days: Math.round(diffDays(m0day, m1day)),
- milliseconds: m1.valueOf() - m1day.valueOf() - (m0.valueOf() - m0day.valueOf())
- };
- }
- function diffWholeWeeks(m0, m1) {
- let d2 = diffWholeDays(m0, m1);
- if (d2 !== null && d2 % 7 === 0) {
- return d2 / 7;
- }
- return null;
- }
- function diffWholeDays(m0, m1) {
- if (timeAsMs(m0) === timeAsMs(m1)) {
- return Math.round(diffDays(m0, m1));
- }
- return null;
- }
- function startOfDay(m2) {
- return arrayToUtcDate([
- m2.getUTCFullYear(),
- m2.getUTCMonth(),
- m2.getUTCDate()
- ]);
- }
- function startOfHour(m2) {
- return arrayToUtcDate([
- m2.getUTCFullYear(),
- m2.getUTCMonth(),
- m2.getUTCDate(),
- m2.getUTCHours()
- ]);
- }
- function startOfMinute(m2) {
- return arrayToUtcDate([
- m2.getUTCFullYear(),
- m2.getUTCMonth(),
- m2.getUTCDate(),
- m2.getUTCHours(),
- m2.getUTCMinutes()
- ]);
- }
- function startOfSecond(m2) {
- return arrayToUtcDate([
- m2.getUTCFullYear(),
- m2.getUTCMonth(),
- m2.getUTCDate(),
- m2.getUTCHours(),
- m2.getUTCMinutes(),
- m2.getUTCSeconds()
- ]);
- }
- function weekOfYear(marker, dow, doy) {
- let y3 = marker.getUTCFullYear();
- let w3 = weekOfGivenYear(marker, y3, dow, doy);
- if (w3 < 1) {
- return weekOfGivenYear(marker, y3 - 1, dow, doy);
- }
- let nextW = weekOfGivenYear(marker, y3 + 1, dow, doy);
- if (nextW >= 1) {
- return Math.min(w3, nextW);
- }
- return w3;
- }
- function weekOfGivenYear(marker, year, dow, doy) {
- let firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
- let dayStart = startOfDay(marker);
- let days = Math.round(diffDays(firstWeekStart, dayStart));
- return Math.floor(days / 7) + 1;
- }
- function firstWeekOffset(year, dow, doy) {
- let fwd = 7 + dow - doy;
- let fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
- return -fwdlw + fwd - 1;
- }
- function dateToLocalArray(date) {
- return [
- date.getFullYear(),
- date.getMonth(),
- date.getDate(),
- date.getHours(),
- date.getMinutes(),
- date.getSeconds(),
- date.getMilliseconds()
- ];
- }
- function arrayToLocalDate(a2) {
- return new Date(
- a2[0],
- a2[1] || 0,
- a2[2] == null ? 1 : a2[2],
- // day of month
- a2[3] || 0,
- a2[4] || 0,
- a2[5] || 0
- );
- }
- function dateToUtcArray(date) {
- return [
- date.getUTCFullYear(),
- date.getUTCMonth(),
- date.getUTCDate(),
- date.getUTCHours(),
- date.getUTCMinutes(),
- date.getUTCSeconds(),
- date.getUTCMilliseconds()
- ];
- }
- function arrayToUtcDate(a2) {
- if (a2.length === 1) {
- a2 = a2.concat([0]);
- }
- return new Date(Date.UTC(...a2));
- }
- function isValidDate(m2) {
- return !isNaN(m2.valueOf());
- }
- function timeAsMs(m2) {
- return m2.getUTCHours() * 1e3 * 60 * 60 + m2.getUTCMinutes() * 1e3 * 60 + m2.getUTCSeconds() * 1e3 + m2.getUTCMilliseconds();
- }
- function buildIsoString(marker, timeZoneOffset, stripZeroTime = false) {
- let s2 = marker.toISOString();
- s2 = s2.replace(".000", "");
- if (stripZeroTime) {
- s2 = s2.replace("T00:00:00Z", "");
- }
- if (s2.length > 10) {
- if (timeZoneOffset == null) {
- s2 = s2.replace("Z", "");
- } else if (timeZoneOffset !== 0) {
- s2 = s2.replace("Z", formatTimeZoneOffset(timeZoneOffset, true));
- }
- }
- return s2;
- }
- function formatDayString(marker) {
- return marker.toISOString().replace(/T.*$/, "");
- }
- function formatIsoMonthStr(marker) {
- return marker.toISOString().match(/^\d{4}-\d{2}/)[0];
- }
- function formatIsoTimeString(marker) {
- return padStart(marker.getUTCHours(), 2) + ":" + padStart(marker.getUTCMinutes(), 2) + ":" + padStart(marker.getUTCSeconds(), 2);
- }
- function formatTimeZoneOffset(minutes, doIso = false) {
- let sign = minutes < 0 ? "-" : "+";
- let abs = Math.abs(minutes);
- let hours = Math.floor(abs / 60);
- let mins = Math.round(abs % 60);
- if (doIso) {
- return `${sign + padStart(hours, 2)}:${padStart(mins, 2)}`;
- }
- return `GMT${sign}${hours}${mins ? `:${padStart(mins, 2)}` : ""}`;
- }
- function memoize(workerFunc, resEquality, teardownFunc) {
- let currentArgs;
- let currentRes;
- return function(...newArgs) {
- if (!currentArgs) {
- currentRes = workerFunc.apply(this, newArgs);
- } else if (!isArraysEqual(currentArgs, newArgs)) {
- if (teardownFunc) {
- teardownFunc(currentRes);
- }
- let res = workerFunc.apply(this, newArgs);
- if (!resEquality || !resEquality(res, currentRes)) {
- currentRes = res;
- }
- }
- currentArgs = newArgs;
- return currentRes;
- };
- }
- function memoizeObjArg(workerFunc, resEquality, teardownFunc) {
- let currentArg;
- let currentRes;
- return (newArg) => {
- if (!currentArg) {
- currentRes = workerFunc.call(this, newArg);
- } else if (!isPropsEqual(currentArg, newArg)) {
- if (teardownFunc) {
- teardownFunc(currentRes);
- }
- let res = workerFunc.call(this, newArg);
- if (!resEquality || !resEquality(res, currentRes)) {
- currentRes = res;
- }
- }
- currentArg = newArg;
- return currentRes;
- };
- }
- var EXTENDED_SETTINGS_AND_SEVERITIES = {
- week: 3,
- separator: 0,
- omitZeroMinute: 0,
- meridiem: 0,
- omitCommas: 0
- };
- var STANDARD_DATE_PROP_SEVERITIES = {
- timeZoneName: 7,
- era: 6,
- year: 5,
- month: 4,
- day: 2,
- weekday: 2,
- hour: 1,
- minute: 1,
- second: 1
- };
- var MERIDIEM_RE = /\s*([ap])\.?m\.?/i;
- var COMMA_RE = /,/g;
- var MULTI_SPACE_RE = /\s+/g;
- var LTR_RE = /\u200e/g;
- var UTC_RE = /UTC|GMT/;
- var NativeFormatter = class {
- constructor(formatSettings) {
- let standardDateProps = {};
- let extendedSettings = {};
- let severity = 0;
- for (let name in formatSettings) {
- if (name in EXTENDED_SETTINGS_AND_SEVERITIES) {
- extendedSettings[name] = formatSettings[name];
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity);
- } else {
- standardDateProps[name] = formatSettings[name];
- if (name in STANDARD_DATE_PROP_SEVERITIES) {
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity);
- }
- }
- }
- this.standardDateProps = standardDateProps;
- this.extendedSettings = extendedSettings;
- this.severity = severity;
- this.buildFormattingFunc = memoize(buildFormattingFunc);
- }
- format(date, context) {
- return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
- }
- formatRange(start, end, context, betterDefaultSeparator) {
- let { standardDateProps, extendedSettings } = this;
- let diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
- if (!diffSeverity) {
- return this.format(start, context);
- }
- let biggestUnitForPartial = diffSeverity;
- if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
- (standardDateProps.year === "numeric" || standardDateProps.year === "2-digit") && (standardDateProps.month === "numeric" || standardDateProps.month === "2-digit") && (standardDateProps.day === "numeric" || standardDateProps.day === "2-digit")) {
- biggestUnitForPartial = 1;
- }
- let full0 = this.format(start, context);
- let full1 = this.format(end, context);
- if (full0 === full1) {
- return full0;
- }
- let partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
- let partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
- let partial0 = partialFormattingFunc(start);
- let partial1 = partialFormattingFunc(end);
- let insertion = findCommonInsertion(full0, partial0, full1, partial1);
- let separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || "";
- if (insertion) {
- return insertion.before + partial0 + separator + partial1 + insertion.after;
- }
- return full0 + separator + full1;
- }
- getLargestUnit() {
- switch (this.severity) {
- case 7:
- case 6:
- case 5:
- return "year";
- case 4:
- return "month";
- case 3:
- return "week";
- case 2:
- return "day";
- default:
- return "time";
- }
- }
- };
- function buildFormattingFunc(standardDateProps, extendedSettings, context) {
- let standardDatePropCnt = Object.keys(standardDateProps).length;
- if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === "short") {
- return (date) => formatTimeZoneOffset(date.timeZoneOffset);
- }
- if (standardDatePropCnt === 0 && extendedSettings.week) {
- return (date) => formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week);
- }
- return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
- }
- function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
- standardDateProps = Object.assign({}, standardDateProps);
- extendedSettings = Object.assign({}, extendedSettings);
- sanitizeSettings(standardDateProps, extendedSettings);
- standardDateProps.timeZone = "UTC";
- let normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
- let zeroFormat;
- if (extendedSettings.omitZeroMinute) {
- let zeroProps = Object.assign({}, standardDateProps);
- delete zeroProps.minute;
- zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
- }
- return (date) => {
- let { marker } = date;
- let format;
- if (zeroFormat && !marker.getUTCMinutes()) {
- format = zeroFormat;
- } else {
- format = normalFormat;
- }
- let s2 = format.format(marker);
- return postProcess(s2, date, standardDateProps, extendedSettings, context);
- };
- }
- function sanitizeSettings(standardDateProps, extendedSettings) {
- if (standardDateProps.timeZoneName) {
- if (!standardDateProps.hour) {
- standardDateProps.hour = "2-digit";
- }
- if (!standardDateProps.minute) {
- standardDateProps.minute = "2-digit";
- }
- }
- if (standardDateProps.timeZoneName === "long") {
- standardDateProps.timeZoneName = "short";
- }
- if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
- delete extendedSettings.omitZeroMinute;
- }
- }
- function postProcess(s2, date, standardDateProps, extendedSettings, context) {
- s2 = s2.replace(LTR_RE, "");
- if (standardDateProps.timeZoneName === "short") {
- s2 = injectTzoStr(s2, context.timeZone === "UTC" || date.timeZoneOffset == null ? "UTC" : (
- // important to normalize for IE, which does "GMT"
- formatTimeZoneOffset(date.timeZoneOffset)
- ));
- }
- if (extendedSettings.omitCommas) {
- s2 = s2.replace(COMMA_RE, "").trim();
- }
- if (extendedSettings.omitZeroMinute) {
- s2 = s2.replace(":00", "");
- }
- if (extendedSettings.meridiem === false) {
- s2 = s2.replace(MERIDIEM_RE, "").trim();
- } else if (extendedSettings.meridiem === "narrow") {
- s2 = s2.replace(MERIDIEM_RE, (m0, m1) => m1.toLocaleLowerCase());
- } else if (extendedSettings.meridiem === "short") {
- s2 = s2.replace(MERIDIEM_RE, (m0, m1) => `${m1.toLocaleLowerCase()}m`);
- } else if (extendedSettings.meridiem === "lowercase") {
- s2 = s2.replace(MERIDIEM_RE, (m0) => m0.toLocaleLowerCase());
- }
- s2 = s2.replace(MULTI_SPACE_RE, " ");
- s2 = s2.trim();
- return s2;
- }
- function injectTzoStr(s2, tzoStr) {
- let replaced = false;
- s2 = s2.replace(UTC_RE, () => {
- replaced = true;
- return tzoStr;
- });
- if (!replaced) {
- s2 += ` ${tzoStr}`;
- }
- return s2;
- }
- function formatWeekNumber(num, weekText, weekTextLong, locale, display) {
- let parts = [];
- if (display === "long") {
- parts.push(weekTextLong);
- } else if (display === "short" || display === "narrow") {
- parts.push(weekText);
- }
- if (display === "long" || display === "short") {
- parts.push(" ");
- }
- parts.push(locale.simpleNumberFormat.format(num));
- if (locale.options.direction === "rtl") {
- parts.reverse();
- }
- return parts.join("");
- }
- function computeMarkerDiffSeverity(d0, d1, ca) {
- if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
- return 5;
- }
- if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
- return 4;
- }
- if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
- return 2;
- }
- if (timeAsMs(d0) !== timeAsMs(d1)) {
- return 1;
- }
- return 0;
- }
- function computePartialFormattingOptions(options, biggestUnit) {
- let partialOptions = {};
- for (let name in options) {
- if (!(name in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
- STANDARD_DATE_PROP_SEVERITIES[name] <= biggestUnit) {
- partialOptions[name] = options[name];
- }
- }
- return partialOptions;
- }
- function findCommonInsertion(full0, partial0, full1, partial1) {
- let i0 = 0;
- while (i0 < full0.length) {
- let found0 = full0.indexOf(partial0, i0);
- if (found0 === -1) {
- break;
- }
- let before0 = full0.substr(0, found0);
- i0 = found0 + partial0.length;
- let after0 = full0.substr(i0);
- let i1 = 0;
- while (i1 < full1.length) {
- let found1 = full1.indexOf(partial1, i1);
- if (found1 === -1) {
- break;
- }
- let before1 = full1.substr(0, found1);
- i1 = found1 + partial1.length;
- let after1 = full1.substr(i1);
- if (before0 === before1 && after0 === after1) {
- return {
- before: before0,
- after: after0
- };
- }
- }
- }
- return null;
- }
- function expandZonedMarker(dateInfo, calendarSystem) {
- let a2 = calendarSystem.markerToArray(dateInfo.marker);
- return {
- marker: dateInfo.marker,
- timeZoneOffset: dateInfo.timeZoneOffset,
- array: a2,
- year: a2[0],
- month: a2[1],
- day: a2[2],
- hour: a2[3],
- minute: a2[4],
- second: a2[5],
- millisecond: a2[6]
- };
- }
- function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) {
- let startInfo = expandZonedMarker(start, context.calendarSystem);
- let endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
- return {
- date: startInfo,
- start: startInfo,
- end: endInfo,
- timeZone: context.timeZone,
- localeCodes: context.locale.codes,
- defaultSeparator: betterDefaultSeparator || context.defaultSeparator
- };
- }
- var CmdFormatter = class {
- constructor(cmdStr) {
- this.cmdStr = cmdStr;
- }
- format(date, context, betterDefaultSeparator) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
- }
- formatRange(start, end, context, betterDefaultSeparator) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
- }
- };
- var FuncFormatter = class {
- constructor(func) {
- this.func = func;
- }
- format(date, context, betterDefaultSeparator) {
- return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
- }
- formatRange(start, end, context, betterDefaultSeparator) {
- return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
- }
- };
- function createFormatter(input) {
- if (typeof input === "object" && input) {
- return new NativeFormatter(input);
- }
- if (typeof input === "string") {
- return new CmdFormatter(input);
- }
- if (typeof input === "function") {
- return new FuncFormatter(input);
- }
- return null;
- }
- var BASE_OPTION_REFINERS = {
- navLinkDayClick: identity,
- navLinkWeekClick: identity,
- duration: createDuration,
- bootstrapFontAwesome: identity,
- buttonIcons: identity,
- customButtons: identity,
- defaultAllDayEventDuration: createDuration,
- defaultTimedEventDuration: createDuration,
- nextDayThreshold: createDuration,
- scrollTime: createDuration,
- scrollTimeReset: Boolean,
- slotMinTime: createDuration,
- slotMaxTime: createDuration,
- dayPopoverFormat: createFormatter,
- slotDuration: createDuration,
- snapDuration: createDuration,
- headerToolbar: identity,
- footerToolbar: identity,
- defaultRangeSeparator: String,
- titleRangeSeparator: String,
- forceEventDuration: Boolean,
- dayHeaders: Boolean,
- dayHeaderFormat: createFormatter,
- dayHeaderClassNames: identity,
- dayHeaderContent: identity,
- dayHeaderDidMount: identity,
- dayHeaderWillUnmount: identity,
- dayCellClassNames: identity,
- dayCellContent: identity,
- dayCellDidMount: identity,
- dayCellWillUnmount: identity,
- initialView: String,
- aspectRatio: Number,
- weekends: Boolean,
- weekNumberCalculation: identity,
- weekNumbers: Boolean,
- weekNumberClassNames: identity,
- weekNumberContent: identity,
- weekNumberDidMount: identity,
- weekNumberWillUnmount: identity,
- editable: Boolean,
- viewClassNames: identity,
- viewDidMount: identity,
- viewWillUnmount: identity,
- nowIndicator: Boolean,
- nowIndicatorClassNames: identity,
- nowIndicatorContent: identity,
- nowIndicatorDidMount: identity,
- nowIndicatorWillUnmount: identity,
- showNonCurrentDates: Boolean,
- lazyFetching: Boolean,
- startParam: String,
- endParam: String,
- timeZoneParam: String,
- timeZone: String,
- locales: identity,
- locale: identity,
- themeSystem: String,
- dragRevertDuration: Number,
- dragScroll: Boolean,
- allDayMaintainDuration: Boolean,
- unselectAuto: Boolean,
- dropAccept: identity,
- eventOrder: parseFieldSpecs,
- eventOrderStrict: Boolean,
- handleWindowResize: Boolean,
- windowResizeDelay: Number,
- longPressDelay: Number,
- eventDragMinDistance: Number,
- expandRows: Boolean,
- height: identity,
- contentHeight: identity,
- direction: String,
- weekNumberFormat: createFormatter,
- eventResizableFromStart: Boolean,
- displayEventTime: Boolean,
- displayEventEnd: Boolean,
- weekText: String,
- weekTextLong: String,
- progressiveEventRendering: Boolean,
- businessHours: identity,
- initialDate: identity,
- now: identity,
- eventDataTransform: identity,
- stickyHeaderDates: identity,
- stickyFooterScrollbar: identity,
- viewHeight: identity,
- defaultAllDay: Boolean,
- eventSourceFailure: identity,
- eventSourceSuccess: identity,
- eventDisplay: String,
- eventStartEditable: Boolean,
- eventDurationEditable: Boolean,
- eventOverlap: identity,
- eventConstraint: identity,
- eventAllow: identity,
- eventBackgroundColor: String,
- eventBorderColor: String,
- eventTextColor: String,
- eventColor: String,
- eventClassNames: identity,
- eventContent: identity,
- eventDidMount: identity,
- eventWillUnmount: identity,
- selectConstraint: identity,
- selectOverlap: identity,
- selectAllow: identity,
- droppable: Boolean,
- unselectCancel: String,
- slotLabelFormat: identity,
- slotLaneClassNames: identity,
- slotLaneContent: identity,
- slotLaneDidMount: identity,
- slotLaneWillUnmount: identity,
- slotLabelClassNames: identity,
- slotLabelContent: identity,
- slotLabelDidMount: identity,
- slotLabelWillUnmount: identity,
- dayMaxEvents: identity,
- dayMaxEventRows: identity,
- dayMinWidth: Number,
- slotLabelInterval: createDuration,
- allDayText: String,
- allDayClassNames: identity,
- allDayContent: identity,
- allDayDidMount: identity,
- allDayWillUnmount: identity,
- slotMinWidth: Number,
- navLinks: Boolean,
- eventTimeFormat: createFormatter,
- rerenderDelay: Number,
- moreLinkText: identity,
- moreLinkHint: identity,
- selectMinDistance: Number,
- selectable: Boolean,
- selectLongPressDelay: Number,
- eventLongPressDelay: Number,
- selectMirror: Boolean,
- eventMaxStack: Number,
- eventMinHeight: Number,
- eventMinWidth: Number,
- eventShortHeight: Number,
- slotEventOverlap: Boolean,
- plugins: identity,
- firstDay: Number,
- dayCount: Number,
- dateAlignment: String,
- dateIncrement: createDuration,
- hiddenDays: identity,
- fixedWeekCount: Boolean,
- validRange: identity,
- visibleRange: identity,
- titleFormat: identity,
- eventInteractive: Boolean,
- // only used by list-view, but languages define the value, so we need it in base options
- noEventsText: String,
- viewHint: identity,
- navLinkHint: identity,
- closeHint: String,
- timeHint: String,
- eventHint: String,
- moreLinkClick: identity,
- moreLinkClassNames: identity,
- moreLinkContent: identity,
- moreLinkDidMount: identity,
- moreLinkWillUnmount: identity,
- monthStartFormat: createFormatter,
- // for connectors
- // (can't be part of plugin system b/c must be provided at runtime)
- handleCustomRendering: identity,
- customRenderingMetaMap: identity,
- customRenderingReplaces: Boolean
- };
- var BASE_OPTION_DEFAULTS = {
- eventDisplay: "auto",
- defaultRangeSeparator: " - ",
- titleRangeSeparator: " – ",
- defaultTimedEventDuration: "01:00:00",
- defaultAllDayEventDuration: { day: 1 },
- forceEventDuration: false,
- nextDayThreshold: "00:00:00",
- dayHeaders: true,
- initialView: "",
- aspectRatio: 1.35,
- headerToolbar: {
- start: "title",
- center: "",
- end: "today prev,next"
- },
- weekends: true,
- weekNumbers: false,
- weekNumberCalculation: "local",
- editable: false,
- nowIndicator: false,
- scrollTime: "06:00:00",
- scrollTimeReset: true,
- slotMinTime: "00:00:00",
- slotMaxTime: "24:00:00",
- showNonCurrentDates: true,
- lazyFetching: true,
- startParam: "start",
- endParam: "end",
- timeZoneParam: "timeZone",
- timeZone: "local",
- locales: [],
- locale: "",
- themeSystem: "standard",
- dragRevertDuration: 500,
- dragScroll: true,
- allDayMaintainDuration: false,
- unselectAuto: true,
- dropAccept: "*",
- eventOrder: "start,-duration,allDay,title",
- dayPopoverFormat: { month: "long", day: "numeric", year: "numeric" },
- handleWindowResize: true,
- windowResizeDelay: 100,
- longPressDelay: 1e3,
- eventDragMinDistance: 5,
- expandRows: false,
- navLinks: false,
- selectable: false,
- eventMinHeight: 15,
- eventMinWidth: 30,
- eventShortHeight: 30,
- monthStartFormat: { month: "long", day: "numeric" }
- };
- var CALENDAR_LISTENER_REFINERS = {
- datesSet: identity,
- eventsSet: identity,
- eventAdd: identity,
- eventChange: identity,
- eventRemove: identity,
- windowResize: identity,
- eventClick: identity,
- eventMouseEnter: identity,
- eventMouseLeave: identity,
- select: identity,
- unselect: identity,
- loading: identity,
- // internal
- _unmount: identity,
- _beforeprint: identity,
- _afterprint: identity,
- _noEventDrop: identity,
- _noEventResize: identity,
- _resize: identity,
- _scrollRequest: identity
- };
- var CALENDAR_OPTION_REFINERS = {
- buttonText: identity,
- buttonHints: identity,
- views: identity,
- plugins: identity,
- initialEvents: identity,
- events: identity,
- eventSources: identity
- };
- var COMPLEX_OPTION_COMPARATORS = {
- headerToolbar: isMaybeObjectsEqual,
- footerToolbar: isMaybeObjectsEqual,
- buttonText: isMaybeObjectsEqual,
- buttonHints: isMaybeObjectsEqual,
- buttonIcons: isMaybeObjectsEqual,
- dateIncrement: isMaybeObjectsEqual,
- plugins: isMaybeArraysEqual,
- events: isMaybeArraysEqual,
- eventSources: isMaybeArraysEqual,
- ["resources"]: isMaybeArraysEqual
- };
- function isMaybeObjectsEqual(a2, b2) {
- if (typeof a2 === "object" && typeof b2 === "object" && a2 && b2) {
- return isPropsEqual(a2, b2);
- }
- return a2 === b2;
- }
- function isMaybeArraysEqual(a2, b2) {
- if (Array.isArray(a2) && Array.isArray(b2)) {
- return isArraysEqual(a2, b2);
- }
- return a2 === b2;
- }
- var VIEW_OPTION_REFINERS = {
- type: String,
- component: identity,
- buttonText: String,
- buttonTextKey: String,
- dateProfileGeneratorClass: identity,
- usesMinMaxTime: Boolean,
- classNames: identity,
- content: identity,
- didMount: identity,
- willUnmount: identity
- };
- function mergeRawOptions(optionSets) {
- return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS);
- }
- function refineProps(input, refiners) {
- let refined = {};
- let extra = {};
- for (let propName in refiners) {
- if (propName in input) {
- refined[propName] = refiners[propName](input[propName]);
- }
- }
- for (let propName in input) {
- if (!(propName in refiners)) {
- extra[propName] = input[propName];
- }
- }
- return { refined, extra };
- }
- function identity(raw) {
- return raw;
- }
- var { hasOwnProperty } = Object.prototype;
- function mergeProps(propObjs, complexPropsMap) {
- let dest = {};
- if (complexPropsMap) {
- for (let name in complexPropsMap) {
- if (complexPropsMap[name] === isMaybeObjectsEqual) {
- let complexObjs = [];
- for (let i3 = propObjs.length - 1; i3 >= 0; i3 -= 1) {
- let val = propObjs[i3][name];
- if (typeof val === "object" && val) {
- complexObjs.unshift(val);
- } else if (val !== void 0) {
- dest[name] = val;
- break;
- }
- }
- if (complexObjs.length) {
- dest[name] = mergeProps(complexObjs);
- }
- }
- }
- }
- for (let i3 = propObjs.length - 1; i3 >= 0; i3 -= 1) {
- let props = propObjs[i3];
- for (let name in props) {
- if (!(name in dest)) {
- dest[name] = props[name];
- }
- }
- }
- return dest;
- }
- function filterHash(hash, func) {
- let filtered = {};
- for (let key in hash) {
- if (func(hash[key], key)) {
- filtered[key] = hash[key];
- }
- }
- return filtered;
- }
- function mapHash(hash, func) {
- let newHash = {};
- for (let key in hash) {
- newHash[key] = func(hash[key], key);
- }
- return newHash;
- }
- function arrayToHash(a2) {
- let hash = {};
- for (let item of a2) {
- hash[item] = true;
- }
- return hash;
- }
- function hashValuesToArray(obj) {
- let a2 = [];
- for (let key in obj) {
- a2.push(obj[key]);
- }
- return a2;
- }
- function isPropsEqual(obj0, obj1) {
- if (obj0 === obj1) {
- return true;
- }
- for (let key in obj0) {
- if (hasOwnProperty.call(obj0, key)) {
- if (!(key in obj1)) {
- return false;
- }
- }
- }
- for (let key in obj1) {
- if (hasOwnProperty.call(obj1, key)) {
- if (obj0[key] !== obj1[key]) {
- return false;
- }
- }
- }
- return true;
- }
- var HANDLER_RE = /^on[A-Z]/;
- function isNonHandlerPropsEqual(obj0, obj1) {
- const keys = getUnequalProps(obj0, obj1);
- for (let key of keys) {
- if (!HANDLER_RE.test(key)) {
- return false;
- }
- }
- return true;
- }
- function getUnequalProps(obj0, obj1) {
- let keys = [];
- for (let key in obj0) {
- if (hasOwnProperty.call(obj0, key)) {
- if (!(key in obj1)) {
- keys.push(key);
- }
- }
- }
- for (let key in obj1) {
- if (hasOwnProperty.call(obj1, key)) {
- if (obj0[key] !== obj1[key]) {
- keys.push(key);
- }
- }
- }
- return keys;
- }
- function compareObjs(oldProps, newProps, equalityFuncs = {}) {
- if (oldProps === newProps) {
- return true;
- }
- for (let key in newProps) {
- if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key]))
- ;
- else {
- return false;
- }
- }
- for (let key in oldProps) {
- if (!(key in newProps)) {
- return false;
- }
- }
- return true;
- }
- function isObjValsEqual(val0, val1, comparator) {
- if (val0 === val1 || comparator === true) {
- return true;
- }
- if (comparator) {
- return comparator(val0, val1);
- }
- return false;
- }
- function collectFromHash(hash, startIndex = 0, endIndex, step = 1) {
- let res = [];
- if (endIndex == null) {
- endIndex = Object.keys(hash).length;
- }
- for (let i3 = startIndex; i3 < endIndex; i3 += step) {
- let val = hash[i3];
- if (val !== void 0) {
- res.push(val);
- }
- }
- return res;
- }
- var calendarSystemClassMap = {};
- function registerCalendarSystem(name, theClass) {
- calendarSystemClassMap[name] = theClass;
- }
- function createCalendarSystem(name) {
- return new calendarSystemClassMap[name]();
- }
- var GregorianCalendarSystem = class {
- getMarkerYear(d2) {
- return d2.getUTCFullYear();
- }
- getMarkerMonth(d2) {
- return d2.getUTCMonth();
- }
- getMarkerDay(d2) {
- return d2.getUTCDate();
- }
- arrayToMarker(arr) {
- return arrayToUtcDate(arr);
- }
- markerToArray(marker) {
- return dateToUtcArray(marker);
- }
- };
- registerCalendarSystem("gregory", GregorianCalendarSystem);
- var ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
- function parse(str) {
- let m2 = ISO_RE.exec(str);
- if (m2) {
- let marker = new Date(Date.UTC(Number(m2[1]), m2[3] ? Number(m2[3]) - 1 : 0, Number(m2[5] || 1), Number(m2[7] || 0), Number(m2[8] || 0), Number(m2[10] || 0), m2[12] ? Number(`0.${m2[12]}`) * 1e3 : 0));
- if (isValidDate(marker)) {
- let timeZoneOffset = null;
- if (m2[13]) {
- timeZoneOffset = (m2[15] === "-" ? -1 : 1) * (Number(m2[16] || 0) * 60 + Number(m2[18] || 0));
- }
- return {
- marker,
- isTimeUnspecified: !m2[6],
- timeZoneOffset
- };
- }
- }
- return null;
- }
- var DateEnv = class {
- constructor(settings) {
- let timeZone = this.timeZone = settings.timeZone;
- let isNamedTimeZone = timeZone !== "local" && timeZone !== "UTC";
- if (settings.namedTimeZoneImpl && isNamedTimeZone) {
- this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
- }
- this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
- this.calendarSystem = createCalendarSystem(settings.calendarSystem);
- this.locale = settings.locale;
- this.weekDow = settings.locale.week.dow;
- this.weekDoy = settings.locale.week.doy;
- if (settings.weekNumberCalculation === "ISO") {
- this.weekDow = 1;
- this.weekDoy = 4;
- }
- if (typeof settings.firstDay === "number") {
- this.weekDow = settings.firstDay;
- }
- if (typeof settings.weekNumberCalculation === "function") {
- this.weekNumberFunc = settings.weekNumberCalculation;
- }
- this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText;
- this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText;
- this.cmdFormatter = settings.cmdFormatter;
- this.defaultSeparator = settings.defaultSeparator;
- }
- // Creating / Parsing
- createMarker(input) {
- let meta = this.createMarkerMeta(input);
- if (meta === null) {
- return null;
- }
- return meta.marker;
- }
- createNowMarker() {
- if (this.canComputeOffset) {
- return this.timestampToMarker((/* @__PURE__ */ new Date()).valueOf());
- }
- return arrayToUtcDate(dateToLocalArray(/* @__PURE__ */ new Date()));
- }
- createMarkerMeta(input) {
- if (typeof input === "string") {
- return this.parse(input);
- }
- let marker = null;
- if (typeof input === "number") {
- marker = this.timestampToMarker(input);
- } else if (input instanceof Date) {
- input = input.valueOf();
- if (!isNaN(input)) {
- marker = this.timestampToMarker(input);
- }
- } else if (Array.isArray(input)) {
- marker = arrayToUtcDate(input);
- }
- if (marker === null || !isValidDate(marker)) {
- return null;
- }
- return { marker, isTimeUnspecified: false, forcedTzo: null };
- }
- parse(s2) {
- let parts = parse(s2);
- if (parts === null) {
- return null;
- }
- let { marker } = parts;
- let forcedTzo = null;
- if (parts.timeZoneOffset !== null) {
- if (this.canComputeOffset) {
- marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1e3);
- } else {
- forcedTzo = parts.timeZoneOffset;
- }
- }
- return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo };
- }
- // Accessors
- getYear(marker) {
- return this.calendarSystem.getMarkerYear(marker);
- }
- getMonth(marker) {
- return this.calendarSystem.getMarkerMonth(marker);
- }
- getDay(marker) {
- return this.calendarSystem.getMarkerDay(marker);
- }
- // Adding / Subtracting
- add(marker, dur) {
- let a2 = this.calendarSystem.markerToArray(marker);
- a2[0] += dur.years;
- a2[1] += dur.months;
- a2[2] += dur.days;
- a2[6] += dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a2);
- }
- subtract(marker, dur) {
- let a2 = this.calendarSystem.markerToArray(marker);
- a2[0] -= dur.years;
- a2[1] -= dur.months;
- a2[2] -= dur.days;
- a2[6] -= dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a2);
- }
- addYears(marker, n) {
- let a2 = this.calendarSystem.markerToArray(marker);
- a2[0] += n;
- return this.calendarSystem.arrayToMarker(a2);
- }
- addMonths(marker, n) {
- let a2 = this.calendarSystem.markerToArray(marker);
- a2[1] += n;
- return this.calendarSystem.arrayToMarker(a2);
- }
- // Diffing Whole Units
- diffWholeYears(m0, m1) {
- let { calendarSystem } = this;
- if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
- return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
- }
- return null;
- }
- diffWholeMonths(m0, m1) {
- let { calendarSystem } = this;
- if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
- return calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0) + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
- }
- return null;
- }
- // Range / Duration
- greatestWholeUnit(m0, m1) {
- let n = this.diffWholeYears(m0, m1);
- if (n !== null) {
- return { unit: "year", value: n };
- }
- n = this.diffWholeMonths(m0, m1);
- if (n !== null) {
- return { unit: "month", value: n };
- }
- n = diffWholeWeeks(m0, m1);
- if (n !== null) {
- return { unit: "week", value: n };
- }
- n = diffWholeDays(m0, m1);
- if (n !== null) {
- return { unit: "day", value: n };
- }
- n = diffHours(m0, m1);
- if (isInt(n)) {
- return { unit: "hour", value: n };
- }
- n = diffMinutes(m0, m1);
- if (isInt(n)) {
- return { unit: "minute", value: n };
- }
- n = diffSeconds(m0, m1);
- if (isInt(n)) {
- return { unit: "second", value: n };
- }
- return { unit: "millisecond", value: m1.valueOf() - m0.valueOf() };
- }
- countDurationsBetween(m0, m1, d2) {
- let diff;
- if (d2.years) {
- diff = this.diffWholeYears(m0, m1);
- if (diff !== null) {
- return diff / asRoughYears(d2);
- }
- }
- if (d2.months) {
- diff = this.diffWholeMonths(m0, m1);
- if (diff !== null) {
- return diff / asRoughMonths(d2);
- }
- }
- if (d2.days) {
- diff = diffWholeDays(m0, m1);
- if (diff !== null) {
- return diff / asRoughDays(d2);
- }
- }
- return (m1.valueOf() - m0.valueOf()) / asRoughMs(d2);
- }
- // Start-Of
- // these DON'T return zoned-dates. only UTC start-of dates
- startOf(m2, unit) {
- if (unit === "year") {
- return this.startOfYear(m2);
- }
- if (unit === "month") {
- return this.startOfMonth(m2);
- }
- if (unit === "week") {
- return this.startOfWeek(m2);
- }
- if (unit === "day") {
- return startOfDay(m2);
- }
- if (unit === "hour") {
- return startOfHour(m2);
- }
- if (unit === "minute") {
- return startOfMinute(m2);
- }
- if (unit === "second") {
- return startOfSecond(m2);
- }
- return null;
- }
- startOfYear(m2) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m2)
- ]);
- }
- startOfMonth(m2) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m2),
- this.calendarSystem.getMarkerMonth(m2)
- ]);
- }
- startOfWeek(m2) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m2),
- this.calendarSystem.getMarkerMonth(m2),
- m2.getUTCDate() - (m2.getUTCDay() - this.weekDow + 7) % 7
- ]);
- }
- // Week Number
- computeWeekNumber(marker) {
- if (this.weekNumberFunc) {
- return this.weekNumberFunc(this.toDate(marker));
- }
- return weekOfYear(marker, this.weekDow, this.weekDoy);
- }
- // TODO: choke on timeZoneName: long
- format(marker, formatter, dateOptions = {}) {
- return formatter.format({
- marker,
- timeZoneOffset: dateOptions.forcedTzo != null ? dateOptions.forcedTzo : this.offsetForMarker(marker)
- }, this);
- }
- formatRange(start, end, formatter, dateOptions = {}) {
- if (dateOptions.isEndExclusive) {
- end = addMs(end, -1);
- }
- return formatter.formatRange({
- marker: start,
- timeZoneOffset: dateOptions.forcedStartTzo != null ? dateOptions.forcedStartTzo : this.offsetForMarker(start)
- }, {
- marker: end,
- timeZoneOffset: dateOptions.forcedEndTzo != null ? dateOptions.forcedEndTzo : this.offsetForMarker(end)
- }, this, dateOptions.defaultSeparator);
- }
- /*
- DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that,
- might as well use buildIsoString or some other util directly
- */
- formatIso(marker, extraOptions = {}) {
- let timeZoneOffset = null;
- if (!extraOptions.omitTimeZoneOffset) {
- if (extraOptions.forcedTzo != null) {
- timeZoneOffset = extraOptions.forcedTzo;
- } else {
- timeZoneOffset = this.offsetForMarker(marker);
- }
- }
- return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
- }
- // TimeZone
- timestampToMarker(ms) {
- if (this.timeZone === "local") {
- return arrayToUtcDate(dateToLocalArray(new Date(ms)));
- }
- if (this.timeZone === "UTC" || !this.namedTimeZoneImpl) {
- return new Date(ms);
- }
- return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
- }
- offsetForMarker(m2) {
- if (this.timeZone === "local") {
- return -arrayToLocalDate(dateToUtcArray(m2)).getTimezoneOffset();
- }
- if (this.timeZone === "UTC") {
- return 0;
- }
- if (this.namedTimeZoneImpl) {
- return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m2));
- }
- return null;
- }
- // Conversion
- toDate(m2, forcedTzo) {
- if (this.timeZone === "local") {
- return arrayToLocalDate(dateToUtcArray(m2));
- }
- if (this.timeZone === "UTC") {
- return new Date(m2.valueOf());
- }
- if (!this.namedTimeZoneImpl) {
- return new Date(m2.valueOf() - (forcedTzo || 0));
- }
- return new Date(m2.valueOf() - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m2)) * 1e3 * 60);
- }
- };
- var Theme = class {
- constructor(calendarOptions) {
- if (this.iconOverrideOption) {
- this.setIconOverride(calendarOptions[this.iconOverrideOption]);
- }
- }
- setIconOverride(iconOverrideHash) {
- let iconClassesCopy;
- let buttonName;
- if (typeof iconOverrideHash === "object" && iconOverrideHash) {
- iconClassesCopy = Object.assign({}, this.iconClasses);
- for (buttonName in iconOverrideHash) {
- iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
- }
- this.iconClasses = iconClassesCopy;
- } else if (iconOverrideHash === false) {
- this.iconClasses = {};
- }
- }
- applyIconOverridePrefix(className) {
- let prefix = this.iconOverridePrefix;
- if (prefix && className.indexOf(prefix) !== 0) {
- className = prefix + className;
- }
- return className;
- }
- getClass(key) {
- return this.classes[key] || "";
- }
- getIconClass(buttonName, isRtl) {
- let className;
- if (isRtl && this.rtlIconClasses) {
- className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName];
- } else {
- className = this.iconClasses[buttonName];
- }
- if (className) {
- return `${this.baseIconClass} ${className}`;
- }
- return "";
- }
- getCustomButtonIconClass(customButtonProps) {
- let className;
- if (this.iconOverrideCustomButtonOption) {
- className = customButtonProps[this.iconOverrideCustomButtonOption];
- if (className) {
- return `${this.baseIconClass} ${this.applyIconOverridePrefix(className)}`;
- }
- }
- return "";
- }
- };
- Theme.prototype.classes = {};
- Theme.prototype.iconClasses = {};
- Theme.prototype.baseIconClass = "";
- Theme.prototype.iconOverridePrefix = "";
- function flushSync(runBeforeFlush) {
- runBeforeFlush();
- let oldDebounceRendering = l.debounceRendering;
- let callbackQ = [];
- function execCallbackSync(callback) {
- callbackQ.push(callback);
- }
- l.debounceRendering = execCallbackSync;
- D(y(FakeComponent, {}), document.createElement("div"));
- while (callbackQ.length) {
- callbackQ.shift()();
- }
- l.debounceRendering = oldDebounceRendering;
- }
- var FakeComponent = class extends x {
- render() {
- return y("div", {});
- }
- componentDidMount() {
- this.setState({});
- }
- };
- function createContext(defaultValue) {
- let ContextType = G(defaultValue);
- let origProvider = ContextType.Provider;
- ContextType.Provider = function() {
- let isNew = !this.getChildContext;
- let children = origProvider.apply(this, arguments);
- if (isNew) {
- let subs = [];
- this.shouldComponentUpdate = (_props) => {
- if (this.props.value !== _props.value) {
- subs.forEach((c2) => {
- c2.context = _props.value;
- c2.forceUpdate();
- });
- }
- };
- this.sub = (c2) => {
- subs.push(c2);
- let old = c2.componentWillUnmount;
- c2.componentWillUnmount = () => {
- subs.splice(subs.indexOf(c2), 1);
- old && old.call(c2);
- };
- };
- }
- return children;
- };
- return ContextType;
- }
- var ScrollResponder = class {
- constructor(execFunc, emitter, scrollTime, scrollTimeReset) {
- this.execFunc = execFunc;
- this.emitter = emitter;
- this.scrollTime = scrollTime;
- this.scrollTimeReset = scrollTimeReset;
- this.handleScrollRequest = (request) => {
- this.queuedRequest = Object.assign({}, this.queuedRequest || {}, request);
- this.drain();
- };
- emitter.on("_scrollRequest", this.handleScrollRequest);
- this.fireInitialScroll();
- }
- detach() {
- this.emitter.off("_scrollRequest", this.handleScrollRequest);
- }
- update(isDatesNew) {
- if (isDatesNew && this.scrollTimeReset) {
- this.fireInitialScroll();
- } else {
- this.drain();
- }
- }
- fireInitialScroll() {
- this.handleScrollRequest({
- time: this.scrollTime
- });
- }
- drain() {
- if (this.queuedRequest && this.execFunc(this.queuedRequest)) {
- this.queuedRequest = null;
- }
- }
- };
- var ViewContextType = createContext({});
- function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
- return {
- dateEnv,
- options: viewOptions,
- pluginHooks,
- emitter,
- dispatch,
- getCurrentData,
- calendarApi,
- viewSpec,
- viewApi,
- dateProfileGenerator,
- theme,
- isRtl: viewOptions.direction === "rtl",
- addResizeHandler(handler) {
- emitter.on("_resize", handler);
- },
- removeResizeHandler(handler) {
- emitter.off("_resize", handler);
- },
- createScrollResponder(execFunc) {
- return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset);
- },
- registerInteractiveComponent,
- unregisterInteractiveComponent
- };
- }
- var PureComponent = class extends x {
- shouldComponentUpdate(nextProps, nextState) {
- if (this.debug) {
- console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state));
- }
- return !compareObjs(this.props, nextProps, this.propEquality) || !compareObjs(this.state, nextState, this.stateEquality);
- }
- // HACK for freakin' React StrictMode
- safeSetState(newState) {
- if (!compareObjs(this.state, Object.assign(Object.assign({}, this.state), newState), this.stateEquality)) {
- this.setState(newState);
- }
- }
- };
- PureComponent.addPropsEquality = addPropsEquality;
- PureComponent.addStateEquality = addStateEquality;
- PureComponent.contextType = ViewContextType;
- PureComponent.prototype.propEquality = {};
- PureComponent.prototype.stateEquality = {};
- var BaseComponent = class extends PureComponent {
- };
- BaseComponent.contextType = ViewContextType;
- function addPropsEquality(propEquality) {
- let hash = Object.create(this.prototype.propEquality);
- Object.assign(hash, propEquality);
- this.prototype.propEquality = hash;
- }
- function addStateEquality(stateEquality) {
- let hash = Object.create(this.prototype.stateEquality);
- Object.assign(hash, stateEquality);
- this.prototype.stateEquality = hash;
- }
- function setRef(ref, current) {
- if (typeof ref === "function") {
- ref(current);
- } else if (ref) {
- ref.current = current;
- }
- }
- var ContentInjector = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.id = guid();
- this.queuedDomNodes = [];
- this.currentDomNodes = [];
- this.handleEl = (el) => {
- const { options } = this.context;
- const { generatorName } = this.props;
- if (!options.customRenderingReplaces || !hasCustomRenderingHandler(generatorName, options)) {
- this.updateElRef(el);
- }
- };
- this.updateElRef = (el) => {
- if (this.props.elRef) {
- setRef(this.props.elRef, el);
- }
- };
- }
- render() {
- const { props, context } = this;
- const { options } = context;
- const { customGenerator, defaultGenerator, renderProps } = props;
- const attrs = buildElAttrs(props, [], this.handleEl);
- let useDefault = false;
- let innerContent;
- let queuedDomNodes = [];
- let currentGeneratorMeta;
- if (customGenerator != null) {
- const customGeneratorRes = typeof customGenerator === "function" ? customGenerator(renderProps, y) : customGenerator;
- if (customGeneratorRes === true) {
- useDefault = true;
- } else {
- const isObject = customGeneratorRes && typeof customGeneratorRes === "object";
- if (isObject && "html" in customGeneratorRes) {
- attrs.dangerouslySetInnerHTML = { __html: customGeneratorRes.html };
- } else if (isObject && "domNodes" in customGeneratorRes) {
- queuedDomNodes = Array.prototype.slice.call(customGeneratorRes.domNodes);
- } else if (isObject ? i(customGeneratorRes) : typeof customGeneratorRes !== "function") {
- innerContent = customGeneratorRes;
- } else {
- currentGeneratorMeta = customGeneratorRes;
- }
- }
- } else {
- useDefault = !hasCustomRenderingHandler(props.generatorName, options);
- }
- if (useDefault && defaultGenerator) {
- innerContent = defaultGenerator(renderProps);
- }
- this.queuedDomNodes = queuedDomNodes;
- this.currentGeneratorMeta = currentGeneratorMeta;
- return y(props.elTag, attrs, innerContent);
- }
- componentDidMount() {
- this.applyQueueudDomNodes();
- this.triggerCustomRendering(true);
- }
- componentDidUpdate() {
- this.applyQueueudDomNodes();
- this.triggerCustomRendering(true);
- }
- componentWillUnmount() {
- this.triggerCustomRendering(false);
- }
- triggerCustomRendering(isActive) {
- var _a;
- const { props, context } = this;
- const { handleCustomRendering, customRenderingMetaMap } = context.options;
- if (handleCustomRendering) {
- const generatorMeta = (_a = this.currentGeneratorMeta) !== null && _a !== void 0 ? _a : customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName];
- if (generatorMeta) {
- handleCustomRendering(Object.assign(Object.assign({
- id: this.id,
- isActive,
- containerEl: this.base,
- reportNewContainerEl: this.updateElRef,
- // front-end framework tells us about new container els
- generatorMeta
- }, props), { elClasses: (props.elClasses || []).filter(isTruthy) }));
- }
- }
- }
- applyQueueudDomNodes() {
- const { queuedDomNodes, currentDomNodes } = this;
- const el = this.base;
- if (!isArraysEqual(queuedDomNodes, currentDomNodes)) {
- currentDomNodes.forEach(removeElement);
- for (let newNode of queuedDomNodes) {
- el.appendChild(newNode);
- }
- this.currentDomNodes = queuedDomNodes;
- }
- }
- };
- ContentInjector.addPropsEquality({
- elClasses: isArraysEqual,
- elStyle: isPropsEqual,
- elAttrs: isNonHandlerPropsEqual,
- renderProps: isPropsEqual
- });
- function hasCustomRenderingHandler(generatorName, options) {
- var _a;
- return Boolean(options.handleCustomRendering && generatorName && ((_a = options.customRenderingMetaMap) === null || _a === void 0 ? void 0 : _a[generatorName]));
- }
- function buildElAttrs(props, extraClassNames, elRef) {
- const attrs = Object.assign(Object.assign({}, props.elAttrs), { ref: elRef });
- if (props.elClasses || extraClassNames) {
- attrs.className = (props.elClasses || []).concat(extraClassNames || []).concat(attrs.className || []).filter(Boolean).join(" ");
- }
- if (props.elStyle) {
- attrs.style = props.elStyle;
- }
- return attrs;
- }
- function isTruthy(val) {
- return Boolean(val);
- }
- var RenderId = createContext(0);
- var ContentContainer = class extends x {
- constructor() {
- super(...arguments);
- this.InnerContent = InnerContentInjector.bind(void 0, this);
- this.handleEl = (el) => {
- this.el = el;
- if (this.props.elRef) {
- setRef(this.props.elRef, el);
- if (el && this.didMountMisfire) {
- this.componentDidMount();
- }
- }
- };
- }
- render() {
- const { props } = this;
- const generatedClassNames = generateClassNames(props.classNameGenerator, props.renderProps);
- if (props.children) {
- const elAttrs = buildElAttrs(props, generatedClassNames, this.handleEl);
- const children = props.children(this.InnerContent, props.renderProps, elAttrs);
- if (props.elTag) {
- return y(props.elTag, elAttrs, children);
- } else {
- return children;
- }
- } else {
- return y(ContentInjector, Object.assign(Object.assign({}, props), { elRef: this.handleEl, elTag: props.elTag || "div", elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context }));
- }
- }
- componentDidMount() {
- var _a, _b;
- if (this.el) {
- (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.el }));
- } else {
- this.didMountMisfire = true;
- }
- }
- componentWillUnmount() {
- var _a, _b;
- (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.el }));
- }
- };
- ContentContainer.contextType = RenderId;
- function InnerContentInjector(containerComponent, props) {
- const parentProps = containerComponent.props;
- return y(ContentInjector, Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, customGenerator: parentProps.customGenerator, defaultGenerator: parentProps.defaultGenerator, renderId: containerComponent.context }, props));
- }
- function generateClassNames(classNameGenerator, renderProps) {
- const classNames = typeof classNameGenerator === "function" ? classNameGenerator(renderProps) : classNameGenerator || [];
- return typeof classNames === "string" ? [classNames] : classNames;
- }
- var ViewContainer = class extends BaseComponent {
- render() {
- let { props, context } = this;
- let { options } = context;
- let renderProps = { view: context.viewApi };
- return y(ContentContainer, Object.assign({}, props, { elTag: props.elTag || "div", elClasses: [
- ...buildViewClassNames(props.viewSpec),
- ...props.elClasses || []
- ], renderProps, classNameGenerator: options.viewClassNames, generatorName: void 0, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children);
- }
- };
- function buildViewClassNames(viewSpec) {
- return [
- `fc-${viewSpec.type}-view`,
- "fc-view"
- ];
- }
- function parseRange(input, dateEnv) {
- let start = null;
- let end = null;
- if (input.start) {
- start = dateEnv.createMarker(input.start);
- }
- if (input.end) {
- end = dateEnv.createMarker(input.end);
- }
- if (!start && !end) {
- return null;
- }
- if (start && end && end < start) {
- return null;
- }
- return { start, end };
- }
- function invertRanges(ranges, constraintRange) {
- let invertedRanges = [];
- let { start } = constraintRange;
- let i3;
- let dateRange;
- ranges.sort(compareRanges);
- for (i3 = 0; i3 < ranges.length; i3 += 1) {
- dateRange = ranges[i3];
- if (dateRange.start > start) {
- invertedRanges.push({ start, end: dateRange.start });
- }
- if (dateRange.end > start) {
- start = dateRange.end;
- }
- }
- if (start < constraintRange.end) {
- invertedRanges.push({ start, end: constraintRange.end });
- }
- return invertedRanges;
- }
- function compareRanges(range0, range1) {
- return range0.start.valueOf() - range1.start.valueOf();
- }
- function intersectRanges(range0, range1) {
- let { start, end } = range0;
- let newRange = null;
- if (range1.start !== null) {
- if (start === null) {
- start = range1.start;
- } else {
- start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
- }
- }
- if (range1.end != null) {
- if (end === null) {
- end = range1.end;
- } else {
- end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
- }
- }
- if (start === null || end === null || start < end) {
- newRange = { start, end };
- }
- return newRange;
- }
- function rangesEqual(range0, range1) {
- return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
- }
- function rangesIntersect(range0, range1) {
- return (range0.end === null || range1.start === null || range0.end > range1.start) && (range0.start === null || range1.end === null || range0.start < range1.end);
- }
- function rangeContainsRange(outerRange, innerRange) {
- return (outerRange.start === null || innerRange.start !== null && innerRange.start >= outerRange.start) && (outerRange.end === null || innerRange.end !== null && innerRange.end <= outerRange.end);
- }
- function rangeContainsMarker(range, date) {
- return (range.start === null || date >= range.start) && (range.end === null || date < range.end);
- }
- function constrainMarkerToRange(date, range) {
- if (range.start != null && date < range.start) {
- return range.start;
- }
- if (range.end != null && date >= range.end) {
- return new Date(range.end.valueOf() - 1);
- }
- return date;
- }
- function computeAlignedDayRange(timedRange) {
- let dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
- let start = startOfDay(timedRange.start);
- let end = addDays(start, dayCnt);
- return { start, end };
- }
- function computeVisibleDayRange(timedRange, nextDayThreshold = createDuration(0)) {
- let startDay = null;
- let endDay = null;
- if (timedRange.end) {
- endDay = startOfDay(timedRange.end);
- let endTimeMS = timedRange.end.valueOf() - endDay.valueOf();
- if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
- endDay = addDays(endDay, 1);
- }
- }
- if (timedRange.start) {
- startDay = startOfDay(timedRange.start);
- if (endDay && endDay <= startDay) {
- endDay = addDays(startDay, 1);
- }
- }
- return { start: startDay, end: endDay };
- }
- function diffDates(date0, date1, dateEnv, largeUnit) {
- if (largeUnit === "year") {
- return createDuration(dateEnv.diffWholeYears(date0, date1), "year");
- }
- if (largeUnit === "month") {
- return createDuration(dateEnv.diffWholeMonths(date0, date1), "month");
- }
- return diffDayAndTime(date0, date1);
- }
- function reduceCurrentDate(currentDate, action) {
- switch (action.type) {
- case "CHANGE_DATE":
- return action.dateMarker;
- default:
- return currentDate;
- }
- }
- function getInitialDate(options, dateEnv) {
- let initialDateInput = options.initialDate;
- if (initialDateInput != null) {
- return dateEnv.createMarker(initialDateInput);
- }
- return getNow(options.now, dateEnv);
- }
- function getNow(nowInput, dateEnv) {
- if (typeof nowInput === "function") {
- nowInput = nowInput();
- }
- if (nowInput == null) {
- return dateEnv.createNowMarker();
- }
- return dateEnv.createMarker(nowInput);
- }
- var DateProfileGenerator = class {
- constructor(props) {
- this.props = props;
- this.nowDate = getNow(props.nowInput, props.dateEnv);
- this.initHiddenDays();
- }
- /* Date Range Computation
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds a structure with info about what the dates/ranges will be for the "prev" view.
- buildPrev(currentDateProfile, currentDate, forceToValid) {
- let { dateEnv } = this.props;
- let prevDate = dateEnv.subtract(
- dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit),
- // important for start-of-month
- currentDateProfile.dateIncrement
- );
- return this.build(prevDate, -1, forceToValid);
- }
- // Builds a structure with info about what the dates/ranges will be for the "next" view.
- buildNext(currentDateProfile, currentDate, forceToValid) {
- let { dateEnv } = this.props;
- let nextDate = dateEnv.add(
- dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit),
- // important for start-of-month
- currentDateProfile.dateIncrement
- );
- return this.build(nextDate, 1, forceToValid);
- }
- // Builds a structure holding dates/ranges for rendering around the given date.
- // Optional direction param indicates whether the date is being incremented/decremented
- // from its previous value. decremented = -1, incremented = 1 (default).
- build(currentDate, direction, forceToValid = true) {
- let { props } = this;
- let validRange;
- let currentInfo;
- let isRangeAllDay;
- let renderRange;
- let activeRange;
- let isValid;
- validRange = this.buildValidRange();
- validRange = this.trimHiddenDays(validRange);
- if (forceToValid) {
- currentDate = constrainMarkerToRange(currentDate, validRange);
- }
- currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
- isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
- renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
- renderRange = this.trimHiddenDays(renderRange);
- activeRange = renderRange;
- if (!props.showNonCurrentDates) {
- activeRange = intersectRanges(activeRange, currentInfo.range);
- }
- activeRange = this.adjustActiveRange(activeRange);
- activeRange = intersectRanges(activeRange, validRange);
- isValid = rangesIntersect(currentInfo.range, validRange);
- if (!rangeContainsMarker(renderRange, currentDate)) {
- currentDate = renderRange.start;
- }
- return {
- currentDate,
- // constraint for where prev/next operations can go and where events can be dragged/resized to.
- // an object with optional start and end properties.
- validRange,
- // range the view is formally responsible for.
- // for example, a month view might have 1st-31st, excluding padded dates
- currentRange: currentInfo.range,
- // name of largest unit being displayed, like "month" or "week"
- currentRangeUnit: currentInfo.unit,
- isRangeAllDay,
- // dates that display events and accept drag-n-drop
- // will be `null` if no dates accept events
- activeRange,
- // date range with a rendered skeleton
- // includes not-active days that need some sort of DOM
- renderRange,
- // Duration object that denotes the first visible time of any given day
- slotMinTime: props.slotMinTime,
- // Duration object that denotes the exclusive visible end time of any given day
- slotMaxTime: props.slotMaxTime,
- isValid,
- // how far the current date will move for a prev/next operation
- dateIncrement: this.buildDateIncrement(currentInfo.duration)
- // pass a fallback (might be null) ^
- };
- }
- // Builds an object with optional start/end properties.
- // Indicates the minimum/maximum dates to display.
- // not responsible for trimming hidden days.
- buildValidRange() {
- let input = this.props.validRangeInput;
- let simpleInput = typeof input === "function" ? input.call(this.props.calendarApi, this.nowDate) : input;
- return this.refineRange(simpleInput) || { start: null, end: null };
- }
- // Builds a structure with info about the "current" range, the range that is
- // highlighted as being the current month for example.
- // See build() for a description of `direction`.
- // Guaranteed to have `range` and `unit` properties. `duration` is optional.
- buildCurrentRangeInfo(date, direction) {
- let { props } = this;
- let duration = null;
- let unit = null;
- let range = null;
- let dayCount;
- if (props.duration) {
- duration = props.duration;
- unit = props.durationUnit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- } else if (dayCount = this.props.dayCount) {
- unit = "day";
- range = this.buildRangeFromDayCount(date, direction, dayCount);
- } else if (range = this.buildCustomVisibleRange(date)) {
- unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit;
- } else {
- duration = this.getFallbackDuration();
- unit = greatestDurationDenominator(duration).unit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- return { duration, unit, range };
- }
- getFallbackDuration() {
- return createDuration({ day: 1 });
- }
- // Returns a new activeRange to have time values (un-ambiguate)
- // slotMinTime or slotMaxTime causes the range to expand.
- adjustActiveRange(range) {
- let { dateEnv, usesMinMaxTime, slotMinTime, slotMaxTime } = this.props;
- let { start, end } = range;
- if (usesMinMaxTime) {
- if (asRoughDays(slotMinTime) < 0) {
- start = startOfDay(start);
- start = dateEnv.add(start, slotMinTime);
- }
- if (asRoughDays(slotMaxTime) > 1) {
- end = startOfDay(end);
- end = addDays(end, -1);
- end = dateEnv.add(end, slotMaxTime);
- }
- }
- return { start, end };
- }
- // Builds the "current" range when it is specified as an explicit duration.
- // `unit` is the already-computed greatestDurationDenominator unit of duration.
- buildRangeFromDuration(date, direction, duration, unit) {
- let { dateEnv, dateAlignment } = this.props;
- let start;
- let end;
- let res;
- if (!dateAlignment) {
- let { dateIncrement } = this.props;
- if (dateIncrement) {
- if (asRoughMs(dateIncrement) < asRoughMs(duration)) {
- dateAlignment = greatestDurationDenominator(dateIncrement).unit;
- } else {
- dateAlignment = unit;
- }
- } else {
- dateAlignment = unit;
- }
- }
- if (asRoughDays(duration) <= 1) {
- if (this.isHiddenDay(start)) {
- start = this.skipHiddenDays(start, direction);
- start = startOfDay(start);
- }
- }
- function computeRes() {
- start = dateEnv.startOf(date, dateAlignment);
- end = dateEnv.add(start, duration);
- res = { start, end };
- }
- computeRes();
- if (!this.trimHiddenDays(res)) {
- date = this.skipHiddenDays(date, direction);
- computeRes();
- }
- return res;
- }
- // Builds the "current" range when a dayCount is specified.
- buildRangeFromDayCount(date, direction, dayCount) {
- let { dateEnv, dateAlignment } = this.props;
- let runningCount = 0;
- let start = date;
- let end;
- if (dateAlignment) {
- start = dateEnv.startOf(start, dateAlignment);
- }
- start = startOfDay(start);
- start = this.skipHiddenDays(start, direction);
- end = start;
- do {
- end = addDays(end, 1);
- if (!this.isHiddenDay(end)) {
- runningCount += 1;
- }
- } while (runningCount < dayCount);
- return { start, end };
- }
- // Builds a normalized range object for the "visible" range,
- // which is a way to define the currentRange and activeRange at the same time.
- buildCustomVisibleRange(date) {
- let { props } = this;
- let input = props.visibleRangeInput;
- let simpleInput = typeof input === "function" ? input.call(props.calendarApi, props.dateEnv.toDate(date)) : input;
- let range = this.refineRange(simpleInput);
- if (range && (range.start == null || range.end == null)) {
- return null;
- }
- return range;
- }
- // Computes the range that will represent the element/cells for *rendering*,
- // but which may have voided days/times.
- // not responsible for trimming hidden days.
- buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) {
- return currentRange;
- }
- // Compute the duration value that should be added/substracted to the current date
- // when a prev/next operation happens.
- buildDateIncrement(fallback) {
- let { dateIncrement } = this.props;
- let customAlignment;
- if (dateIncrement) {
- return dateIncrement;
- }
- if (customAlignment = this.props.dateAlignment) {
- return createDuration(1, customAlignment);
- }
- if (fallback) {
- return fallback;
- }
- return createDuration({ days: 1 });
- }
- refineRange(rangeInput) {
- if (rangeInput) {
- let range = parseRange(rangeInput, this.props.dateEnv);
- if (range) {
- range = computeVisibleDayRange(range);
- }
- return range;
- }
- return null;
- }
- /* Hidden Days
- ------------------------------------------------------------------------------------------------------------------*/
- // Initializes internal variables related to calculating hidden days-of-week
- initHiddenDays() {
- let hiddenDays = this.props.hiddenDays || [];
- let isHiddenDayHash = [];
- let dayCnt = 0;
- let i3;
- if (this.props.weekends === false) {
- hiddenDays.push(0, 6);
- }
- for (i3 = 0; i3 < 7; i3 += 1) {
- if (!(isHiddenDayHash[i3] = hiddenDays.indexOf(i3) !== -1)) {
- dayCnt += 1;
- }
- }
- if (!dayCnt) {
- throw new Error("invalid hiddenDays");
- }
- this.isHiddenDayHash = isHiddenDayHash;
- }
- // Remove days from the beginning and end of the range that are computed as hidden.
- // If the whole range is trimmed off, returns null
- trimHiddenDays(range) {
- let { start, end } = range;
- if (start) {
- start = this.skipHiddenDays(start);
- }
- if (end) {
- end = this.skipHiddenDays(end, -1, true);
- }
- if (start == null || end == null || start < end) {
- return { start, end };
- }
- return null;
- }
- // Is the current day hidden?
- // `day` is a day-of-week index (0-6), or a Date (used for UTC)
- isHiddenDay(day) {
- if (day instanceof Date) {
- day = day.getUTCDay();
- }
- return this.isHiddenDayHash[day];
- }
- // Incrementing the current day until it is no longer a hidden day, returning a copy.
- // DOES NOT CONSIDER validRange!
- // If the initial value of `date` is not a hidden day, don't do anything.
- // Pass `isExclusive` as `true` if you are dealing with an end date.
- // `inc` defaults to `1` (increment one day forward each time)
- skipHiddenDays(date, inc = 1, isExclusive = false) {
- while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
- date = addDays(date, inc);
- }
- return date;
- }
- };
- function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
- return {
- instanceId: guid(),
- defId,
- range,
- forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
- forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
- };
- }
- function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) {
- for (let i3 = 0; i3 < recurringTypes.length; i3 += 1) {
- let parsed = recurringTypes[i3].parse(refined, dateEnv);
- if (parsed) {
- let { allDay } = refined;
- if (allDay == null) {
- allDay = defaultAllDay;
- if (allDay == null) {
- allDay = parsed.allDayGuess;
- if (allDay == null) {
- allDay = false;
- }
- }
- }
- return {
- allDay,
- duration: parsed.duration,
- typeData: parsed.typeData,
- typeId: i3
- };
- }
- }
- return null;
- }
- function expandRecurring(eventStore, framingRange, context) {
- let { dateEnv, pluginHooks, options } = context;
- let { defs, instances } = eventStore;
- instances = filterHash(instances, (instance) => !defs[instance.defId].recurringDef);
- for (let defId in defs) {
- let def = defs[defId];
- if (def.recurringDef) {
- let { duration } = def.recurringDef;
- if (!duration) {
- duration = def.allDay ? options.defaultAllDayEventDuration : options.defaultTimedEventDuration;
- }
- let starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes);
- for (let start of starts) {
- let instance = createEventInstance(defId, {
- start,
- end: dateEnv.add(start, duration)
- });
- instances[instance.instanceId] = instance;
- }
- }
- }
- return { defs, instances };
- }
- function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
- let typeDef = recurringTypes[eventDef.recurringDef.typeId];
- let markers = typeDef.expand(eventDef.recurringDef.typeData, {
- start: dateEnv.subtract(framingRange.start, duration),
- end: framingRange.end
- }, dateEnv);
- if (eventDef.allDay) {
- markers = markers.map(startOfDay);
- }
- return markers;
- }
- var EVENT_NON_DATE_REFINERS = {
- id: String,
- groupId: String,
- title: String,
- url: String,
- interactive: Boolean
- };
- var EVENT_DATE_REFINERS = {
- start: identity,
- end: identity,
- date: identity,
- allDay: Boolean
- };
- var EVENT_REFINERS = Object.assign(Object.assign(Object.assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity });
- function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context), defIdMap, instanceIdMap) {
- let { refined, extra } = refineEventDef(raw, context, refiners);
- let defaultAllDay = computeIsDefaultAllDay(eventSource, context);
- let recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes);
- if (recurringRes) {
- let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : "", recurringRes.allDay, Boolean(recurringRes.duration), context, defIdMap);
- def.recurringDef = {
- typeId: recurringRes.typeId,
- typeData: recurringRes.typeData,
- duration: recurringRes.duration
- };
- return { def, instance: null };
- }
- let singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange);
- if (singleRes) {
- let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : "", singleRes.allDay, singleRes.hasEnd, context, defIdMap);
- let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
- if (instanceIdMap && def.publicId && instanceIdMap[def.publicId]) {
- instance.instanceId = instanceIdMap[def.publicId];
- }
- return { def, instance };
- }
- return null;
- }
- function refineEventDef(raw, context, refiners = buildEventRefiners(context)) {
- return refineProps(raw, refiners);
- }
- function buildEventRefiners(context) {
- return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners);
- }
- function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context, defIdMap) {
- let def = {
- title: refined.title || "",
- groupId: refined.groupId || "",
- publicId: refined.id || "",
- url: refined.url || "",
- recurringDef: null,
- defId: (defIdMap && refined.id ? defIdMap[refined.id] : "") || guid(),
- sourceId,
- allDay,
- hasEnd,
- interactive: refined.interactive,
- ui: createEventUi(refined, context),
- extendedProps: Object.assign(Object.assign({}, refined.extendedProps || {}), extra)
- };
- for (let memberAdder of context.pluginHooks.eventDefMemberAdders) {
- Object.assign(def, memberAdder(refined));
- }
- Object.freeze(def.ui.classNames);
- Object.freeze(def.extendedProps);
- return def;
- }
- function parseSingle(refined, defaultAllDay, context, allowOpenRange) {
- let { allDay } = refined;
- let startMeta;
- let startMarker = null;
- let hasEnd = false;
- let endMeta;
- let endMarker = null;
- let startInput = refined.start != null ? refined.start : refined.date;
- startMeta = context.dateEnv.createMarkerMeta(startInput);
- if (startMeta) {
- startMarker = startMeta.marker;
- } else if (!allowOpenRange) {
- return null;
- }
- if (refined.end != null) {
- endMeta = context.dateEnv.createMarkerMeta(refined.end);
- }
- if (allDay == null) {
- if (defaultAllDay != null) {
- allDay = defaultAllDay;
- } else {
- allDay = (!startMeta || startMeta.isTimeUnspecified) && (!endMeta || endMeta.isTimeUnspecified);
- }
- }
- if (allDay && startMarker) {
- startMarker = startOfDay(startMarker);
- }
- if (endMeta) {
- endMarker = endMeta.marker;
- if (allDay) {
- endMarker = startOfDay(endMarker);
- }
- if (startMarker && endMarker <= startMarker) {
- endMarker = null;
- }
- }
- if (endMarker) {
- hasEnd = true;
- } else if (!allowOpenRange) {
- hasEnd = context.options.forceEventDuration || false;
- endMarker = context.dateEnv.add(startMarker, allDay ? context.options.defaultAllDayEventDuration : context.options.defaultTimedEventDuration);
- }
- return {
- allDay,
- hasEnd,
- range: { start: startMarker, end: endMarker },
- forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
- forcedEndTzo: endMeta ? endMeta.forcedTzo : null
- };
- }
- function computeIsDefaultAllDay(eventSource, context) {
- let res = null;
- if (eventSource) {
- res = eventSource.defaultAllDay;
- }
- if (res == null) {
- res = context.options.defaultAllDay;
- }
- return res;
- }
- function parseEvents(rawEvents, eventSource, context, allowOpenRange, defIdMap, instanceIdMap) {
- let eventStore = createEmptyEventStore();
- let eventRefiners = buildEventRefiners(context);
- for (let rawEvent of rawEvents) {
- let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners, defIdMap, instanceIdMap);
- if (tuple) {
- eventTupleToStore(tuple, eventStore);
- }
- }
- return eventStore;
- }
- function eventTupleToStore(tuple, eventStore = createEmptyEventStore()) {
- eventStore.defs[tuple.def.defId] = tuple.def;
- if (tuple.instance) {
- eventStore.instances[tuple.instance.instanceId] = tuple.instance;
- }
- return eventStore;
- }
- function getRelevantEvents(eventStore, instanceId) {
- let instance = eventStore.instances[instanceId];
- if (instance) {
- let def = eventStore.defs[instance.defId];
- let newStore = filterEventStoreDefs(eventStore, (lookDef) => isEventDefsGrouped(def, lookDef));
- newStore.defs[def.defId] = def;
- newStore.instances[instance.instanceId] = instance;
- return newStore;
- }
- return createEmptyEventStore();
- }
- function isEventDefsGrouped(def0, def1) {
- return Boolean(def0.groupId && def0.groupId === def1.groupId);
- }
- function createEmptyEventStore() {
- return { defs: {}, instances: {} };
- }
- function mergeEventStores(store0, store1) {
- return {
- defs: Object.assign(Object.assign({}, store0.defs), store1.defs),
- instances: Object.assign(Object.assign({}, store0.instances), store1.instances)
- };
- }
- function filterEventStoreDefs(eventStore, filterFunc) {
- let defs = filterHash(eventStore.defs, filterFunc);
- let instances = filterHash(eventStore.instances, (instance) => defs[instance.defId]);
- return { defs, instances };
- }
- function excludeSubEventStore(master, sub) {
- let { defs, instances } = master;
- let filteredDefs = {};
- let filteredInstances = {};
- for (let defId in defs) {
- if (!sub.defs[defId]) {
- filteredDefs[defId] = defs[defId];
- }
- }
- for (let instanceId in instances) {
- if (!sub.instances[instanceId] && // not explicitly excluded
- filteredDefs[instances[instanceId].defId]) {
- filteredInstances[instanceId] = instances[instanceId];
- }
- }
- return {
- defs: filteredDefs,
- instances: filteredInstances
- };
- }
- function normalizeConstraint(input, context) {
- if (Array.isArray(input)) {
- return parseEvents(input, null, context, true);
- }
- if (typeof input === "object" && input) {
- return parseEvents([input], null, context, true);
- }
- if (input != null) {
- return String(input);
- }
- return null;
- }
- function parseClassNames(raw) {
- if (Array.isArray(raw)) {
- return raw;
- }
- if (typeof raw === "string") {
- return raw.split(/\s+/);
- }
- return [];
- }
- var EVENT_UI_REFINERS = {
- display: String,
- editable: Boolean,
- startEditable: Boolean,
- durationEditable: Boolean,
- constraint: identity,
- overlap: identity,
- allow: identity,
- className: parseClassNames,
- classNames: parseClassNames,
- color: String,
- backgroundColor: String,
- borderColor: String,
- textColor: String
- };
- var EMPTY_EVENT_UI = {
- display: null,
- startEditable: null,
- durationEditable: null,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: "",
- borderColor: "",
- textColor: "",
- classNames: []
- };
- function createEventUi(refined, context) {
- let constraint = normalizeConstraint(refined.constraint, context);
- return {
- display: refined.display || null,
- startEditable: refined.startEditable != null ? refined.startEditable : refined.editable,
- durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable,
- constraints: constraint != null ? [constraint] : [],
- overlap: refined.overlap != null ? refined.overlap : null,
- allows: refined.allow != null ? [refined.allow] : [],
- backgroundColor: refined.backgroundColor || refined.color || "",
- borderColor: refined.borderColor || refined.color || "",
- textColor: refined.textColor || "",
- classNames: (refined.className || []).concat(refined.classNames || [])
- // join singular and plural
- };
- }
- function combineEventUis(uis) {
- return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
- }
- function combineTwoEventUis(item0, item1) {
- return {
- display: item1.display != null ? item1.display : item0.display,
- startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
- durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
- constraints: item0.constraints.concat(item1.constraints),
- overlap: typeof item1.overlap === "boolean" ? item1.overlap : item0.overlap,
- allows: item0.allows.concat(item1.allows),
- backgroundColor: item1.backgroundColor || item0.backgroundColor,
- borderColor: item1.borderColor || item0.borderColor,
- textColor: item1.textColor || item0.textColor,
- classNames: item0.classNames.concat(item1.classNames)
- };
- }
- var EVENT_SOURCE_REFINERS = {
- id: String,
- defaultAllDay: Boolean,
- url: String,
- format: String,
- events: identity,
- eventDataTransform: identity,
- // for any network-related sources
- success: identity,
- failure: identity
- };
- function parseEventSource(raw, context, refiners = buildEventSourceRefiners(context)) {
- let rawObj;
- if (typeof raw === "string") {
- rawObj = { url: raw };
- } else if (typeof raw === "function" || Array.isArray(raw)) {
- rawObj = { events: raw };
- } else if (typeof raw === "object" && raw) {
- rawObj = raw;
- }
- if (rawObj) {
- let { refined, extra } = refineProps(rawObj, refiners);
- let metaRes = buildEventSourceMeta(refined, context);
- if (metaRes) {
- return {
- _raw: raw,
- isFetching: false,
- latestFetchId: "",
- fetchRange: null,
- defaultAllDay: refined.defaultAllDay,
- eventDataTransform: refined.eventDataTransform,
- success: refined.success,
- failure: refined.failure,
- publicId: refined.id || "",
- sourceId: guid(),
- sourceDefId: metaRes.sourceDefId,
- meta: metaRes.meta,
- ui: createEventUi(refined, context),
- extendedProps: extra
- };
- }
- }
- return null;
- }
- function buildEventSourceRefiners(context) {
- return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners);
- }
- function buildEventSourceMeta(raw, context) {
- let defs = context.pluginHooks.eventSourceDefs;
- for (let i3 = defs.length - 1; i3 >= 0; i3 -= 1) {
- let def = defs[i3];
- let meta = def.parseMeta(raw);
- if (meta) {
- return { sourceDefId: i3, meta };
- }
- }
- return null;
- }
- function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
- switch (action.type) {
- case "RECEIVE_EVENTS":
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
- case "RESET_RAW_EVENTS":
- return resetRawEvents(eventStore, eventSources[action.sourceId], action.rawEvents, dateProfile.activeRange, context);
- case "ADD_EVENTS":
- return addEvent(
- eventStore,
- action.eventStore,
- // new ones
- dateProfile ? dateProfile.activeRange : null,
- context
- );
- case "RESET_EVENTS":
- return action.eventStore;
- case "MERGE_EVENTS":
- return mergeEventStores(eventStore, action.eventStore);
- case "PREV":
- case "NEXT":
- case "CHANGE_DATE":
- case "CHANGE_VIEW_TYPE":
- if (dateProfile) {
- return expandRecurring(eventStore, dateProfile.activeRange, context);
- }
- return eventStore;
- case "REMOVE_EVENTS":
- return excludeSubEventStore(eventStore, action.eventStore);
- case "REMOVE_EVENT_SOURCE":
- return excludeEventsBySourceId(eventStore, action.sourceId);
- case "REMOVE_ALL_EVENT_SOURCES":
- return filterEventStoreDefs(eventStore, (eventDef) => !eventDef.sourceId);
- case "REMOVE_ALL_EVENTS":
- return createEmptyEventStore();
- default:
- return eventStore;
- }
- }
- function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId) {
- let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
- if (fetchRange) {
- subset = expandRecurring(subset, fetchRange, context);
- }
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
- }
- return eventStore;
- }
- function resetRawEvents(existingEventStore, eventSource, rawEvents, activeRange, context) {
- const { defIdMap, instanceIdMap } = buildPublicIdMaps(existingEventStore);
- let newEventStore = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context, false, defIdMap, instanceIdMap);
- return expandRecurring(newEventStore, activeRange, context);
- }
- function transformRawEvents(rawEvents, eventSource, context) {
- let calEachTransform = context.options.eventDataTransform;
- let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
- if (sourceEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
- }
- if (calEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
- }
- return rawEvents;
- }
- function transformEachRawEvent(rawEvents, func) {
- let refinedEvents;
- if (!func) {
- refinedEvents = rawEvents;
- } else {
- refinedEvents = [];
- for (let rawEvent of rawEvents) {
- let refinedEvent = func(rawEvent);
- if (refinedEvent) {
- refinedEvents.push(refinedEvent);
- } else if (refinedEvent == null) {
- refinedEvents.push(rawEvent);
- }
- }
- }
- return refinedEvents;
- }
- function addEvent(eventStore, subset, expandRange, context) {
- if (expandRange) {
- subset = expandRecurring(subset, expandRange, context);
- }
- return mergeEventStores(eventStore, subset);
- }
- function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) {
- let { defs } = eventStore;
- let instances = mapHash(eventStore.instances, (instance) => {
- let def = defs[instance.defId];
- if (def.allDay) {
- return instance;
- }
- return Object.assign(Object.assign({}, instance), { range: {
- start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
- end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
- }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
- });
- return { defs, instances };
- }
- function excludeEventsBySourceId(eventStore, sourceId) {
- return filterEventStoreDefs(eventStore, (eventDef) => eventDef.sourceId !== sourceId);
- }
- function excludeInstances(eventStore, removals) {
- return {
- defs: eventStore.defs,
- instances: filterHash(eventStore.instances, (instance) => !removals[instance.instanceId])
- };
- }
- function buildPublicIdMaps(eventStore) {
- const { defs, instances } = eventStore;
- const defIdMap = {};
- const instanceIdMap = {};
- for (let defId in defs) {
- const def = defs[defId];
- const { publicId } = def;
- if (publicId) {
- defIdMap[publicId] = defId;
- }
- }
- for (let instanceId in instances) {
- const instance = instances[instanceId];
- const def = defs[instance.defId];
- const { publicId } = def;
- if (publicId) {
- instanceIdMap[publicId] = instanceId;
- }
- }
- return { defIdMap, instanceIdMap };
- }
- var Emitter = class {
- constructor() {
- this.handlers = {};
- this.thisContext = null;
- }
- setThisContext(thisContext) {
- this.thisContext = thisContext;
- }
- setOptions(options) {
- this.options = options;
- }
- on(type, handler) {
- addToHash(this.handlers, type, handler);
- }
- off(type, handler) {
- removeFromHash(this.handlers, type, handler);
- }
- trigger(type, ...args) {
- let attachedHandlers = this.handlers[type] || [];
- let optionHandler = this.options && this.options[type];
- let handlers = [].concat(optionHandler || [], attachedHandlers);
- for (let handler of handlers) {
- handler.apply(this.thisContext, args);
- }
- }
- hasHandlers(type) {
- return Boolean(this.handlers[type] && this.handlers[type].length || this.options && this.options[type]);
- }
- };
- function addToHash(hash, type, handler) {
- (hash[type] || (hash[type] = [])).push(handler);
- }
- function removeFromHash(hash, type, handler) {
- if (handler) {
- if (hash[type]) {
- hash[type] = hash[type].filter((func) => func !== handler);
- }
- } else {
- delete hash[type];
- }
- }
- var DEF_DEFAULTS = {
- startTime: "09:00",
- endTime: "17:00",
- daysOfWeek: [1, 2, 3, 4, 5],
- display: "inverse-background",
- classNames: "fc-non-business",
- groupId: "_businessHours"
- // so multiple defs get grouped
- };
- function parseBusinessHours(input, context) {
- return parseEvents(refineInputs(input), null, context);
- }
- function refineInputs(input) {
- let rawDefs;
- if (input === true) {
- rawDefs = [{}];
- } else if (Array.isArray(input)) {
- rawDefs = input.filter((rawDef) => rawDef.daysOfWeek);
- } else if (typeof input === "object" && input) {
- rawDefs = [input];
- } else {
- rawDefs = [];
- }
- rawDefs = rawDefs.map((rawDef) => Object.assign(Object.assign({}, DEF_DEFAULTS), rawDef));
- return rawDefs;
- }
- function triggerDateSelect(selection, pev, context) {
- context.emitter.trigger("select", Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }));
- }
- function triggerDateUnselect(pev, context) {
- context.emitter.trigger("unselect", {
- jsEvent: pev ? pev.origEvent : null,
- view: context.viewApi || context.calendarApi.view
- });
- }
- function buildDateSpanApiWithContext(dateSpan, context) {
- let props = {};
- for (let transform of context.pluginHooks.dateSpanTransforms) {
- Object.assign(props, transform(dateSpan, context));
- }
- Object.assign(props, buildDateSpanApi(dateSpan, context.dateEnv));
- return props;
- }
- function getDefaultEventEnd(allDay, marker, context) {
- let { dateEnv, options } = context;
- let end = marker;
- if (allDay) {
- end = startOfDay(end);
- end = dateEnv.add(end, options.defaultAllDayEventDuration);
- } else {
- end = dateEnv.add(end, options.defaultTimedEventDuration);
- }
- return end;
- }
- function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) {
- let eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
- let dest = createEmptyEventStore();
- for (let defId in eventStore.defs) {
- let def = eventStore.defs[defId];
- dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context);
- }
- for (let instanceId in eventStore.instances) {
- let instance = eventStore.instances[instanceId];
- let def = dest.defs[instance.defId];
- dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context);
- }
- return dest;
- }
- function applyMutationToEventDef(eventDef, eventConfig, mutation, context) {
- let standardProps = mutation.standardProps || {};
- if (standardProps.hasEnd == null && eventConfig.durationEditable && (mutation.startDelta || mutation.endDelta)) {
- standardProps.hasEnd = true;
- }
- let copy = Object.assign(Object.assign(Object.assign({}, eventDef), standardProps), { ui: Object.assign(Object.assign({}, eventDef.ui), standardProps.ui) });
- if (mutation.extendedProps) {
- copy.extendedProps = Object.assign(Object.assign({}, copy.extendedProps), mutation.extendedProps);
- }
- for (let applier of context.pluginHooks.eventDefMutationAppliers) {
- applier(copy, mutation, context);
- }
- if (!copy.hasEnd && context.options.forceEventDuration) {
- copy.hasEnd = true;
- }
- return copy;
- }
- function applyMutationToEventInstance(eventInstance, eventDef, eventConfig, mutation, context) {
- let { dateEnv } = context;
- let forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
- let clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
- let copy = Object.assign({}, eventInstance);
- if (forceAllDay) {
- copy.range = computeAlignedDayRange(copy.range);
- }
- if (mutation.datesDelta && eventConfig.startEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.datesDelta),
- end: dateEnv.add(copy.range.end, mutation.datesDelta)
- };
- }
- if (mutation.startDelta && eventConfig.durationEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.startDelta),
- end: copy.range.end
- };
- }
- if (mutation.endDelta && eventConfig.durationEditable) {
- copy.range = {
- start: copy.range.start,
- end: dateEnv.add(copy.range.end, mutation.endDelta)
- };
- }
- if (clearEnd) {
- copy.range = {
- start: copy.range.start,
- end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context)
- };
- }
- if (eventDef.allDay) {
- copy.range = {
- start: startOfDay(copy.range.start),
- end: startOfDay(copy.range.end)
- };
- }
- if (copy.range.end < copy.range.start) {
- copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context);
- }
- return copy;
- }
- var EventSourceImpl = class {
- constructor(context, internalEventSource) {
- this.context = context;
- this.internalEventSource = internalEventSource;
- }
- remove() {
- this.context.dispatch({
- type: "REMOVE_EVENT_SOURCE",
- sourceId: this.internalEventSource.sourceId
- });
- }
- refetch() {
- this.context.dispatch({
- type: "FETCH_EVENT_SOURCES",
- sourceIds: [this.internalEventSource.sourceId],
- isRefetch: true
- });
- }
- get id() {
- return this.internalEventSource.publicId;
- }
- get url() {
- return this.internalEventSource.meta.url;
- }
- get format() {
- return this.internalEventSource.meta.format;
- }
- };
- var EventImpl = class _EventImpl {
- // instance will be null if expressing a recurring event that has no current instances,
- // OR if trying to validate an incoming external event that has no dates assigned
- constructor(context, def, instance) {
- this._context = context;
- this._def = def;
- this._instance = instance || null;
- }
- /*
- TODO: make event struct more responsible for this
- */
- setProp(name, val) {
- if (name in EVENT_DATE_REFINERS) {
- console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");
- } else if (name === "id") {
- val = EVENT_NON_DATE_REFINERS[name](val);
- this.mutate({
- standardProps: { publicId: val }
- // hardcoded internal name
- });
- } else if (name in EVENT_NON_DATE_REFINERS) {
- val = EVENT_NON_DATE_REFINERS[name](val);
- this.mutate({
- standardProps: { [name]: val }
- });
- } else if (name in EVENT_UI_REFINERS) {
- let ui = EVENT_UI_REFINERS[name](val);
- if (name === "color") {
- ui = { backgroundColor: val, borderColor: val };
- } else if (name === "editable") {
- ui = { startEditable: val, durationEditable: val };
- } else {
- ui = { [name]: val };
- }
- this.mutate({
- standardProps: { ui }
- });
- } else {
- console.warn(`Could not set prop '${name}'. Use setExtendedProp instead.`);
- }
- }
- setExtendedProp(name, val) {
- this.mutate({
- extendedProps: { [name]: val }
- });
- }
- setStart(startInput, options = {}) {
- let { dateEnv } = this._context;
- let start = dateEnv.createMarker(startInput);
- if (start && this._instance) {
- let instanceRange = this._instance.range;
- let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
- if (options.maintainDuration) {
- this.mutate({ datesDelta: startDelta });
- } else {
- this.mutate({ startDelta });
- }
- }
- }
- setEnd(endInput, options = {}) {
- let { dateEnv } = this._context;
- let end;
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) {
- return;
- }
- }
- if (this._instance) {
- if (end) {
- let endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
- this.mutate({ endDelta });
- } else {
- this.mutate({ standardProps: { hasEnd: false } });
- }
- }
- }
- setDates(startInput, endInput, options = {}) {
- let { dateEnv } = this._context;
- let standardProps = { allDay: options.allDay };
- let start = dateEnv.createMarker(startInput);
- let end;
- if (!start) {
- return;
- }
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) {
- return;
- }
- }
- if (this._instance) {
- let instanceRange = this._instance.range;
- if (options.allDay === true) {
- instanceRange = computeAlignedDayRange(instanceRange);
- }
- let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
- if (end) {
- let endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
- if (durationsEqual(startDelta, endDelta)) {
- this.mutate({ datesDelta: startDelta, standardProps });
- } else {
- this.mutate({ startDelta, endDelta, standardProps });
- }
- } else {
- standardProps.hasEnd = false;
- this.mutate({ datesDelta: startDelta, standardProps });
- }
- }
- }
- moveStart(deltaInput) {
- let delta = createDuration(deltaInput);
- if (delta) {
- this.mutate({ startDelta: delta });
- }
- }
- moveEnd(deltaInput) {
- let delta = createDuration(deltaInput);
- if (delta) {
- this.mutate({ endDelta: delta });
- }
- }
- moveDates(deltaInput) {
- let delta = createDuration(deltaInput);
- if (delta) {
- this.mutate({ datesDelta: delta });
- }
- }
- setAllDay(allDay, options = {}) {
- let standardProps = { allDay };
- let { maintainDuration } = options;
- if (maintainDuration == null) {
- maintainDuration = this._context.options.allDayMaintainDuration;
- }
- if (this._def.allDay !== allDay) {
- standardProps.hasEnd = maintainDuration;
- }
- this.mutate({ standardProps });
- }
- formatRange(formatInput) {
- let { dateEnv } = this._context;
- let instance = this._instance;
- let formatter = createFormatter(formatInput);
- if (this._def.hasEnd) {
- return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
- forcedStartTzo: instance.forcedStartTzo,
- forcedEndTzo: instance.forcedEndTzo
- });
- }
- return dateEnv.format(instance.range.start, formatter, {
- forcedTzo: instance.forcedStartTzo
- });
- }
- mutate(mutation) {
- let instance = this._instance;
- if (instance) {
- let def = this._def;
- let context = this._context;
- let { eventStore } = context.getCurrentData();
- let relevantEvents = getRelevantEvents(eventStore, instance.instanceId);
- let eventConfigBase = {
- "": {
- display: "",
- startEditable: true,
- durationEditable: true,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: "",
- borderColor: "",
- textColor: "",
- classNames: []
- }
- };
- relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context);
- let oldEvent = new _EventImpl(context, def, instance);
- this._def = relevantEvents.defs[def.defId];
- this._instance = relevantEvents.instances[instance.instanceId];
- context.dispatch({
- type: "MERGE_EVENTS",
- eventStore: relevantEvents
- });
- context.emitter.trigger("eventChange", {
- oldEvent,
- event: this,
- relatedEvents: buildEventApis(relevantEvents, context, instance),
- revert() {
- context.dispatch({
- type: "RESET_EVENTS",
- eventStore
- // the ORIGINAL store
- });
- }
- });
- }
- }
- remove() {
- let context = this._context;
- let asStore = eventApiToStore(this);
- context.dispatch({
- type: "REMOVE_EVENTS",
- eventStore: asStore
- });
- context.emitter.trigger("eventRemove", {
- event: this,
- relatedEvents: [],
- revert() {
- context.dispatch({
- type: "MERGE_EVENTS",
- eventStore: asStore
- });
- }
- });
- }
- get source() {
- let { sourceId } = this._def;
- if (sourceId) {
- return new EventSourceImpl(this._context, this._context.getCurrentData().eventSources[sourceId]);
- }
- return null;
- }
- get start() {
- return this._instance ? this._context.dateEnv.toDate(this._instance.range.start) : null;
- }
- get end() {
- return this._instance && this._def.hasEnd ? this._context.dateEnv.toDate(this._instance.range.end) : null;
- }
- get startStr() {
- let instance = this._instance;
- if (instance) {
- return this._context.dateEnv.formatIso(instance.range.start, {
- omitTime: this._def.allDay,
- forcedTzo: instance.forcedStartTzo
- });
- }
- return "";
- }
- get endStr() {
- let instance = this._instance;
- if (instance && this._def.hasEnd) {
- return this._context.dateEnv.formatIso(instance.range.end, {
- omitTime: this._def.allDay,
- forcedTzo: instance.forcedEndTzo
- });
- }
- return "";
- }
- // computable props that all access the def
- // TODO: find a TypeScript-compatible way to do this at scale
- get id() {
- return this._def.publicId;
- }
- get groupId() {
- return this._def.groupId;
- }
- get allDay() {
- return this._def.allDay;
- }
- get title() {
- return this._def.title;
- }
- get url() {
- return this._def.url;
- }
- get display() {
- return this._def.ui.display || "auto";
- }
- // bad. just normalize the type earlier
- get startEditable() {
- return this._def.ui.startEditable;
- }
- get durationEditable() {
- return this._def.ui.durationEditable;
- }
- get constraint() {
- return this._def.ui.constraints[0] || null;
- }
- get overlap() {
- return this._def.ui.overlap;
- }
- get allow() {
- return this._def.ui.allows[0] || null;
- }
- get backgroundColor() {
- return this._def.ui.backgroundColor;
- }
- get borderColor() {
- return this._def.ui.borderColor;
- }
- get textColor() {
- return this._def.ui.textColor;
- }
- // NOTE: user can't modify these because Object.freeze was called in event-def parsing
- get classNames() {
- return this._def.ui.classNames;
- }
- get extendedProps() {
- return this._def.extendedProps;
- }
- toPlainObject(settings = {}) {
- let def = this._def;
- let { ui } = def;
- let { startStr, endStr } = this;
- let res = {
- allDay: def.allDay
- };
- if (def.title) {
- res.title = def.title;
- }
- if (startStr) {
- res.start = startStr;
- }
- if (endStr) {
- res.end = endStr;
- }
- if (def.publicId) {
- res.id = def.publicId;
- }
- if (def.groupId) {
- res.groupId = def.groupId;
- }
- if (def.url) {
- res.url = def.url;
- }
- if (ui.display && ui.display !== "auto") {
- res.display = ui.display;
- }
- if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) {
- res.color = ui.backgroundColor;
- } else {
- if (ui.backgroundColor) {
- res.backgroundColor = ui.backgroundColor;
- }
- if (ui.borderColor) {
- res.borderColor = ui.borderColor;
- }
- }
- if (ui.textColor) {
- res.textColor = ui.textColor;
- }
- if (ui.classNames.length) {
- res.classNames = ui.classNames;
- }
- if (Object.keys(def.extendedProps).length) {
- if (settings.collapseExtendedProps) {
- Object.assign(res, def.extendedProps);
- } else {
- res.extendedProps = def.extendedProps;
- }
- }
- return res;
- }
- toJSON() {
- return this.toPlainObject();
- }
- };
- function eventApiToStore(eventApi) {
- let def = eventApi._def;
- let instance = eventApi._instance;
- return {
- defs: { [def.defId]: def },
- instances: instance ? { [instance.instanceId]: instance } : {}
- };
- }
- function buildEventApis(eventStore, context, excludeInstance) {
- let { defs, instances } = eventStore;
- let eventApis = [];
- let excludeInstanceId = excludeInstance ? excludeInstance.instanceId : "";
- for (let id in instances) {
- let instance = instances[id];
- let def = defs[instance.defId];
- if (instance.instanceId !== excludeInstanceId) {
- eventApis.push(new EventImpl(context, def, instance));
- }
- }
- return eventApis;
- }
- function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
- let inverseBgByGroupId = {};
- let inverseBgByDefId = {};
- let defByGroupId = {};
- let bgRanges = [];
- let fgRanges = [];
- let eventUis = compileEventUis(eventStore.defs, eventUiBases);
- for (let defId in eventStore.defs) {
- let def = eventStore.defs[defId];
- let ui = eventUis[def.defId];
- if (ui.display === "inverse-background") {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId] = [];
- if (!defByGroupId[def.groupId]) {
- defByGroupId[def.groupId] = def;
- }
- } else {
- inverseBgByDefId[defId] = [];
- }
- }
- }
- for (let instanceId in eventStore.instances) {
- let instance = eventStore.instances[instanceId];
- let def = eventStore.defs[instance.defId];
- let ui = eventUis[def.defId];
- let origRange = instance.range;
- let normalRange = !def.allDay && nextDayThreshold ? computeVisibleDayRange(origRange, nextDayThreshold) : origRange;
- let slicedRange = intersectRanges(normalRange, framingRange);
- if (slicedRange) {
- if (ui.display === "inverse-background") {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId].push(slicedRange);
- } else {
- inverseBgByDefId[instance.defId].push(slicedRange);
- }
- } else if (ui.display !== "none") {
- (ui.display === "background" ? bgRanges : fgRanges).push({
- def,
- ui,
- instance,
- range: slicedRange,
- isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
- isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
- });
- }
- }
- }
- for (let groupId in inverseBgByGroupId) {
- let ranges = inverseBgByGroupId[groupId];
- let invertedRanges = invertRanges(ranges, framingRange);
- for (let invertedRange of invertedRanges) {
- let def = defByGroupId[groupId];
- let ui = eventUis[def.defId];
- bgRanges.push({
- def,
- ui,
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- for (let defId in inverseBgByDefId) {
- let ranges = inverseBgByDefId[defId];
- let invertedRanges = invertRanges(ranges, framingRange);
- for (let invertedRange of invertedRanges) {
- bgRanges.push({
- def: eventStore.defs[defId],
- ui: eventUis[defId],
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- return { bg: bgRanges, fg: fgRanges };
- }
- function hasBgRendering(def) {
- return def.ui.display === "background" || def.ui.display === "inverse-background";
- }
- function setElSeg(el, seg) {
- el.fcSeg = seg;
- }
- function getElSeg(el) {
- return el.fcSeg || el.parentNode.fcSeg || // for the harness
- null;
- }
- function compileEventUis(eventDefs, eventUiBases) {
- return mapHash(eventDefs, (eventDef) => compileEventUi(eventDef, eventUiBases));
- }
- function compileEventUi(eventDef, eventUiBases) {
- let uis = [];
- if (eventUiBases[""]) {
- uis.push(eventUiBases[""]);
- }
- if (eventUiBases[eventDef.defId]) {
- uis.push(eventUiBases[eventDef.defId]);
- }
- uis.push(eventDef.ui);
- return combineEventUis(uis);
- }
- function sortEventSegs(segs, eventOrderSpecs) {
- let objs = segs.map(buildSegCompareObj);
- objs.sort((obj0, obj1) => compareByFieldSpecs(obj0, obj1, eventOrderSpecs));
- return objs.map((c2) => c2._seg);
- }
- function buildSegCompareObj(seg) {
- let { eventRange } = seg;
- let eventDef = eventRange.def;
- let range = eventRange.instance ? eventRange.instance.range : eventRange.range;
- let start = range.start ? range.start.valueOf() : 0;
- let end = range.end ? range.end.valueOf() : 0;
- return Object.assign(Object.assign(Object.assign({}, eventDef.extendedProps), eventDef), {
- id: eventDef.publicId,
- start,
- end,
- duration: end - start,
- allDay: Number(eventDef.allDay),
- _seg: seg
- });
- }
- function computeSegDraggable(seg, context) {
- let { pluginHooks } = context;
- let transformers = pluginHooks.isDraggableTransformers;
- let { def, ui } = seg.eventRange;
- let val = ui.startEditable;
- for (let transformer of transformers) {
- val = transformer(val, def, ui, context);
- }
- return val;
- }
- function computeSegStartResizable(seg, context) {
- return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart;
- }
- function computeSegEndResizable(seg, context) {
- return seg.isEnd && seg.eventRange.ui.durationEditable;
- }
- function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, defaultDisplayEventEnd, startOverride, endOverride) {
- let { dateEnv, options } = context;
- let { displayEventTime, displayEventEnd } = options;
- let eventDef = seg.eventRange.def;
- let eventInstance = seg.eventRange.instance;
- if (displayEventTime == null) {
- displayEventTime = defaultDisplayEventTime !== false;
- }
- if (displayEventEnd == null) {
- displayEventEnd = defaultDisplayEventEnd !== false;
- }
- let wholeEventStart = eventInstance.range.start;
- let wholeEventEnd = eventInstance.range.end;
- let segStart = startOverride || seg.start || seg.eventRange.range.start;
- let segEnd = endOverride || seg.end || seg.eventRange.range.end;
- let isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf();
- let isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf();
- if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) {
- segStart = isStartDay ? wholeEventStart : segStart;
- segEnd = isEndDay ? wholeEventEnd : segEnd;
- if (displayEventEnd && eventDef.hasEnd) {
- return dateEnv.formatRange(segStart, segEnd, timeFormat, {
- forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo,
- forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo
- });
- }
- return dateEnv.format(segStart, timeFormat, {
- forcedTzo: startOverride ? null : eventInstance.forcedStartTzo
- // nooooo, same
- });
- }
- return "";
- }
- function getSegMeta(seg, todayRange, nowDate) {
- let segRange = seg.eventRange.range;
- return {
- isPast: segRange.end <= (nowDate || todayRange.start),
- isFuture: segRange.start >= (nowDate || todayRange.end),
- isToday: todayRange && rangeContainsMarker(todayRange, segRange.start)
- };
- }
- function getEventClassNames(props) {
- let classNames = ["fc-event"];
- if (props.isMirror) {
- classNames.push("fc-event-mirror");
- }
- if (props.isDraggable) {
- classNames.push("fc-event-draggable");
- }
- if (props.isStartResizable || props.isEndResizable) {
- classNames.push("fc-event-resizable");
- }
- if (props.isDragging) {
- classNames.push("fc-event-dragging");
- }
- if (props.isResizing) {
- classNames.push("fc-event-resizing");
- }
- if (props.isSelected) {
- classNames.push("fc-event-selected");
- }
- if (props.isStart) {
- classNames.push("fc-event-start");
- }
- if (props.isEnd) {
- classNames.push("fc-event-end");
- }
- if (props.isPast) {
- classNames.push("fc-event-past");
- }
- if (props.isToday) {
- classNames.push("fc-event-today");
- }
- if (props.isFuture) {
- classNames.push("fc-event-future");
- }
- return classNames;
- }
- function buildEventRangeKey(eventRange) {
- return eventRange.instance ? eventRange.instance.instanceId : `${eventRange.def.defId}:${eventRange.range.start.toISOString()}`;
- }
- function getSegAnchorAttrs(seg, context) {
- let { def, instance } = seg.eventRange;
- let { url } = def;
- if (url) {
- return { href: url };
- }
- let { emitter, options } = context;
- let { eventInteractive } = options;
- if (eventInteractive == null) {
- eventInteractive = def.interactive;
- if (eventInteractive == null) {
- eventInteractive = Boolean(emitter.hasHandlers("eventClick"));
- }
- }
- if (eventInteractive) {
- return createAriaKeyboardAttrs((ev) => {
- emitter.trigger("eventClick", {
- el: ev.target,
- event: new EventImpl(context, def, instance),
- jsEvent: ev,
- view: context.viewApi
- });
- });
- }
- return {};
- }
- var STANDARD_PROPS = {
- start: identity,
- end: identity,
- allDay: Boolean
- };
- function parseDateSpan(raw, dateEnv, defaultDuration) {
- let span = parseOpenDateSpan(raw, dateEnv);
- let { range } = span;
- if (!range.start) {
- return null;
- }
- if (!range.end) {
- if (defaultDuration == null) {
- return null;
- }
- range.end = dateEnv.add(range.start, defaultDuration);
- }
- return span;
- }
- function parseOpenDateSpan(raw, dateEnv) {
- let { refined: standardProps, extra } = refineProps(raw, STANDARD_PROPS);
- let startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
- let endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
- let { allDay } = standardProps;
- if (allDay == null) {
- allDay = startMeta && startMeta.isTimeUnspecified && (!endMeta || endMeta.isTimeUnspecified);
- }
- return Object.assign({ range: {
- start: startMeta ? startMeta.marker : null,
- end: endMeta ? endMeta.marker : null
- }, allDay }, extra);
- }
- function isDateSpansEqual(span0, span1) {
- return rangesEqual(span0.range, span1.range) && span0.allDay === span1.allDay && isSpanPropsEqual(span0, span1);
- }
- function isSpanPropsEqual(span0, span1) {
- for (let propName in span1) {
- if (propName !== "range" && propName !== "allDay") {
- if (span0[propName] !== span1[propName]) {
- return false;
- }
- }
- }
- for (let propName in span0) {
- if (!(propName in span1)) {
- return false;
- }
- }
- return true;
- }
- function buildDateSpanApi(span, dateEnv) {
- return Object.assign(Object.assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay });
- }
- function buildRangeApiWithTimeZone(range, dateEnv, omitTime) {
- return Object.assign(Object.assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone });
- }
- function buildRangeApi(range, dateEnv, omitTime) {
- return {
- start: dateEnv.toDate(range.start),
- end: dateEnv.toDate(range.end),
- startStr: dateEnv.formatIso(range.start, { omitTime }),
- endStr: dateEnv.formatIso(range.end, { omitTime })
- };
- }
- function fabricateEventRange(dateSpan, eventUiBases, context) {
- let res = refineEventDef({ editable: false }, context);
- let def = parseEventDef(
- res.refined,
- res.extra,
- "",
- // sourceId
- dateSpan.allDay,
- true,
- // hasEnd
- context
- );
- return {
- def,
- ui: compileEventUi(def, eventUiBases),
- instance: createEventInstance(def.defId, dateSpan.range),
- range: dateSpan.range,
- isStart: true,
- isEnd: true
- };
- }
- function unpromisify(func, normalizedSuccessCallback, normalizedFailureCallback) {
- let isResolved = false;
- let wrappedSuccess = function(res2) {
- if (!isResolved) {
- isResolved = true;
- normalizedSuccessCallback(res2);
- }
- };
- let wrappedFailure = function(error) {
- if (!isResolved) {
- isResolved = true;
- normalizedFailureCallback(error);
- }
- };
- let res = func(wrappedSuccess, wrappedFailure);
- if (res && typeof res.then === "function") {
- res.then(wrappedSuccess, wrappedFailure);
- }
- }
- var JsonRequestError = class extends Error {
- constructor(message, response) {
- super(message);
- this.response = response;
- }
- };
- function requestJson(method, url, params) {
- method = method.toUpperCase();
- const fetchOptions = {
- method
- };
- if (method === "GET") {
- url += (url.indexOf("?") === -1 ? "?" : "&") + new URLSearchParams(params);
- } else {
- fetchOptions.body = new URLSearchParams(params);
- fetchOptions.headers = {
- "Content-Type": "application/x-www-form-urlencoded"
- };
- }
- return fetch(url, fetchOptions).then((fetchRes) => {
- if (fetchRes.ok) {
- return fetchRes.json().then((parsedResponse) => {
- return [parsedResponse, fetchRes];
- }, () => {
- throw new JsonRequestError("Failure parsing JSON", fetchRes);
- });
- } else {
- throw new JsonRequestError("Request failed", fetchRes);
- }
- });
- }
- var canVGrowWithinCell;
- function getCanVGrowWithinCell() {
- if (canVGrowWithinCell == null) {
- canVGrowWithinCell = computeCanVGrowWithinCell();
- }
- return canVGrowWithinCell;
- }
- function computeCanVGrowWithinCell() {
- if (typeof document === "undefined") {
- return true;
- }
- let el = document.createElement("div");
- el.style.position = "absolute";
- el.style.top = "0px";
- el.style.left = "0px";
- el.innerHTML = "<table><tr><td><div></div></td></tr></table>";
- el.querySelector("table").style.height = "100px";
- el.querySelector("div").style.height = "100%";
- document.body.appendChild(el);
- let div = el.querySelector("div");
- let possible = div.offsetHeight > 0;
- document.body.removeChild(el);
- return possible;
- }
- var CalendarRoot = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.state = {
- forPrint: false
- };
- this.handleBeforePrint = () => {
- flushSync(() => {
- this.setState({ forPrint: true });
- });
- };
- this.handleAfterPrint = () => {
- flushSync(() => {
- this.setState({ forPrint: false });
- });
- };
- }
- render() {
- let { props } = this;
- let { options } = props;
- let { forPrint } = this.state;
- let isHeightAuto = forPrint || options.height === "auto" || options.contentHeight === "auto";
- let height = !isHeightAuto && options.height != null ? options.height : "";
- let classNames = [
- "fc",
- forPrint ? "fc-media-print" : "fc-media-screen",
- `fc-direction-${options.direction}`,
- props.theme.getClass("root")
- ];
- if (!getCanVGrowWithinCell()) {
- classNames.push("fc-liquid-hack");
- }
- return props.children(classNames, height, isHeightAuto, forPrint);
- }
- componentDidMount() {
- let { emitter } = this.props;
- emitter.on("_beforeprint", this.handleBeforePrint);
- emitter.on("_afterprint", this.handleAfterPrint);
- }
- componentWillUnmount() {
- let { emitter } = this.props;
- emitter.off("_beforeprint", this.handleBeforePrint);
- emitter.off("_afterprint", this.handleAfterPrint);
- }
- };
- var Interaction = class {
- constructor(settings) {
- this.component = settings.component;
- this.isHitComboAllowed = settings.isHitComboAllowed || null;
- }
- destroy() {
- }
- };
- function parseInteractionSettings(component, input) {
- return {
- component,
- el: input.el,
- useEventCenter: input.useEventCenter != null ? input.useEventCenter : true,
- isHitComboAllowed: input.isHitComboAllowed || null
- };
- }
- function interactionSettingsToStore(settings) {
- return {
- [settings.component.uid]: settings
- };
- }
- var interactionSettingsStore = {};
- var CalendarImpl = class {
- getCurrentData() {
- return this.currentDataManager.getCurrentData();
- }
- dispatch(action) {
- this.currentDataManager.dispatch(action);
- }
- get view() {
- return this.getCurrentData().viewApi;
- }
- batchRendering(callback) {
- callback();
- }
- updateSize() {
- this.trigger("_resize", true);
- }
- // Options
- // -----------------------------------------------------------------------------------------------------------------
- setOption(name, val) {
- this.dispatch({
- type: "SET_OPTION",
- optionName: name,
- rawOptionValue: val
- });
- }
- getOption(name) {
- return this.currentDataManager.currentCalendarOptionsInput[name];
- }
- getAvailableLocaleCodes() {
- return Object.keys(this.getCurrentData().availableRawLocales);
- }
- // Trigger
- // -----------------------------------------------------------------------------------------------------------------
- on(handlerName, handler) {
- let { currentDataManager } = this;
- if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) {
- currentDataManager.emitter.on(handlerName, handler);
- } else {
- console.warn(`Unknown listener name '${handlerName}'`);
- }
- }
- off(handlerName, handler) {
- this.currentDataManager.emitter.off(handlerName, handler);
- }
- // not meant for public use
- trigger(handlerName, ...args) {
- this.currentDataManager.emitter.trigger(handlerName, ...args);
- }
- // View
- // -----------------------------------------------------------------------------------------------------------------
- changeView(viewType, dateOrRange) {
- this.batchRendering(() => {
- this.unselect();
- if (dateOrRange) {
- if (dateOrRange.start && dateOrRange.end) {
- this.dispatch({
- type: "CHANGE_VIEW_TYPE",
- viewType
- });
- this.dispatch({
- type: "SET_OPTION",
- optionName: "visibleRange",
- rawOptionValue: dateOrRange
- });
- } else {
- let { dateEnv } = this.getCurrentData();
- this.dispatch({
- type: "CHANGE_VIEW_TYPE",
- viewType,
- dateMarker: dateEnv.createMarker(dateOrRange)
- });
- }
- } else {
- this.dispatch({
- type: "CHANGE_VIEW_TYPE",
- viewType
- });
- }
- });
- }
- // Forces navigation to a view for the given date.
- // `viewType` can be a specific view name or a generic one like "week" or "day".
- // needs to change
- zoomTo(dateMarker, viewType) {
- let state = this.getCurrentData();
- let spec;
- viewType = viewType || "day";
- spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType);
- this.unselect();
- if (spec) {
- this.dispatch({
- type: "CHANGE_VIEW_TYPE",
- viewType: spec.type,
- dateMarker
- });
- } else {
- this.dispatch({
- type: "CHANGE_DATE",
- dateMarker
- });
- }
- }
- // Given a duration singular unit, like "week" or "day", finds a matching view spec.
- // Preference is given to views that have corresponding buttons.
- getUnitViewSpec(unit) {
- let { viewSpecs, toolbarConfig } = this.getCurrentData();
- let viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []);
- let i3;
- let spec;
- for (let viewType in viewSpecs) {
- viewTypes.push(viewType);
- }
- for (i3 = 0; i3 < viewTypes.length; i3 += 1) {
- spec = viewSpecs[viewTypes[i3]];
- if (spec) {
- if (spec.singleUnit === unit) {
- return spec;
- }
- }
- }
- return null;
- }
- // Current Date
- // -----------------------------------------------------------------------------------------------------------------
- prev() {
- this.unselect();
- this.dispatch({ type: "PREV" });
- }
- next() {
- this.unselect();
- this.dispatch({ type: "NEXT" });
- }
- prevYear() {
- let state = this.getCurrentData();
- this.unselect();
- this.dispatch({
- type: "CHANGE_DATE",
- dateMarker: state.dateEnv.addYears(state.currentDate, -1)
- });
- }
- nextYear() {
- let state = this.getCurrentData();
- this.unselect();
- this.dispatch({
- type: "CHANGE_DATE",
- dateMarker: state.dateEnv.addYears(state.currentDate, 1)
- });
- }
- today() {
- let state = this.getCurrentData();
- this.unselect();
- this.dispatch({
- type: "CHANGE_DATE",
- dateMarker: getNow(state.calendarOptions.now, state.dateEnv)
- });
- }
- gotoDate(zonedDateInput) {
- let state = this.getCurrentData();
- this.unselect();
- this.dispatch({
- type: "CHANGE_DATE",
- dateMarker: state.dateEnv.createMarker(zonedDateInput)
- });
- }
- incrementDate(deltaInput) {
- let state = this.getCurrentData();
- let delta = createDuration(deltaInput);
- if (delta) {
- this.unselect();
- this.dispatch({
- type: "CHANGE_DATE",
- dateMarker: state.dateEnv.add(state.currentDate, delta)
- });
- }
- }
- getDate() {
- let state = this.getCurrentData();
- return state.dateEnv.toDate(state.currentDate);
- }
- // Date Formatting Utils
- // -----------------------------------------------------------------------------------------------------------------
- formatDate(d2, formatter) {
- let { dateEnv } = this.getCurrentData();
- return dateEnv.format(dateEnv.createMarker(d2), createFormatter(formatter));
- }
- // `settings` is for formatter AND isEndExclusive
- formatRange(d0, d1, settings) {
- let { dateEnv } = this.getCurrentData();
- return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings);
- }
- formatIso(d2, omitTime) {
- let { dateEnv } = this.getCurrentData();
- return dateEnv.formatIso(dateEnv.createMarker(d2), { omitTime });
- }
- // Date Selection / Event Selection / DayClick
- // -----------------------------------------------------------------------------------------------------------------
- select(dateOrObj, endDate) {
- let selectionInput;
- if (endDate == null) {
- if (dateOrObj.start != null) {
- selectionInput = dateOrObj;
- } else {
- selectionInput = {
- start: dateOrObj,
- end: null
- };
- }
- } else {
- selectionInput = {
- start: dateOrObj,
- end: endDate
- };
- }
- let state = this.getCurrentData();
- let selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 }));
- if (selection) {
- this.dispatch({ type: "SELECT_DATES", selection });
- triggerDateSelect(selection, null, state);
- }
- }
- unselect(pev) {
- let state = this.getCurrentData();
- if (state.dateSelection) {
- this.dispatch({ type: "UNSELECT_DATES" });
- triggerDateUnselect(pev, state);
- }
- }
- // Public Events API
- // -----------------------------------------------------------------------------------------------------------------
- addEvent(eventInput, sourceInput) {
- if (eventInput instanceof EventImpl) {
- let def = eventInput._def;
- let instance = eventInput._instance;
- let currentData = this.getCurrentData();
- if (!currentData.eventStore.defs[def.defId]) {
- this.dispatch({
- type: "ADD_EVENTS",
- eventStore: eventTupleToStore({ def, instance })
- // TODO: better util for two args?
- });
- this.triggerEventAdd(eventInput);
- }
- return eventInput;
- }
- let state = this.getCurrentData();
- let eventSource;
- if (sourceInput instanceof EventSourceImpl) {
- eventSource = sourceInput.internalEventSource;
- } else if (typeof sourceInput === "boolean") {
- if (sourceInput) {
- [eventSource] = hashValuesToArray(state.eventSources);
- }
- } else if (sourceInput != null) {
- let sourceApi = this.getEventSourceById(sourceInput);
- if (!sourceApi) {
- console.warn(`Could not find an event source with ID "${sourceInput}"`);
- return null;
- }
- eventSource = sourceApi.internalEventSource;
- }
- let tuple = parseEvent(eventInput, eventSource, state, false);
- if (tuple) {
- let newEventApi = new EventImpl(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
- this.dispatch({
- type: "ADD_EVENTS",
- eventStore: eventTupleToStore(tuple)
- });
- this.triggerEventAdd(newEventApi);
- return newEventApi;
- }
- return null;
- }
- triggerEventAdd(eventApi) {
- let { emitter } = this.getCurrentData();
- emitter.trigger("eventAdd", {
- event: eventApi,
- relatedEvents: [],
- revert: () => {
- this.dispatch({
- type: "REMOVE_EVENTS",
- eventStore: eventApiToStore(eventApi)
- });
- }
- });
- }
- // TODO: optimize
- getEventById(id) {
- let state = this.getCurrentData();
- let { defs, instances } = state.eventStore;
- id = String(id);
- for (let defId in defs) {
- let def = defs[defId];
- if (def.publicId === id) {
- if (def.recurringDef) {
- return new EventImpl(state, def, null);
- }
- for (let instanceId in instances) {
- let instance = instances[instanceId];
- if (instance.defId === def.defId) {
- return new EventImpl(state, def, instance);
- }
- }
- }
- }
- return null;
- }
- getEvents() {
- let currentData = this.getCurrentData();
- return buildEventApis(currentData.eventStore, currentData);
- }
- removeAllEvents() {
- this.dispatch({ type: "REMOVE_ALL_EVENTS" });
- }
- // Public Event Sources API
- // -----------------------------------------------------------------------------------------------------------------
- getEventSources() {
- let state = this.getCurrentData();
- let sourceHash = state.eventSources;
- let sourceApis = [];
- for (let internalId in sourceHash) {
- sourceApis.push(new EventSourceImpl(state, sourceHash[internalId]));
- }
- return sourceApis;
- }
- getEventSourceById(id) {
- let state = this.getCurrentData();
- let sourceHash = state.eventSources;
- id = String(id);
- for (let sourceId in sourceHash) {
- if (sourceHash[sourceId].publicId === id) {
- return new EventSourceImpl(state, sourceHash[sourceId]);
- }
- }
- return null;
- }
- addEventSource(sourceInput) {
- let state = this.getCurrentData();
- if (sourceInput instanceof EventSourceImpl) {
- if (!state.eventSources[sourceInput.internalEventSource.sourceId]) {
- this.dispatch({
- type: "ADD_EVENT_SOURCES",
- sources: [sourceInput.internalEventSource]
- });
- }
- return sourceInput;
- }
- let eventSource = parseEventSource(sourceInput, state);
- if (eventSource) {
- this.dispatch({ type: "ADD_EVENT_SOURCES", sources: [eventSource] });
- return new EventSourceImpl(state, eventSource);
- }
- return null;
- }
- removeAllEventSources() {
- this.dispatch({ type: "REMOVE_ALL_EVENT_SOURCES" });
- }
- refetchEvents() {
- this.dispatch({ type: "FETCH_EVENT_SOURCES", isRefetch: true });
- }
- // Scroll
- // -----------------------------------------------------------------------------------------------------------------
- scrollToTime(timeInput) {
- let time = createDuration(timeInput);
- if (time) {
- this.trigger("_scrollRequest", { time });
- }
- }
- };
- function pointInsideRect(point, rect) {
- return point.left >= rect.left && point.left < rect.right && point.top >= rect.top && point.top < rect.bottom;
- }
- function intersectRects(rect1, rect2) {
- let res = {
- left: Math.max(rect1.left, rect2.left),
- right: Math.min(rect1.right, rect2.right),
- top: Math.max(rect1.top, rect2.top),
- bottom: Math.min(rect1.bottom, rect2.bottom)
- };
- if (res.left < res.right && res.top < res.bottom) {
- return res;
- }
- return false;
- }
- function constrainPoint(point, rect) {
- return {
- left: Math.min(Math.max(point.left, rect.left), rect.right),
- top: Math.min(Math.max(point.top, rect.top), rect.bottom)
- };
- }
- function getRectCenter(rect) {
- return {
- left: (rect.left + rect.right) / 2,
- top: (rect.top + rect.bottom) / 2
- };
- }
- function diffPoints(point1, point2) {
- return {
- left: point1.left - point2.left,
- top: point1.top - point2.top
- };
- }
- var EMPTY_EVENT_STORE = createEmptyEventStore();
- var Splitter = class {
- constructor() {
- this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
- this.splitDateSelection = memoize(this._splitDateSpan);
- this.splitEventStore = memoize(this._splitEventStore);
- this.splitIndividualUi = memoize(this._splitIndividualUi);
- this.splitEventDrag = memoize(this._splitInteraction);
- this.splitEventResize = memoize(this._splitInteraction);
- this.eventUiBuilders = {};
- }
- splitProps(props) {
- let keyInfos = this.getKeyInfo(props);
- let defKeys = this.getKeysForEventDefs(props.eventStore);
- let dateSelections = this.splitDateSelection(props.dateSelection);
- let individualUi = this.splitIndividualUi(props.eventUiBases, defKeys);
- let eventStores = this.splitEventStore(props.eventStore, defKeys);
- let eventDrags = this.splitEventDrag(props.eventDrag);
- let eventResizes = this.splitEventResize(props.eventResize);
- let splitProps = {};
- this.eventUiBuilders = mapHash(keyInfos, (info, key) => this.eventUiBuilders[key] || memoize(buildEventUiForKey));
- for (let key in keyInfos) {
- let keyInfo = keyInfos[key];
- let eventStore = eventStores[key] || EMPTY_EVENT_STORE;
- let buildEventUi = this.eventUiBuilders[key];
- splitProps[key] = {
- businessHours: keyInfo.businessHours || props.businessHours,
- dateSelection: dateSelections[key] || null,
- eventStore,
- eventUiBases: buildEventUi(props.eventUiBases[""], keyInfo.ui, individualUi[key]),
- eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : "",
- eventDrag: eventDrags[key] || null,
- eventResize: eventResizes[key] || null
- };
- }
- return splitProps;
- }
- _splitDateSpan(dateSpan) {
- let dateSpans = {};
- if (dateSpan) {
- let keys = this.getKeysForDateSpan(dateSpan);
- for (let key of keys) {
- dateSpans[key] = dateSpan;
- }
- }
- return dateSpans;
- }
- _getKeysForEventDefs(eventStore) {
- return mapHash(eventStore.defs, (eventDef) => this.getKeysForEventDef(eventDef));
- }
- _splitEventStore(eventStore, defKeys) {
- let { defs, instances } = eventStore;
- let splitStores = {};
- for (let defId in defs) {
- for (let key of defKeys[defId]) {
- if (!splitStores[key]) {
- splitStores[key] = createEmptyEventStore();
- }
- splitStores[key].defs[defId] = defs[defId];
- }
- }
- for (let instanceId in instances) {
- let instance = instances[instanceId];
- for (let key of defKeys[instance.defId]) {
- if (splitStores[key]) {
- splitStores[key].instances[instanceId] = instance;
- }
- }
- }
- return splitStores;
- }
- _splitIndividualUi(eventUiBases, defKeys) {
- let splitHashes = {};
- for (let defId in eventUiBases) {
- if (defId) {
- for (let key of defKeys[defId]) {
- if (!splitHashes[key]) {
- splitHashes[key] = {};
- }
- splitHashes[key][defId] = eventUiBases[defId];
- }
- }
- }
- return splitHashes;
- }
- _splitInteraction(interaction) {
- let splitStates = {};
- if (interaction) {
- let affectedStores = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents));
- let mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
- let mutatedStores = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
- let populate = (key) => {
- if (!splitStates[key]) {
- splitStates[key] = {
- affectedEvents: affectedStores[key] || EMPTY_EVENT_STORE,
- mutatedEvents: mutatedStores[key] || EMPTY_EVENT_STORE,
- isEvent: interaction.isEvent
- };
- }
- };
- for (let key in affectedStores) {
- populate(key);
- }
- for (let key in mutatedStores) {
- populate(key);
- }
- }
- return splitStates;
- }
- };
- function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
- let baseParts = [];
- if (allUi) {
- baseParts.push(allUi);
- }
- if (eventUiForKey) {
- baseParts.push(eventUiForKey);
- }
- let stuff = {
- "": combineEventUis(baseParts)
- };
- if (individualUi) {
- Object.assign(stuff, individualUi);
- }
- return stuff;
- }
- function getDateMeta(date, todayRange, nowDate, dateProfile) {
- return {
- dow: date.getUTCDay(),
- isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)),
- isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)),
- isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)),
- isPast: Boolean(nowDate ? date < nowDate : todayRange ? date < todayRange.start : false),
- isFuture: Boolean(nowDate ? date > nowDate : todayRange ? date >= todayRange.end : false)
- };
- }
- function getDayClassNames(meta, theme) {
- let classNames = [
- "fc-day",
- `fc-day-${DAY_IDS[meta.dow]}`
- ];
- if (meta.isDisabled) {
- classNames.push("fc-day-disabled");
- } else {
- if (meta.isToday) {
- classNames.push("fc-day-today");
- classNames.push(theme.getClass("today"));
- }
- if (meta.isPast) {
- classNames.push("fc-day-past");
- }
- if (meta.isFuture) {
- classNames.push("fc-day-future");
- }
- if (meta.isOther) {
- classNames.push("fc-day-other");
- }
- }
- return classNames;
- }
- var DAY_FORMAT = createFormatter({ year: "numeric", month: "long", day: "numeric" });
- var WEEK_FORMAT = createFormatter({ week: "long" });
- function buildNavLinkAttrs(context, dateMarker, viewType = "day", isTabbable = true) {
- const { dateEnv, options, calendarApi } = context;
- let dateStr = dateEnv.format(dateMarker, viewType === "week" ? WEEK_FORMAT : DAY_FORMAT);
- if (options.navLinks) {
- let zonedDate = dateEnv.toDate(dateMarker);
- const handleInteraction = (ev) => {
- let customAction = viewType === "day" ? options.navLinkDayClick : viewType === "week" ? options.navLinkWeekClick : null;
- if (typeof customAction === "function") {
- customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev);
- } else {
- if (typeof customAction === "string") {
- viewType = customAction;
- }
- calendarApi.zoomTo(dateMarker, viewType);
- }
- };
- return Object.assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), "data-navlink": "" }, isTabbable ? createAriaClickAttrs(handleInteraction) : { onClick: handleInteraction });
- }
- return { "aria-label": dateStr };
- }
- var _isRtlScrollbarOnLeft = null;
- function getIsRtlScrollbarOnLeft() {
- if (_isRtlScrollbarOnLeft === null) {
- _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
- }
- return _isRtlScrollbarOnLeft;
- }
- function computeIsRtlScrollbarOnLeft() {
- let outerEl = document.createElement("div");
- applyStyle(outerEl, {
- position: "absolute",
- top: -1e3,
- left: 0,
- border: 0,
- padding: 0,
- overflow: "scroll",
- direction: "rtl"
- });
- outerEl.innerHTML = "<div></div>";
- document.body.appendChild(outerEl);
- let innerEl = outerEl.firstChild;
- let res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
- removeElement(outerEl);
- return res;
- }
- var _scrollbarWidths;
- function getScrollbarWidths() {
- if (!_scrollbarWidths) {
- _scrollbarWidths = computeScrollbarWidths();
- }
- return _scrollbarWidths;
- }
- function computeScrollbarWidths() {
- let el = document.createElement("div");
- el.style.overflow = "scroll";
- el.style.position = "absolute";
- el.style.top = "-9999px";
- el.style.left = "-9999px";
- document.body.appendChild(el);
- let res = computeScrollbarWidthsForEl(el);
- document.body.removeChild(el);
- return res;
- }
- function computeScrollbarWidthsForEl(el) {
- return {
- x: el.offsetHeight - el.clientHeight,
- y: el.offsetWidth - el.clientWidth
- };
- }
- function computeEdges(el, getPadding = false) {
- let computedStyle = window.getComputedStyle(el);
- let borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
- let borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
- let borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
- let borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
- let badScrollbarWidths = computeScrollbarWidthsForEl(el);
- let scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight;
- let scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom;
- let res = {
- borderLeft,
- borderRight,
- borderTop,
- borderBottom,
- scrollbarBottom,
- scrollbarLeft: 0,
- scrollbarRight: 0
- };
- if (getIsRtlScrollbarOnLeft() && computedStyle.direction === "rtl") {
- res.scrollbarLeft = scrollbarLeftRight;
- } else {
- res.scrollbarRight = scrollbarLeftRight;
- }
- if (getPadding) {
- res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
- res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
- res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
- res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
- }
- return res;
- }
- function computeInnerRect(el, goWithinPadding = false, doFromWindowViewport) {
- let outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el);
- let edges = computeEdges(el, goWithinPadding);
- let res = {
- left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
- right: outerRect.right - edges.borderRight - edges.scrollbarRight,
- top: outerRect.top + edges.borderTop,
- bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
- };
- if (goWithinPadding) {
- res.left += edges.paddingLeft;
- res.right -= edges.paddingRight;
- res.top += edges.paddingTop;
- res.bottom -= edges.paddingBottom;
- }
- return res;
- }
- function computeRect(el) {
- let rect = el.getBoundingClientRect();
- return {
- left: rect.left + window.scrollX,
- top: rect.top + window.scrollY,
- right: rect.right + window.scrollX,
- bottom: rect.bottom + window.scrollY
- };
- }
- function computeClippedClientRect(el) {
- let clippingParents = getClippingParents(el);
- let rect = el.getBoundingClientRect();
- for (let clippingParent of clippingParents) {
- let intersection = intersectRects(rect, clippingParent.getBoundingClientRect());
- if (intersection) {
- rect = intersection;
- } else {
- return null;
- }
- }
- return rect;
- }
- function getClippingParents(el) {
- let parents = [];
- while (el instanceof HTMLElement) {
- let computedStyle = window.getComputedStyle(el);
- if (computedStyle.position === "fixed") {
- break;
- }
- if (/(auto|scroll)/.test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
- parents.push(el);
- }
- el = el.parentNode;
- }
- return parents;
- }
- var PositionCache = class {
- constructor(originEl, els, isHorizontal, isVertical) {
- this.els = els;
- let originClientRect = this.originClientRect = originEl.getBoundingClientRect();
- if (isHorizontal) {
- this.buildElHorizontals(originClientRect.left);
- }
- if (isVertical) {
- this.buildElVerticals(originClientRect.top);
- }
- }
- // Populates the left/right internal coordinate arrays
- buildElHorizontals(originClientLeft) {
- let lefts = [];
- let rights = [];
- for (let el of this.els) {
- let rect = el.getBoundingClientRect();
- lefts.push(rect.left - originClientLeft);
- rights.push(rect.right - originClientLeft);
- }
- this.lefts = lefts;
- this.rights = rights;
- }
- // Populates the top/bottom internal coordinate arrays
- buildElVerticals(originClientTop) {
- let tops = [];
- let bottoms = [];
- for (let el of this.els) {
- let rect = el.getBoundingClientRect();
- tops.push(rect.top - originClientTop);
- bottoms.push(rect.bottom - originClientTop);
- }
- this.tops = tops;
- this.bottoms = bottoms;
- }
- // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
- // If no intersection is made, returns undefined.
- leftToIndex(leftPosition) {
- let { lefts, rights } = this;
- let len = lefts.length;
- let i3;
- for (i3 = 0; i3 < len; i3 += 1) {
- if (leftPosition >= lefts[i3] && leftPosition < rights[i3]) {
- return i3;
- }
- }
- return void 0;
- }
- // Given a top offset (from document top), returns the index of the el that it vertically intersects.
- // If no intersection is made, returns undefined.
- topToIndex(topPosition) {
- let { tops, bottoms } = this;
- let len = tops.length;
- let i3;
- for (i3 = 0; i3 < len; i3 += 1) {
- if (topPosition >= tops[i3] && topPosition < bottoms[i3]) {
- return i3;
- }
- }
- return void 0;
- }
- // Gets the width of the element at the given index
- getWidth(leftIndex) {
- return this.rights[leftIndex] - this.lefts[leftIndex];
- }
- // Gets the height of the element at the given index
- getHeight(topIndex) {
- return this.bottoms[topIndex] - this.tops[topIndex];
- }
- similarTo(otherCache) {
- return similarNumArrays(this.tops || [], otherCache.tops || []) && similarNumArrays(this.bottoms || [], otherCache.bottoms || []) && similarNumArrays(this.lefts || [], otherCache.lefts || []) && similarNumArrays(this.rights || [], otherCache.rights || []);
- }
- };
- function similarNumArrays(a2, b2) {
- const len = a2.length;
- if (len !== b2.length) {
- return false;
- }
- for (let i3 = 0; i3 < len; i3++) {
- if (Math.round(a2[i3]) !== Math.round(b2[i3])) {
- return false;
- }
- }
- return true;
- }
- var ScrollController = class {
- getMaxScrollTop() {
- return this.getScrollHeight() - this.getClientHeight();
- }
- getMaxScrollLeft() {
- return this.getScrollWidth() - this.getClientWidth();
- }
- canScrollVertically() {
- return this.getMaxScrollTop() > 0;
- }
- canScrollHorizontally() {
- return this.getMaxScrollLeft() > 0;
- }
- canScrollUp() {
- return this.getScrollTop() > 0;
- }
- canScrollDown() {
- return this.getScrollTop() < this.getMaxScrollTop();
- }
- canScrollLeft() {
- return this.getScrollLeft() > 0;
- }
- canScrollRight() {
- return this.getScrollLeft() < this.getMaxScrollLeft();
- }
- };
- var ElementScrollController = class extends ScrollController {
- constructor(el) {
- super();
- this.el = el;
- }
- getScrollTop() {
- return this.el.scrollTop;
- }
- getScrollLeft() {
- return this.el.scrollLeft;
- }
- setScrollTop(top) {
- this.el.scrollTop = top;
- }
- setScrollLeft(left) {
- this.el.scrollLeft = left;
- }
- getScrollWidth() {
- return this.el.scrollWidth;
- }
- getScrollHeight() {
- return this.el.scrollHeight;
- }
- getClientHeight() {
- return this.el.clientHeight;
- }
- getClientWidth() {
- return this.el.clientWidth;
- }
- };
- var WindowScrollController = class extends ScrollController {
- getScrollTop() {
- return window.scrollY;
- }
- getScrollLeft() {
- return window.scrollX;
- }
- setScrollTop(n) {
- window.scroll(window.scrollX, n);
- }
- setScrollLeft(n) {
- window.scroll(n, window.scrollY);
- }
- getScrollWidth() {
- return document.documentElement.scrollWidth;
- }
- getScrollHeight() {
- return document.documentElement.scrollHeight;
- }
- getClientHeight() {
- return document.documentElement.clientHeight;
- }
- getClientWidth() {
- return document.documentElement.clientWidth;
- }
- };
- var DateComponent = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.uid = guid();
- }
- // Hit System
- // -----------------------------------------------------------------------------------------------------------------
- prepareHits() {
- }
- queryHit(positionLeft, positionTop, elWidth, elHeight) {
- return null;
- }
- // Pointer Interaction Utils
- // -----------------------------------------------------------------------------------------------------------------
- isValidSegDownEl(el) {
- return !this.props.eventDrag && // HACK
- !this.props.eventResize && // HACK
- !elementClosest(el, ".fc-event-mirror");
- }
- isValidDateDownEl(el) {
- return !elementClosest(el, ".fc-event:not(.fc-bg-event)") && !elementClosest(el, ".fc-more-link") && // a "more.." link
- !elementClosest(el, "a[data-navlink]") && // a clickable nav link
- !elementClosest(el, ".fc-popover");
- }
- };
- var SegHierarchy = class {
- constructor(getEntryThickness = (entry) => {
- return entry.thickness || 1;
- }) {
- this.getEntryThickness = getEntryThickness;
- this.strictOrder = false;
- this.allowReslicing = false;
- this.maxCoord = -1;
- this.maxStackCnt = -1;
- this.levelCoords = [];
- this.entriesByLevel = [];
- this.stackCnts = {};
- }
- addSegs(inputs) {
- let hiddenEntries = [];
- for (let input of inputs) {
- this.insertEntry(input, hiddenEntries);
- }
- return hiddenEntries;
- }
- insertEntry(entry, hiddenEntries) {
- let insertion = this.findInsertion(entry);
- if (this.isInsertionValid(insertion, entry)) {
- this.insertEntryAt(entry, insertion);
- } else {
- this.handleInvalidInsertion(insertion, entry, hiddenEntries);
- }
- }
- isInsertionValid(insertion, entry) {
- return (this.maxCoord === -1 || insertion.levelCoord + this.getEntryThickness(entry) <= this.maxCoord) && (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt);
- }
- handleInvalidInsertion(insertion, entry, hiddenEntries) {
- if (this.allowReslicing && insertion.touchingEntry) {
- const hiddenEntry = Object.assign(Object.assign({}, entry), { span: intersectSpans(entry.span, insertion.touchingEntry.span) });
- hiddenEntries.push(hiddenEntry);
- this.splitEntry(entry, insertion.touchingEntry, hiddenEntries);
- } else {
- hiddenEntries.push(entry);
- }
- }
- /*
- Does NOT add what hit the `barrier` into hiddenEntries. Should already be done.
- */
- splitEntry(entry, barrier, hiddenEntries) {
- let entrySpan = entry.span;
- let barrierSpan = barrier.span;
- if (entrySpan.start < barrierSpan.start) {
- this.insertEntry({
- index: entry.index,
- thickness: entry.thickness,
- span: { start: entrySpan.start, end: barrierSpan.start }
- }, hiddenEntries);
- }
- if (entrySpan.end > barrierSpan.end) {
- this.insertEntry({
- index: entry.index,
- thickness: entry.thickness,
- span: { start: barrierSpan.end, end: entrySpan.end }
- }, hiddenEntries);
- }
- }
- insertEntryAt(entry, insertion) {
- let { entriesByLevel, levelCoords } = this;
- if (insertion.lateral === -1) {
- insertAt(levelCoords, insertion.level, insertion.levelCoord);
- insertAt(entriesByLevel, insertion.level, [entry]);
- } else {
- insertAt(entriesByLevel[insertion.level], insertion.lateral, entry);
- }
- this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt;
- }
- /*
- does not care about limits
- */
- findInsertion(newEntry) {
- let { levelCoords, entriesByLevel, strictOrder, stackCnts } = this;
- let levelCnt = levelCoords.length;
- let candidateCoord = 0;
- let touchingLevel = -1;
- let touchingLateral = -1;
- let touchingEntry = null;
- let stackCnt = 0;
- for (let trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) {
- const trackingCoord = levelCoords[trackingLevel];
- if (!strictOrder && trackingCoord >= candidateCoord + this.getEntryThickness(newEntry)) {
- break;
- }
- let trackingEntries = entriesByLevel[trackingLevel];
- let trackingEntry;
- let searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd);
- let lateralIndex = searchRes[0] + searchRes[1];
- while (
- // loop through entries that horizontally intersect
- (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list
- trackingEntry.span.start < newEntry.span.end
- ) {
- let trackingEntryBottom = trackingCoord + this.getEntryThickness(trackingEntry);
- if (trackingEntryBottom > candidateCoord) {
- candidateCoord = trackingEntryBottom;
- touchingEntry = trackingEntry;
- touchingLevel = trackingLevel;
- touchingLateral = lateralIndex;
- }
- if (trackingEntryBottom === candidateCoord) {
- stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1);
- }
- lateralIndex += 1;
- }
- }
- let destLevel = 0;
- if (touchingEntry) {
- destLevel = touchingLevel + 1;
- while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) {
- destLevel += 1;
- }
- }
- let destLateral = -1;
- if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) {
- destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0];
- }
- return {
- touchingLevel,
- touchingLateral,
- touchingEntry,
- stackCnt,
- levelCoord: candidateCoord,
- level: destLevel,
- lateral: destLateral
- };
- }
- // sorted by levelCoord (lowest to highest)
- toRects() {
- let { entriesByLevel, levelCoords } = this;
- let levelCnt = entriesByLevel.length;
- let rects = [];
- for (let level = 0; level < levelCnt; level += 1) {
- let entries = entriesByLevel[level];
- let levelCoord = levelCoords[level];
- for (let entry of entries) {
- rects.push(Object.assign(Object.assign({}, entry), { thickness: this.getEntryThickness(entry), levelCoord }));
- }
- }
- return rects;
- }
- };
- function getEntrySpanEnd(entry) {
- return entry.span.end;
- }
- function buildEntryKey(entry) {
- return entry.index + ":" + entry.span.start;
- }
- function groupIntersectingEntries(entries) {
- let merges = [];
- for (let entry of entries) {
- let filteredMerges = [];
- let hungryMerge = {
- span: entry.span,
- entries: [entry]
- };
- for (let merge of merges) {
- if (intersectSpans(merge.span, hungryMerge.span)) {
- hungryMerge = {
- entries: merge.entries.concat(hungryMerge.entries),
- span: joinSpans(merge.span, hungryMerge.span)
- };
- } else {
- filteredMerges.push(merge);
- }
- }
- filteredMerges.push(hungryMerge);
- merges = filteredMerges;
- }
- return merges;
- }
- function joinSpans(span0, span1) {
- return {
- start: Math.min(span0.start, span1.start),
- end: Math.max(span0.end, span1.end)
- };
- }
- function intersectSpans(span0, span1) {
- let start = Math.max(span0.start, span1.start);
- let end = Math.min(span0.end, span1.end);
- if (start < end) {
- return { start, end };
- }
- return null;
- }
- function insertAt(arr, index, item) {
- arr.splice(index, 0, item);
- }
- function binarySearch(a2, searchVal, getItemVal) {
- let startIndex = 0;
- let endIndex = a2.length;
- if (!endIndex || searchVal < getItemVal(a2[startIndex])) {
- return [0, 0];
- }
- if (searchVal > getItemVal(a2[endIndex - 1])) {
- return [endIndex, 0];
- }
- while (startIndex < endIndex) {
- let middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2);
- let middleVal = getItemVal(a2[middleIndex]);
- if (searchVal < middleVal) {
- endIndex = middleIndex;
- } else if (searchVal > middleVal) {
- startIndex = middleIndex + 1;
- } else {
- return [middleIndex, 1];
- }
- }
- return [startIndex, 0];
- }
- var ElementDragging = class {
- constructor(el, selector) {
- this.emitter = new Emitter();
- }
- destroy() {
- }
- setMirrorIsVisible(bool) {
- }
- setMirrorNeedsRevert(bool) {
- }
- setAutoScrollEnabled(bool) {
- }
- };
- var config = {};
- var DRAG_META_REFINERS = {
- startTime: createDuration,
- duration: createDuration,
- create: Boolean,
- sourceId: String
- };
- function parseDragMeta(raw) {
- let { refined, extra } = refineProps(raw, DRAG_META_REFINERS);
- return {
- startTime: refined.startTime || null,
- duration: refined.duration || null,
- create: refined.create != null ? refined.create : true,
- sourceId: refined.sourceId,
- leftoverProps: extra
- };
- }
- function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
- if (!datesRepDistinctDays || dayCnt > 10) {
- return createFormatter({ weekday: "short" });
- }
- if (dayCnt > 1) {
- return createFormatter({ weekday: "short", month: "numeric", day: "numeric", omitCommas: true });
- }
- return createFormatter({ weekday: "long" });
- }
- var CLASS_NAME = "fc-col-header-cell";
- function renderInner$1(renderProps) {
- return renderProps.text;
- }
- var TableDateCell = class extends BaseComponent {
- render() {
- let { dateEnv, options, theme, viewApi } = this.context;
- let { props } = this;
- let { date, dateProfile } = props;
- let dayMeta = getDateMeta(date, props.todayRange, null, dateProfile);
- let classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme));
- let text = dateEnv.format(date, props.dayHeaderFormat);
- let navLinkAttrs = !dayMeta.isDisabled && props.colCnt > 1 ? buildNavLinkAttrs(this.context, date) : {};
- let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta);
- return y(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: "columnheader", colSpan: props.colSpan, "data-date": !dayMeta.isDisabled ? formatDayString(date) : void 0 }, props.extraDataAttrs), renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => y("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && y(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [
- "fc-col-header-cell-cushion",
- props.isSticky && "fc-sticky"
- ] })));
- }
- };
- var WEEKDAY_FORMAT = createFormatter({ weekday: "long" });
- var TableDowCell = class extends BaseComponent {
- render() {
- let { props } = this;
- let { dateEnv, theme, viewApi, options } = this.context;
- let date = addDays(/* @__PURE__ */ new Date(2592e5), props.dow);
- let dateMeta = {
- dow: props.dow,
- isDisabled: false,
- isFuture: false,
- isPast: false,
- isToday: false,
- isOther: false
- };
- let text = dateEnv.format(date, props.dayHeaderFormat);
- let renderProps = Object.assign(Object.assign(Object.assign(Object.assign({
- // TODO: make this public?
- date
- }, dateMeta), { view: viewApi }), props.extraRenderProps), { text });
- return y(ContentContainer, { elTag: "th", elClasses: [
- CLASS_NAME,
- ...getDayClassNames(dateMeta, theme),
- ...props.extraClassNames || []
- ], elAttrs: Object.assign({ role: "columnheader", colSpan: props.colSpan }, props.extraDataAttrs), renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => y(
- "div",
- { className: "fc-scrollgrid-sync-inner" },
- y(InnerContent, { elTag: "a", elClasses: [
- "fc-col-header-cell-cushion",
- props.isSticky && "fc-sticky"
- ], elAttrs: {
- "aria-label": dateEnv.format(date, WEEKDAY_FORMAT)
- } })
- ));
- }
- };
- var NowTimer = class extends x {
- constructor(props, context) {
- super(props, context);
- this.initialNowDate = getNow(context.options.now, context.dateEnv);
- this.initialNowQueriedMs = (/* @__PURE__ */ new Date()).valueOf();
- this.state = this.computeTiming().currentState;
- }
- render() {
- let { props, state } = this;
- return props.children(state.nowDate, state.todayRange);
- }
- componentDidMount() {
- this.setTimeout();
- }
- componentDidUpdate(prevProps) {
- if (prevProps.unit !== this.props.unit) {
- this.clearTimeout();
- this.setTimeout();
- }
- }
- componentWillUnmount() {
- this.clearTimeout();
- }
- computeTiming() {
- let { props, context } = this;
- let unroundedNow = addMs(this.initialNowDate, (/* @__PURE__ */ new Date()).valueOf() - this.initialNowQueriedMs);
- let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
- let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
- let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
- waitMs = Math.min(1e3 * 60 * 60 * 24, waitMs);
- return {
- currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
- nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) },
- waitMs
- };
- }
- setTimeout() {
- let { nextState, waitMs } = this.computeTiming();
- this.timeoutId = setTimeout(() => {
- this.setState(nextState, () => {
- this.setTimeout();
- });
- }, waitMs);
- }
- clearTimeout() {
- if (this.timeoutId) {
- clearTimeout(this.timeoutId);
- }
- }
- };
- NowTimer.contextType = ViewContextType;
- function buildDayRange(date) {
- let start = startOfDay(date);
- let end = addDays(start, 1);
- return { start, end };
- }
- var DayHeader = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.createDayHeaderFormatter = memoize(createDayHeaderFormatter);
- }
- render() {
- let { context } = this;
- let { dates, dateProfile, datesRepDistinctDays, renderIntro } = this.props;
- let dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length);
- return y(NowTimer, { unit: "day" }, (nowDate, todayRange) => y(
- "tr",
- { role: "row" },
- renderIntro && renderIntro("day"),
- dates.map((date) => datesRepDistinctDays ? y(TableDateCell, { key: date.toISOString(), date, dateProfile, todayRange, colCnt: dates.length, dayHeaderFormat }) : y(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat }))
- ));
- }
- };
- function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) {
- return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt);
- }
- var DaySeriesModel = class {
- constructor(range, dateProfileGenerator) {
- let date = range.start;
- let { end } = range;
- let indices = [];
- let dates = [];
- let dayIndex = -1;
- while (date < end) {
- if (dateProfileGenerator.isHiddenDay(date)) {
- indices.push(dayIndex + 0.5);
- } else {
- dayIndex += 1;
- indices.push(dayIndex);
- dates.push(date);
- }
- date = addDays(date, 1);
- }
- this.dates = dates;
- this.indices = indices;
- this.cnt = dates.length;
- }
- sliceRange(range) {
- let firstIndex = this.getDateDayIndex(range.start);
- let lastIndex = this.getDateDayIndex(addDays(range.end, -1));
- let clippedFirstIndex = Math.max(0, firstIndex);
- let clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
- clippedFirstIndex = Math.ceil(clippedFirstIndex);
- clippedLastIndex = Math.floor(clippedLastIndex);
- if (clippedFirstIndex <= clippedLastIndex) {
- return {
- firstIndex: clippedFirstIndex,
- lastIndex: clippedLastIndex,
- isStart: firstIndex === clippedFirstIndex,
- isEnd: lastIndex === clippedLastIndex
- };
- }
- return null;
- }
- // Given a date, returns its chronolocial cell-index from the first cell of the grid.
- // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
- // If before the first offset, returns a negative number.
- // If after the last offset, returns an offset past the last cell offset.
- // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
- getDateDayIndex(date) {
- let { indices } = this;
- let dayOffset = Math.floor(diffDays(this.dates[0], date));
- if (dayOffset < 0) {
- return indices[0] - 1;
- }
- if (dayOffset >= indices.length) {
- return indices[indices.length - 1] + 1;
- }
- return indices[dayOffset];
- }
- };
- var DayTableModel = class {
- constructor(daySeries, breakOnWeeks) {
- let { dates } = daySeries;
- let daysPerRow;
- let firstDay;
- let rowCnt;
- if (breakOnWeeks) {
- firstDay = dates[0].getUTCDay();
- for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) {
- if (dates[daysPerRow].getUTCDay() === firstDay) {
- break;
- }
- }
- rowCnt = Math.ceil(dates.length / daysPerRow);
- } else {
- rowCnt = 1;
- daysPerRow = dates.length;
- }
- this.rowCnt = rowCnt;
- this.colCnt = daysPerRow;
- this.daySeries = daySeries;
- this.cells = this.buildCells();
- this.headerDates = this.buildHeaderDates();
- }
- buildCells() {
- let rows = [];
- for (let row = 0; row < this.rowCnt; row += 1) {
- let cells = [];
- for (let col = 0; col < this.colCnt; col += 1) {
- cells.push(this.buildCell(row, col));
- }
- rows.push(cells);
- }
- return rows;
- }
- buildCell(row, col) {
- let date = this.daySeries.dates[row * this.colCnt + col];
- return {
- key: date.toISOString(),
- date
- };
- }
- buildHeaderDates() {
- let dates = [];
- for (let col = 0; col < this.colCnt; col += 1) {
- dates.push(this.cells[0][col].date);
- }
- return dates;
- }
- sliceRange(range) {
- let { colCnt } = this;
- let seriesSeg = this.daySeries.sliceRange(range);
- let segs = [];
- if (seriesSeg) {
- let { firstIndex, lastIndex } = seriesSeg;
- let index = firstIndex;
- while (index <= lastIndex) {
- let row = Math.floor(index / colCnt);
- let nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
- segs.push({
- row,
- firstCol: index % colCnt,
- lastCol: (nextIndex - 1) % colCnt,
- isStart: seriesSeg.isStart && index === firstIndex,
- isEnd: seriesSeg.isEnd && nextIndex - 1 === lastIndex
- });
- index = nextIndex;
- }
- }
- return segs;
- }
- };
- var Slicer = class {
- constructor() {
- this.sliceBusinessHours = memoize(this._sliceBusinessHours);
- this.sliceDateSelection = memoize(this._sliceDateSpan);
- this.sliceEventStore = memoize(this._sliceEventStore);
- this.sliceEventDrag = memoize(this._sliceInteraction);
- this.sliceEventResize = memoize(this._sliceInteraction);
- this.forceDayIfListItem = false;
- }
- sliceProps(props, dateProfile, nextDayThreshold, context, ...extraArgs) {
- let { eventUiBases } = props;
- let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs);
- return {
- dateSelectionSegs: this.sliceDateSelection(props.dateSelection, dateProfile, nextDayThreshold, eventUiBases, context, ...extraArgs),
- businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs),
- fgEventSegs: eventSegs.fg,
- bgEventSegs: eventSegs.bg,
- eventDrag: this.sliceEventDrag(props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs),
- eventResize: this.sliceEventResize(props.eventResize, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs),
- eventSelection: props.eventSelection
- };
- }
- sliceNowDate(date, dateProfile, nextDayThreshold, context, ...extraArgs) {
- return this._sliceDateSpan(
- { range: { start: date, end: addMs(date, 1) }, allDay: false },
- // add 1 ms, protect against null range
- dateProfile,
- nextDayThreshold,
- {},
- context,
- ...extraArgs
- );
- }
- _sliceBusinessHours(businessHours, dateProfile, nextDayThreshold, context, ...extraArgs) {
- if (!businessHours) {
- return [];
- }
- return this._sliceEventStore(expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold, ...extraArgs).bg;
- }
- _sliceEventStore(eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) {
- if (eventStore) {
- let rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- bg: this.sliceEventRanges(rangeRes.bg, extraArgs),
- fg: this.sliceEventRanges(rangeRes.fg, extraArgs)
- };
- }
- return { bg: [], fg: [] };
- }
- _sliceInteraction(interaction, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) {
- if (!interaction) {
- return null;
- }
- let rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- segs: this.sliceEventRanges(rangeRes.fg, extraArgs),
- affectedInstances: interaction.affectedEvents.instances,
- isEvent: interaction.isEvent
- };
- }
- _sliceDateSpan(dateSpan, dateProfile, nextDayThreshold, eventUiBases, context, ...extraArgs) {
- if (!dateSpan) {
- return [];
- }
- let activeRange = computeActiveRange(dateProfile, Boolean(nextDayThreshold));
- let activeDateSpanRange = intersectRanges(dateSpan.range, activeRange);
- if (activeDateSpanRange) {
- dateSpan = Object.assign(Object.assign({}, dateSpan), { range: activeDateSpanRange });
- let eventRange = fabricateEventRange(dateSpan, eventUiBases, context);
- let segs = this.sliceRange(dateSpan.range, ...extraArgs);
- for (let seg of segs) {
- seg.eventRange = eventRange;
- }
- return segs;
- }
- return [];
- }
- /*
- "complete" seg means it has component and eventRange
- */
- sliceEventRanges(eventRanges, extraArgs) {
- let segs = [];
- for (let eventRange of eventRanges) {
- segs.push(...this.sliceEventRange(eventRange, extraArgs));
- }
- return segs;
- }
- /*
- "complete" seg means it has component and eventRange
- */
- sliceEventRange(eventRange, extraArgs) {
- let dateRange = eventRange.range;
- if (this.forceDayIfListItem && eventRange.ui.display === "list-item") {
- dateRange = {
- start: dateRange.start,
- end: addDays(dateRange.start, 1)
- };
- }
- let segs = this.sliceRange(dateRange, ...extraArgs);
- for (let seg of segs) {
- seg.eventRange = eventRange;
- seg.isStart = eventRange.isStart && seg.isStart;
- seg.isEnd = eventRange.isEnd && seg.isEnd;
- }
- return segs;
- }
- };
- function computeActiveRange(dateProfile, isComponentAllDay) {
- let range = dateProfile.activeRange;
- if (isComponentAllDay) {
- return range;
- }
- return {
- start: addMs(range.start, dateProfile.slotMinTime.milliseconds),
- end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5)
- // 864e5 = ms in a day
- };
- }
- function isInteractionValid(interaction, dateProfile, context) {
- let { instances } = interaction.mutatedEvents;
- for (let instanceId in instances) {
- if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
- return false;
- }
- }
- return isNewPropsValid({ eventDrag: interaction }, context);
- }
- function isDateSelectionValid(dateSelection, dateProfile, context) {
- if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) {
- return false;
- }
- return isNewPropsValid({ dateSelection }, context);
- }
- function isNewPropsValid(newProps, context) {
- let calendarState = context.getCurrentData();
- let props = Object.assign({ businessHours: calendarState.businessHours, dateSelection: "", eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: "", eventDrag: null, eventResize: null }, newProps);
- return (context.pluginHooks.isPropsValid || isPropsValid)(props, context);
- }
- function isPropsValid(state, context, dateSpanMeta = {}, filterConfig) {
- if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) {
- return false;
- }
- if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) {
- return false;
- }
- return true;
- }
- function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) {
- let currentState = context.getCurrentData();
- let interaction = state.eventDrag;
- let subjectEventStore = interaction.mutatedEvents;
- let subjectDefs = subjectEventStore.defs;
- let subjectInstances = subjectEventStore.instances;
- let subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? state.eventUiBases : { "": currentState.selectionConfig });
- if (filterConfig) {
- subjectConfigs = mapHash(subjectConfigs, filterConfig);
- }
- let otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances);
- let otherDefs = otherEventStore.defs;
- let otherInstances = otherEventStore.instances;
- let otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
- for (let subjectInstanceId in subjectInstances) {
- let subjectInstance = subjectInstances[subjectInstanceId];
- let subjectRange = subjectInstance.range;
- let subjectConfig = subjectConfigs[subjectInstance.defId];
- let subjectDef = subjectDefs[subjectInstance.defId];
- if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) {
- return false;
- }
- let { eventOverlap } = context.options;
- let eventOverlapFunc = typeof eventOverlap === "function" ? eventOverlap : null;
- for (let otherInstanceId in otherInstances) {
- let otherInstance = otherInstances[otherInstanceId];
- if (rangesIntersect(subjectRange, otherInstance.range)) {
- let otherOverlap = otherConfigs[otherInstance.defId].overlap;
- if (otherOverlap === false && interaction.isEvent) {
- return false;
- }
- if (subjectConfig.overlap === false) {
- return false;
- }
- if (eventOverlapFunc && !eventOverlapFunc(
- new EventImpl(context, otherDefs[otherInstance.defId], otherInstance),
- // still event
- new EventImpl(context, subjectDef, subjectInstance)
- )) {
- return false;
- }
- }
- }
- let calendarEventStore = currentState.eventStore;
- for (let subjectAllow of subjectConfig.allows) {
- let subjectDateSpan = Object.assign(Object.assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay });
- let origDef = calendarEventStore.defs[subjectDef.defId];
- let origInstance = calendarEventStore.instances[subjectInstanceId];
- let eventApi;
- if (origDef) {
- eventApi = new EventImpl(context, origDef, origInstance);
- } else {
- eventApi = new EventImpl(context, subjectDef);
- }
- if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) {
- return false;
- }
- }
- }
- return true;
- }
- function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) {
- let relevantEventStore = state.eventStore;
- let relevantDefs = relevantEventStore.defs;
- let relevantInstances = relevantEventStore.instances;
- let selection = state.dateSelection;
- let selectionRange = selection.range;
- let { selectionConfig } = context.getCurrentData();
- if (filterConfig) {
- selectionConfig = filterConfig(selectionConfig);
- }
- if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) {
- return false;
- }
- let { selectOverlap } = context.options;
- let selectOverlapFunc = typeof selectOverlap === "function" ? selectOverlap : null;
- for (let relevantInstanceId in relevantInstances) {
- let relevantInstance = relevantInstances[relevantInstanceId];
- if (rangesIntersect(selectionRange, relevantInstance.range)) {
- if (selectionConfig.overlap === false) {
- return false;
- }
- if (selectOverlapFunc && !selectOverlapFunc(new EventImpl(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) {
- return false;
- }
- }
- }
- for (let selectionAllow of selectionConfig.allows) {
- let fullDateSpan = Object.assign(Object.assign({}, dateSpanMeta), selection);
- if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) {
- return false;
- }
- }
- return true;
- }
- function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) {
- for (let constraint of constraints) {
- if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) {
- return false;
- }
- }
- return true;
- }
- function constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context) {
- if (constraint === "businessHours") {
- return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context));
- }
- if (typeof constraint === "string") {
- return eventStoreToRanges(filterEventStoreDefs(otherEventStore, (eventDef) => eventDef.groupId === constraint));
- }
- if (typeof constraint === "object" && constraint) {
- return eventStoreToRanges(expandRecurring(constraint, subjectRange, context));
- }
- return [];
- }
- function eventStoreToRanges(eventStore) {
- let { instances } = eventStore;
- let ranges = [];
- for (let instanceId in instances) {
- ranges.push(instances[instanceId].range);
- }
- return ranges;
- }
- function anyRangesContainRange(outerRanges, innerRange) {
- for (let outerRange of outerRanges) {
- if (rangeContainsRange(outerRange, innerRange)) {
- return true;
- }
- }
- return false;
- }
- var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/;
- var Scroller = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.handleEl = (el) => {
- this.el = el;
- setRef(this.props.elRef, el);
- };
- }
- render() {
- let { props } = this;
- let { liquid, liquidIsAbsolute } = props;
- let isAbsolute = liquid && liquidIsAbsolute;
- let className = ["fc-scroller"];
- if (liquid) {
- if (liquidIsAbsolute) {
- className.push("fc-scroller-liquid-absolute");
- } else {
- className.push("fc-scroller-liquid");
- }
- }
- return y("div", { ref: this.handleEl, className: className.join(" "), style: {
- overflowX: props.overflowX,
- overflowY: props.overflowY,
- left: isAbsolute && -(props.overcomeLeft || 0) || "",
- right: isAbsolute && -(props.overcomeRight || 0) || "",
- bottom: isAbsolute && -(props.overcomeBottom || 0) || "",
- marginLeft: !isAbsolute && -(props.overcomeLeft || 0) || "",
- marginRight: !isAbsolute && -(props.overcomeRight || 0) || "",
- marginBottom: !isAbsolute && -(props.overcomeBottom || 0) || "",
- maxHeight: props.maxHeight || ""
- } }, props.children);
- }
- needsXScrolling() {
- if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
- return false;
- }
- let { el } = this;
- let realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth();
- let { children } = el;
- for (let i3 = 0; i3 < children.length; i3 += 1) {
- let childEl = children[i3];
- if (childEl.getBoundingClientRect().width > realClientWidth) {
- return true;
- }
- }
- return false;
- }
- needsYScrolling() {
- if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
- return false;
- }
- let { el } = this;
- let realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth();
- let { children } = el;
- for (let i3 = 0; i3 < children.length; i3 += 1) {
- let childEl = children[i3];
- if (childEl.getBoundingClientRect().height > realClientHeight) {
- return true;
- }
- }
- return false;
- }
- getXScrollbarWidth() {
- if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
- return 0;
- }
- return this.el.offsetHeight - this.el.clientHeight;
- }
- getYScrollbarWidth() {
- if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
- return 0;
- }
- return this.el.offsetWidth - this.el.clientWidth;
- }
- };
- var RefMap = class {
- constructor(masterCallback) {
- this.masterCallback = masterCallback;
- this.currentMap = {};
- this.depths = {};
- this.callbackMap = {};
- this.handleValue = (val, key) => {
- let { depths, currentMap } = this;
- let removed = false;
- let added = false;
- if (val !== null) {
- removed = key in currentMap;
- currentMap[key] = val;
- depths[key] = (depths[key] || 0) + 1;
- added = true;
- } else {
- depths[key] -= 1;
- if (!depths[key]) {
- delete currentMap[key];
- delete this.callbackMap[key];
- removed = true;
- }
- }
- if (this.masterCallback) {
- if (removed) {
- this.masterCallback(null, String(key));
- }
- if (added) {
- this.masterCallback(val, String(key));
- }
- }
- };
- }
- createRef(key) {
- let refCallback = this.callbackMap[key];
- if (!refCallback) {
- refCallback = this.callbackMap[key] = (val) => {
- this.handleValue(val, String(key));
- };
- }
- return refCallback;
- }
- // TODO: check callers that don't care about order. should use getAll instead
- // NOTE: this method has become less valuable now that we are encouraged to map order by some other index
- // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect"
- collect(startIndex, endIndex, step) {
- return collectFromHash(this.currentMap, startIndex, endIndex, step);
- }
- getAll() {
- return hashValuesToArray(this.currentMap);
- }
- };
- function computeShrinkWidth(chunkEls) {
- let shrinkCells = findElements(chunkEls, ".fc-scrollgrid-shrink");
- let largestWidth = 0;
- for (let shrinkCell of shrinkCells) {
- largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell));
- }
- return Math.ceil(largestWidth);
- }
- function getSectionHasLiquidHeight(props, sectionConfig) {
- return props.liquid && sectionConfig.liquid;
- }
- function getAllowYScrolling(props, sectionConfig) {
- return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars
- getSectionHasLiquidHeight(props, sectionConfig);
- }
- function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) {
- let { expandRows } = arg;
- let content = typeof chunkConfig.content === "function" ? chunkConfig.content(arg) : y("table", {
- role: "presentation",
- className: [
- chunkConfig.tableClassName,
- sectionConfig.syncRowHeights ? "fc-scrollgrid-sync-table" : ""
- ].join(" "),
- style: {
- minWidth: arg.tableMinWidth,
- width: arg.clientWidth,
- height: expandRows ? arg.clientHeight : ""
- // css `height` on a <table> serves as a min-height
- }
- }, arg.tableColGroupNode, y(isHeader ? "thead" : "tbody", {
- role: "presentation"
- }, typeof chunkConfig.rowContent === "function" ? chunkConfig.rowContent(arg) : chunkConfig.rowContent));
- return content;
- }
- function isColPropsEqual(cols0, cols1) {
- return isArraysEqual(cols0, cols1, isPropsEqual);
- }
- function renderMicroColGroup(cols, shrinkWidth) {
- let colNodes = [];
- for (let colProps of cols) {
- let span = colProps.span || 1;
- for (let i3 = 0; i3 < span; i3 += 1) {
- colNodes.push(y("col", { style: {
- width: colProps.width === "shrink" ? sanitizeShrinkWidth(shrinkWidth) : colProps.width || "",
- minWidth: colProps.minWidth || ""
- } }));
- }
- }
- return y("colgroup", {}, ...colNodes);
- }
- function sanitizeShrinkWidth(shrinkWidth) {
- return shrinkWidth == null ? 4 : shrinkWidth;
- }
- function hasShrinkWidth(cols) {
- for (let col of cols) {
- if (col.width === "shrink") {
- return true;
- }
- }
- return false;
- }
- function getScrollGridClassNames(liquid, context) {
- let classNames = [
- "fc-scrollgrid",
- context.theme.getClass("table")
- ];
- if (liquid) {
- classNames.push("fc-scrollgrid-liquid");
- }
- return classNames;
- }
- function getSectionClassNames(sectionConfig, wholeTableVGrow) {
- let classNames = [
- "fc-scrollgrid-section",
- `fc-scrollgrid-section-${sectionConfig.type}`,
- sectionConfig.className
- // used?
- ];
- if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) {
- classNames.push("fc-scrollgrid-section-liquid");
- }
- if (sectionConfig.isSticky) {
- classNames.push("fc-scrollgrid-section-sticky");
- }
- return classNames;
- }
- function renderScrollShim(arg) {
- return y("div", { className: "fc-scrollgrid-sticky-shim", style: {
- width: arg.clientWidth,
- minWidth: arg.tableMinWidth
- } });
- }
- function getStickyHeaderDates(options) {
- let { stickyHeaderDates } = options;
- if (stickyHeaderDates == null || stickyHeaderDates === "auto") {
- stickyHeaderDates = options.height === "auto" || options.viewHeight === "auto";
- }
- return stickyHeaderDates;
- }
- function getStickyFooterScrollbar(options) {
- let { stickyFooterScrollbar } = options;
- if (stickyFooterScrollbar == null || stickyFooterScrollbar === "auto") {
- stickyFooterScrollbar = options.height === "auto" || options.viewHeight === "auto";
- }
- return stickyFooterScrollbar;
- }
- var SimpleScrollGrid = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.processCols = memoize((a2) => a2, isColPropsEqual);
- this.renderMicroColGroup = memoize(renderMicroColGroup);
- this.scrollerRefs = new RefMap();
- this.scrollerElRefs = new RefMap(this._handleScrollerEl.bind(this));
- this.state = {
- shrinkWidth: null,
- forceYScrollbars: false,
- scrollerClientWidths: {},
- scrollerClientHeights: {}
- };
- this.handleSizing = () => {
- this.safeSetState(Object.assign({ shrinkWidth: this.computeShrinkWidth() }, this.computeScrollerDims()));
- };
- }
- render() {
- let { props, state, context } = this;
- let sectionConfigs = props.sections || [];
- let cols = this.processCols(props.cols);
- let microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth);
- let classNames = getScrollGridClassNames(props.liquid, context);
- if (props.collapsibleWidth) {
- classNames.push("fc-scrollgrid-collapsible");
- }
- let configCnt = sectionConfigs.length;
- let configI = 0;
- let currentConfig;
- let headSectionNodes = [];
- let bodySectionNodes = [];
- let footSectionNodes = [];
- while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === "header") {
- headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true));
- configI += 1;
- }
- while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === "body") {
- bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false));
- configI += 1;
- }
- while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === "footer") {
- footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true));
- configI += 1;
- }
- let isBuggy = !getCanVGrowWithinCell();
- const roleAttrs = { role: "rowgroup" };
- return y("table", {
- role: "grid",
- className: classNames.join(" "),
- style: { height: props.height }
- }, Boolean(!isBuggy && headSectionNodes.length) && y("thead", roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && y("tbody", roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && y("tfoot", roleAttrs, ...footSectionNodes), isBuggy && y("tbody", roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes));
- }
- renderSection(sectionConfig, microColGroupNode, isHeader) {
- if ("outerContent" in sectionConfig) {
- return y(_, { key: sectionConfig.key }, sectionConfig.outerContent);
- }
- return y("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(" ") }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader));
- }
- renderChunkTd(sectionConfig, microColGroupNode, chunkConfig, isHeader) {
- if ("outerContent" in chunkConfig) {
- return chunkConfig.outerContent;
- }
- let { props } = this;
- let { forceYScrollbars, scrollerClientWidths, scrollerClientHeights } = this.state;
- let needsYScrolling = getAllowYScrolling(props, sectionConfig);
- let isLiquid = getSectionHasLiquidHeight(props, sectionConfig);
- let overflowY = !props.liquid ? "visible" : forceYScrollbars ? "scroll" : !needsYScrolling ? "hidden" : "auto";
- let sectionKey = sectionConfig.key;
- let content = renderChunkContent(sectionConfig, chunkConfig, {
- tableColGroupNode: microColGroupNode,
- tableMinWidth: "",
- clientWidth: !props.collapsibleWidth && scrollerClientWidths[sectionKey] !== void 0 ? scrollerClientWidths[sectionKey] : null,
- clientHeight: scrollerClientHeights[sectionKey] !== void 0 ? scrollerClientHeights[sectionKey] : null,
- expandRows: sectionConfig.expandRows,
- syncRowHeights: false,
- rowSyncHeights: [],
- reportRowHeightChange: () => {
- }
- }, isHeader);
- return y(isHeader ? "th" : "td", {
- ref: chunkConfig.elRef,
- role: "presentation"
- }, y(
- "div",
- { className: `fc-scroller-harness${isLiquid ? " fc-scroller-harness-liquid" : ""}` },
- y(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY, overflowX: !props.liquid ? "visible" : "hidden", maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute: true }, content)
- ));
- }
- _handleScrollerEl(scrollerEl, key) {
- let section = getSectionByKey(this.props.sections, key);
- if (section) {
- setRef(section.chunk.scrollerElRef, scrollerEl);
- }
- }
- componentDidMount() {
- this.handleSizing();
- this.context.addResizeHandler(this.handleSizing);
- }
- componentDidUpdate() {
- this.handleSizing();
- }
- componentWillUnmount() {
- this.context.removeResizeHandler(this.handleSizing);
- }
- computeShrinkWidth() {
- return hasShrinkWidth(this.props.cols) ? computeShrinkWidth(this.scrollerElRefs.getAll()) : 0;
- }
- computeScrollerDims() {
- let scrollbarWidth = getScrollbarWidths();
- let { scrollerRefs, scrollerElRefs } = this;
- let forceYScrollbars = false;
- let scrollerClientWidths = {};
- let scrollerClientHeights = {};
- for (let sectionKey in scrollerRefs.currentMap) {
- let scroller = scrollerRefs.currentMap[sectionKey];
- if (scroller && scroller.needsYScrolling()) {
- forceYScrollbars = true;
- break;
- }
- }
- for (let section of this.props.sections) {
- let sectionKey = section.key;
- let scrollerEl = scrollerElRefs.currentMap[sectionKey];
- if (scrollerEl) {
- let harnessEl = scrollerEl.parentNode;
- scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars ? scrollbarWidth.y : 0));
- scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height);
- }
- }
- return { forceYScrollbars, scrollerClientWidths, scrollerClientHeights };
- }
- };
- SimpleScrollGrid.addStateEquality({
- scrollerClientWidths: isPropsEqual,
- scrollerClientHeights: isPropsEqual
- });
- function getSectionByKey(sections, key) {
- for (let section of sections) {
- if (section.key === key) {
- return section;
- }
- }
- return null;
- }
- var EventContainer = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.handleEl = (el) => {
- this.el = el;
- if (el) {
- setElSeg(el, this.props.seg);
- }
- };
- }
- render() {
- const { props, context } = this;
- const { options } = context;
- const { seg } = props;
- const { eventRange } = seg;
- const { ui } = eventRange;
- const renderProps = {
- event: new EventImpl(context, eventRange.def, eventRange.instance),
- view: context.viewApi,
- timeText: props.timeText,
- textColor: ui.textColor,
- backgroundColor: ui.backgroundColor,
- borderColor: ui.borderColor,
- isDraggable: !props.disableDragging && computeSegDraggable(seg, context),
- isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context),
- isEndResizable: !props.disableResizing && computeSegEndResizable(seg),
- isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting),
- isStart: Boolean(seg.isStart),
- isEnd: Boolean(seg.isEnd),
- isPast: Boolean(props.isPast),
- isFuture: Boolean(props.isFuture),
- isToday: Boolean(props.isToday),
- isSelected: Boolean(props.isSelected),
- isDragging: Boolean(props.isDragging),
- isResizing: Boolean(props.isResizing)
- };
- return y(ContentContainer, Object.assign({}, props, { elRef: this.handleEl, elClasses: [
- ...getEventClassNames(renderProps),
- ...seg.eventRange.ui.classNames,
- ...props.elClasses || []
- ], renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }));
- }
- componentDidUpdate(prevProps) {
- if (this.el && this.props.seg !== prevProps.seg) {
- setElSeg(this.el, this.props.seg);
- }
- }
- };
- var StandardEvent = class extends BaseComponent {
- render() {
- let { props, context } = this;
- let { options } = context;
- let { seg } = props;
- let { ui } = seg.eventRange;
- let timeFormat = options.eventTimeFormat || props.defaultTimeFormat;
- let timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd);
- return y(EventContainer, Object.assign({}, props, { elTag: "a", elStyle: {
- borderColor: ui.borderColor,
- backgroundColor: ui.backgroundColor
- }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1, timeText }), (InnerContent, eventContentArg) => y(
- _,
- null,
- y(InnerContent, { elTag: "div", elClasses: ["fc-event-main"], elStyle: { color: eventContentArg.textColor } }),
- Boolean(eventContentArg.isStartResizable) && y("div", { className: "fc-event-resizer fc-event-resizer-start" }),
- Boolean(eventContentArg.isEndResizable) && y("div", { className: "fc-event-resizer fc-event-resizer-end" })
- ));
- }
- };
- function renderInnerContent$1(innerProps) {
- return y(
- "div",
- { className: "fc-event-main-frame" },
- innerProps.timeText && y("div", { className: "fc-event-time" }, innerProps.timeText),
- y(
- "div",
- { className: "fc-event-title-container" },
- y("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || y(_, null, " "))
- )
- );
- }
- var NowIndicatorContainer = (props) => y(ViewContextType.Consumer, null, (context) => {
- let { options } = context;
- let renderProps = {
- isAxis: props.isAxis,
- date: context.dateEnv.toDate(props.date),
- view: context.viewApi
- };
- return y(ContentContainer, Object.assign({}, props, { elTag: props.elTag || "div", renderProps, generatorName: "nowIndicatorContent", customGenerator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }));
- });
- var DAY_NUM_FORMAT = createFormatter({ day: "numeric" });
- var DayCellContainer = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.refineRenderProps = memoizeObjArg(refineRenderProps);
- }
- render() {
- let { props, context } = this;
- let { options } = context;
- let renderProps = this.refineRenderProps({
- date: props.date,
- dateProfile: props.dateProfile,
- todayRange: props.todayRange,
- isMonthStart: props.isMonthStart || false,
- showDayNumber: props.showDayNumber,
- extraRenderProps: props.extraRenderProps,
- viewApi: context.viewApi,
- dateEnv: context.dateEnv,
- monthStartFormat: options.monthStartFormat
- });
- return y(ContentContainer, Object.assign({}, props, { elClasses: [
- ...getDayClassNames(renderProps, context.theme),
- ...props.elClasses || []
- ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), renderProps.isDisabled ? {} : { "data-date": formatDayString(props.date) }), renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator: (
- // don't use custom classNames if disabled
- renderProps.isDisabled ? void 0 : options.dayCellClassNames
- ), didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount }));
- }
- };
- function hasCustomDayCellContent(options) {
- return Boolean(options.dayCellContent || hasCustomRenderingHandler("dayCellContent", options));
- }
- function refineRenderProps(raw) {
- let { date, dateEnv, dateProfile, isMonthStart } = raw;
- let dayMeta = getDateMeta(date, raw.todayRange, null, dateProfile);
- let dayNumberText = raw.showDayNumber ? dateEnv.format(date, isMonthStart ? raw.monthStartFormat : DAY_NUM_FORMAT) : "";
- return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), {
- isMonthStart,
- dayNumberText
- }), raw.extraRenderProps);
- }
- var BgEvent = class extends BaseComponent {
- render() {
- let { props } = this;
- let { seg } = props;
- return y(EventContainer, { elTag: "div", elClasses: ["fc-bg-event"], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent, seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true });
- }
- };
- function renderInnerContent(props) {
- let { title } = props.event;
- return title && y("div", { className: "fc-event-title" }, props.event.title);
- }
- function renderFill(fillType) {
- return y("div", { className: `fc-${fillType}` });
- }
- var WeekNumberContainer = (props) => y(ViewContextType.Consumer, null, (context) => {
- let { dateEnv, options } = context;
- let { date } = props;
- let format = options.weekNumberFormat || props.defaultFormat;
- let num = dateEnv.computeWeekNumber(date);
- let text = dateEnv.format(date, format);
- let renderProps = { num, text, date };
- return y(
- ContentContainer,
- Object.assign({}, props, { renderProps, generatorName: "weekNumberContent", customGenerator: options.weekNumberContent, defaultGenerator: renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount })
- );
- });
- function renderInner(innerProps) {
- return innerProps.text;
- }
- var PADDING_FROM_VIEWPORT = 10;
- var Popover = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.state = {
- titleId: getUniqueDomId()
- };
- this.handleRootEl = (el) => {
- this.rootEl = el;
- if (this.props.elRef) {
- setRef(this.props.elRef, el);
- }
- };
- this.handleDocumentMouseDown = (ev) => {
- const target = getEventTargetViaRoot(ev);
- if (!this.rootEl.contains(target)) {
- this.handleCloseClick();
- }
- };
- this.handleDocumentKeyDown = (ev) => {
- if (ev.key === "Escape") {
- this.handleCloseClick();
- }
- };
- this.handleCloseClick = () => {
- let { onClose } = this.props;
- if (onClose) {
- onClose();
- }
- };
- }
- render() {
- let { theme, options } = this.context;
- let { props, state } = this;
- let classNames = [
- "fc-popover",
- theme.getClass("popover")
- ].concat(props.extraClassNames || []);
- return j3(y(
- "div",
- Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(" "), "aria-labelledby": state.titleId, ref: this.handleRootEl }),
- y(
- "div",
- { className: "fc-popover-header " + theme.getClass("popoverHeader") },
- y("span", { className: "fc-popover-title", id: state.titleId }, props.title),
- y("span", { className: "fc-popover-close " + theme.getIconClass("close"), title: options.closeHint, onClick: this.handleCloseClick })
- ),
- y("div", { className: "fc-popover-body " + theme.getClass("popoverContent") }, props.children)
- ), props.parentEl);
- }
- componentDidMount() {
- document.addEventListener("mousedown", this.handleDocumentMouseDown);
- document.addEventListener("keydown", this.handleDocumentKeyDown);
- this.updateSize();
- }
- componentWillUnmount() {
- document.removeEventListener("mousedown", this.handleDocumentMouseDown);
- document.removeEventListener("keydown", this.handleDocumentKeyDown);
- }
- updateSize() {
- let { isRtl } = this.context;
- let { alignmentEl, alignGridTop } = this.props;
- let { rootEl } = this;
- let alignmentRect = computeClippedClientRect(alignmentEl);
- if (alignmentRect) {
- let popoverDims = rootEl.getBoundingClientRect();
- let popoverTop = alignGridTop ? elementClosest(alignmentEl, ".fc-scrollgrid").getBoundingClientRect().top : alignmentRect.top;
- let popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left;
- popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT);
- popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width);
- popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT);
- let origin = rootEl.offsetParent.getBoundingClientRect();
- applyStyle(rootEl, {
- top: popoverTop - origin.top,
- left: popoverLeft - origin.left
- });
- }
- }
- };
- var MorePopover = class extends DateComponent {
- constructor() {
- super(...arguments);
- this.handleRootEl = (rootEl) => {
- this.rootEl = rootEl;
- if (rootEl) {
- this.context.registerInteractiveComponent(this, {
- el: rootEl,
- useEventCenter: false
- });
- } else {
- this.context.unregisterInteractiveComponent(this);
- }
- };
- }
- render() {
- let { options, dateEnv } = this.context;
- let { props } = this;
- let { startDate, todayRange, dateProfile } = props;
- let title = dateEnv.format(startDate, options.dayPopoverFormat);
- return y(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile, todayRange }, (InnerContent, renderProps, elAttrs) => y(
- Popover,
- { elRef: elAttrs.ref, id: props.id, title, extraClassNames: ["fc-more-popover"].concat(elAttrs.className || []), extraAttrs: elAttrs, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose },
- hasCustomDayCellContent(options) && y(InnerContent, { elTag: "div", elClasses: ["fc-more-popover-misc"] }),
- props.children
- ));
- }
- queryHit(positionLeft, positionTop, elWidth, elHeight) {
- let { rootEl, props } = this;
- if (positionLeft >= 0 && positionLeft < elWidth && positionTop >= 0 && positionTop < elHeight) {
- return {
- dateProfile: props.dateProfile,
- dateSpan: Object.assign({ allDay: !props.forceTimed, range: {
- start: props.startDate,
- end: props.endDate
- } }, props.extraDateSpan),
- dayEl: rootEl,
- rect: {
- left: 0,
- top: 0,
- right: elWidth,
- bottom: elHeight
- },
- layer: 1
- // important when comparing with hits from other components
- };
- }
- return null;
- }
- };
- var MoreLinkContainer = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.state = {
- isPopoverOpen: false,
- popoverId: getUniqueDomId()
- };
- this.handleLinkEl = (linkEl) => {
- this.linkEl = linkEl;
- if (this.props.elRef) {
- setRef(this.props.elRef, linkEl);
- }
- };
- this.handleClick = (ev) => {
- let { props, context } = this;
- let { moreLinkClick } = context.options;
- let date = computeRange(props).start;
- function buildPublicSeg(seg) {
- let { def, instance, range } = seg.eventRange;
- return {
- event: new EventImpl(context, def, instance),
- start: context.dateEnv.toDate(range.start),
- end: context.dateEnv.toDate(range.end),
- isStart: seg.isStart,
- isEnd: seg.isEnd
- };
- }
- if (typeof moreLinkClick === "function") {
- moreLinkClick = moreLinkClick({
- date,
- allDay: Boolean(props.allDayDate),
- allSegs: props.allSegs.map(buildPublicSeg),
- hiddenSegs: props.hiddenSegs.map(buildPublicSeg),
- jsEvent: ev,
- view: context.viewApi
- });
- }
- if (!moreLinkClick || moreLinkClick === "popover") {
- this.setState({ isPopoverOpen: true });
- } else if (typeof moreLinkClick === "string") {
- context.calendarApi.zoomTo(date, moreLinkClick);
- }
- };
- this.handlePopoverClose = () => {
- this.setState({ isPopoverOpen: false });
- };
- }
- render() {
- let { props, state } = this;
- return y(ViewContextType.Consumer, null, (context) => {
- let { viewApi, options, calendarApi } = context;
- let { moreLinkText } = options;
- let { moreCnt } = props;
- let range = computeRange(props);
- let text = typeof moreLinkText === "function" ? moreLinkText.call(calendarApi, moreCnt) : `+${moreCnt} ${moreLinkText}`;
- let hint = formatWithOrdinals(options.moreLinkHint, [moreCnt], text);
- let renderProps = {
- num: moreCnt,
- shortText: `+${moreCnt}`,
- text,
- view: viewApi
- };
- return y(
- _,
- null,
- Boolean(props.moreCnt) && y(ContentContainer, { elTag: props.elTag || "a", elRef: this.handleLinkEl, elClasses: [
- ...props.elClasses || [],
- "fc-more-link"
- ], elStyle: props.elStyle, elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, "aria-expanded": state.isPopoverOpen, "aria-controls": state.isPopoverOpen ? state.popoverId : "" }), renderProps, generatorName: "moreLinkContent", customGenerator: options.moreLinkContent, defaultGenerator: props.defaultGenerator || renderMoreLinkInner, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children),
- state.isPopoverOpen && y(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: this.parentEl, alignmentEl: props.alignmentElRef ? props.alignmentElRef.current : this.linkEl, alignGridTop: props.alignGridTop, forceTimed: props.forceTimed, onClose: this.handlePopoverClose }, props.popoverContent())
- );
- });
- }
- componentDidMount() {
- this.updateParentEl();
- }
- componentDidUpdate() {
- this.updateParentEl();
- }
- updateParentEl() {
- if (this.linkEl) {
- this.parentEl = elementClosest(this.linkEl, ".fc-view-harness");
- }
- }
- };
- function renderMoreLinkInner(props) {
- return props.text;
- }
- function computeRange(props) {
- if (props.allDayDate) {
- return {
- start: props.allDayDate,
- end: addDays(props.allDayDate, 1)
- };
- }
- let { hiddenSegs } = props;
- return {
- start: computeEarliestSegStart(hiddenSegs),
- end: computeLatestSegEnd(hiddenSegs)
- };
- }
- function computeEarliestSegStart(segs) {
- return segs.reduce(pickEarliestStart).eventRange.range.start;
- }
- function pickEarliestStart(seg0, seg1) {
- return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1;
- }
- function computeLatestSegEnd(segs) {
- return segs.reduce(pickLatestEnd).eventRange.range.end;
- }
- function pickLatestEnd(seg0, seg1) {
- return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1;
- }
- var Store = class {
- constructor() {
- this.handlers = [];
- }
- set(value) {
- this.currentValue = value;
- for (let handler of this.handlers) {
- handler(value);
- }
- }
- subscribe(handler) {
- this.handlers.push(handler);
- if (this.currentValue !== void 0) {
- handler(this.currentValue);
- }
- }
- };
- var CustomRenderingStore = class extends Store {
- constructor() {
- super(...arguments);
- this.map = /* @__PURE__ */ new Map();
- }
- // for consistent order
- handle(customRendering) {
- const { map } = this;
- let updated = false;
- if (customRendering.isActive) {
- map.set(customRendering.id, customRendering);
- updated = true;
- } else if (map.has(customRendering.id)) {
- map.delete(customRendering.id);
- updated = true;
- }
- if (updated) {
- this.set(map);
- }
- }
- };
- // node_modules/.pnpm/@fullcalendar+core@6.1.14/node_modules/@fullcalendar/core/index.js
- var globalLocales = [];
- var MINIMAL_RAW_EN_LOCALE = {
- code: "en",
- week: {
- dow: 0,
- doy: 4
- // 4 days need to be within the year to be considered the first week
- },
- direction: "ltr",
- buttonText: {
- prev: "prev",
- next: "next",
- prevYear: "prev year",
- nextYear: "next year",
- year: "year",
- today: "today",
- month: "month",
- week: "week",
- day: "day",
- list: "list"
- },
- weekText: "W",
- weekTextLong: "Week",
- closeHint: "Close",
- timeHint: "Time",
- eventHint: "Event",
- allDayText: "all-day",
- moreLinkText: "more",
- noEventsText: "No events to display"
- };
- var RAW_EN_LOCALE = Object.assign(Object.assign({}, MINIMAL_RAW_EN_LOCALE), {
- // Includes things we don't want other locales to inherit,
- // things that derive from other translatable strings.
- buttonHints: {
- prev: "Previous $0",
- next: "Next $0",
- today(buttonText, unit) {
- return unit === "day" ? "Today" : `This ${buttonText}`;
- }
- },
- viewHint: "$0 view",
- navLinkHint: "Go to $0",
- moreLinkHint(eventCnt) {
- return `Show ${eventCnt} more event${eventCnt === 1 ? "" : "s"}`;
- }
- });
- function organizeRawLocales(explicitRawLocales) {
- let defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : "en";
- let allRawLocales = globalLocales.concat(explicitRawLocales);
- let rawLocaleMap = {
- en: RAW_EN_LOCALE
- };
- for (let rawLocale of allRawLocales) {
- rawLocaleMap[rawLocale.code] = rawLocale;
- }
- return {
- map: rawLocaleMap,
- defaultCode
- };
- }
- function buildLocale(inputSingular, available) {
- if (typeof inputSingular === "object" && !Array.isArray(inputSingular)) {
- return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
- }
- return queryLocale(inputSingular, available);
- }
- function queryLocale(codeArg, available) {
- let codes = [].concat(codeArg || []);
- let raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
- return parseLocale(codeArg, codes, raw);
- }
- function queryRawLocale(codes, available) {
- for (let i3 = 0; i3 < codes.length; i3 += 1) {
- let parts = codes[i3].toLocaleLowerCase().split("-");
- for (let j4 = parts.length; j4 > 0; j4 -= 1) {
- let simpleId = parts.slice(0, j4).join("-");
- if (available[simpleId]) {
- return available[simpleId];
- }
- }
- }
- return null;
- }
- function parseLocale(codeArg, codes, raw) {
- let merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ["buttonText"]);
- delete merged.code;
- let { week } = merged;
- delete merged.week;
- return {
- codeArg,
- codes,
- week,
- simpleNumberFormat: new Intl.NumberFormat(codeArg),
- options: merged
- };
- }
- function createPlugin(input) {
- return {
- id: guid(),
- name: input.name,
- premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : void 0,
- deps: input.deps || [],
- reducers: input.reducers || [],
- isLoadingFuncs: input.isLoadingFuncs || [],
- contextInit: [].concat(input.contextInit || []),
- eventRefiners: input.eventRefiners || {},
- eventDefMemberAdders: input.eventDefMemberAdders || [],
- eventSourceRefiners: input.eventSourceRefiners || {},
- isDraggableTransformers: input.isDraggableTransformers || [],
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
- dateSelectionTransformers: input.dateSelectionTransformers || [],
- datePointTransforms: input.datePointTransforms || [],
- dateSpanTransforms: input.dateSpanTransforms || [],
- views: input.views || {},
- viewPropsTransformers: input.viewPropsTransformers || [],
- isPropsValid: input.isPropsValid || null,
- externalDefTransforms: input.externalDefTransforms || [],
- viewContainerAppends: input.viewContainerAppends || [],
- eventDropTransformers: input.eventDropTransformers || [],
- componentInteractions: input.componentInteractions || [],
- calendarInteractions: input.calendarInteractions || [],
- themeClasses: input.themeClasses || {},
- eventSourceDefs: input.eventSourceDefs || [],
- cmdFormatter: input.cmdFormatter,
- recurringTypes: input.recurringTypes || [],
- namedTimeZonedImpl: input.namedTimeZonedImpl,
- initialView: input.initialView || "",
- elementDraggingImpl: input.elementDraggingImpl,
- optionChangeHandlers: input.optionChangeHandlers || {},
- scrollGridImpl: input.scrollGridImpl || null,
- listenerRefiners: input.listenerRefiners || {},
- optionRefiners: input.optionRefiners || {},
- propSetHandlers: input.propSetHandlers || {}
- };
- }
- function buildPluginHooks(pluginDefs, globalDefs) {
- let currentPluginIds = {};
- let hooks = {
- premiumReleaseDate: void 0,
- reducers: [],
- isLoadingFuncs: [],
- contextInit: [],
- eventRefiners: {},
- eventDefMemberAdders: [],
- eventSourceRefiners: {},
- isDraggableTransformers: [],
- eventDragMutationMassagers: [],
- eventDefMutationAppliers: [],
- dateSelectionTransformers: [],
- datePointTransforms: [],
- dateSpanTransforms: [],
- views: {},
- viewPropsTransformers: [],
- isPropsValid: null,
- externalDefTransforms: [],
- viewContainerAppends: [],
- eventDropTransformers: [],
- componentInteractions: [],
- calendarInteractions: [],
- themeClasses: {},
- eventSourceDefs: [],
- cmdFormatter: null,
- recurringTypes: [],
- namedTimeZonedImpl: null,
- initialView: "",
- elementDraggingImpl: null,
- optionChangeHandlers: {},
- scrollGridImpl: null,
- listenerRefiners: {},
- optionRefiners: {},
- propSetHandlers: {}
- };
- function addDefs(defs) {
- for (let def of defs) {
- const pluginName = def.name;
- const currentId = currentPluginIds[pluginName];
- if (currentId === void 0) {
- currentPluginIds[pluginName] = def.id;
- addDefs(def.deps);
- hooks = combineHooks(hooks, def);
- } else if (currentId !== def.id) {
- console.warn(`Duplicate plugin '${pluginName}'`);
- }
- }
- }
- if (pluginDefs) {
- addDefs(pluginDefs);
- }
- addDefs(globalDefs);
- return hooks;
- }
- function buildBuildPluginHooks() {
- let currentOverrideDefs = [];
- let currentGlobalDefs = [];
- let currentHooks;
- return (overrideDefs, globalDefs) => {
- if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
- currentHooks = buildPluginHooks(overrideDefs, globalDefs);
- }
- currentOverrideDefs = overrideDefs;
- currentGlobalDefs = globalDefs;
- return currentHooks;
- };
- }
- function combineHooks(hooks0, hooks1) {
- return {
- premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate),
- reducers: hooks0.reducers.concat(hooks1.reducers),
- isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
- contextInit: hooks0.contextInit.concat(hooks1.contextInit),
- eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
- eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
- eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
- views: Object.assign(Object.assign({}, hooks0.views), hooks1.views),
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
- viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
- themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses),
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
- initialView: hooks0.initialView || hooks1.initialView,
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
- optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
- scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
- listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
- optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
- propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers)
- };
- }
- function compareOptionalDates(date0, date1) {
- if (date0 === void 0) {
- return date1;
- }
- if (date1 === void 0) {
- return date0;
- }
- return new Date(Math.max(date0.valueOf(), date1.valueOf()));
- }
- var StandardTheme = class extends Theme {
- };
- StandardTheme.prototype.classes = {
- root: "fc-theme-standard",
- tableCellShaded: "fc-cell-shaded",
- buttonGroup: "fc-button-group",
- button: "fc-button fc-button-primary",
- buttonActive: "fc-button-active"
- };
- StandardTheme.prototype.baseIconClass = "fc-icon";
- StandardTheme.prototype.iconClasses = {
- close: "fc-icon-x",
- prev: "fc-icon-chevron-left",
- next: "fc-icon-chevron-right",
- prevYear: "fc-icon-chevrons-left",
- nextYear: "fc-icon-chevrons-right"
- };
- StandardTheme.prototype.rtlIconClasses = {
- prev: "fc-icon-chevron-right",
- next: "fc-icon-chevron-left",
- prevYear: "fc-icon-chevrons-right",
- nextYear: "fc-icon-chevrons-left"
- };
- StandardTheme.prototype.iconOverrideOption = "buttonIcons";
- StandardTheme.prototype.iconOverrideCustomButtonOption = "icon";
- StandardTheme.prototype.iconOverridePrefix = "fc-icon-";
- function compileViewDefs(defaultConfigs, overrideConfigs) {
- let hash = {};
- let viewType;
- for (viewType in defaultConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- for (viewType in overrideConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- return hash;
- }
- function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- if (hash[viewType]) {
- return hash[viewType];
- }
- let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- if (viewDef) {
- hash[viewType] = viewDef;
- }
- return viewDef;
- }
- function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- let defaultConfig = defaultConfigs[viewType];
- let overrideConfig = overrideConfigs[viewType];
- let queryProp = (name) => defaultConfig && defaultConfig[name] !== null ? defaultConfig[name] : overrideConfig && overrideConfig[name] !== null ? overrideConfig[name] : null;
- let theComponent = queryProp("component");
- let superType = queryProp("superType");
- let superDef = null;
- if (superType) {
- if (superType === viewType) {
- throw new Error("Can't have a custom view type that references itself");
- }
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
- }
- if (!theComponent && superDef) {
- theComponent = superDef.component;
- }
- if (!theComponent) {
- return null;
- }
- return {
- type: viewType,
- component: theComponent,
- defaults: Object.assign(Object.assign({}, superDef ? superDef.defaults : {}), defaultConfig ? defaultConfig.rawOptions : {}),
- overrides: Object.assign(Object.assign({}, superDef ? superDef.overrides : {}), overrideConfig ? overrideConfig.rawOptions : {})
- };
- }
- function parseViewConfigs(inputs) {
- return mapHash(inputs, parseViewConfig);
- }
- function parseViewConfig(input) {
- let rawOptions = typeof input === "function" ? { component: input } : input;
- let { component } = rawOptions;
- if (rawOptions.content) {
- component = createViewHookComponent(rawOptions);
- } else if (component && !(component.prototype instanceof BaseComponent)) {
- component = createViewHookComponent(Object.assign(Object.assign({}, rawOptions), { content: component }));
- }
- return {
- superType: rawOptions.type,
- component,
- rawOptions
- // includes type and component too :(
- };
- }
- function createViewHookComponent(options) {
- return (viewProps) => y(ViewContextType.Consumer, null, (context) => y(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: void 0, customGenerator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount }));
- }
- function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
- let defaultConfigs = parseViewConfigs(defaultInputs);
- let overrideConfigs = parseViewConfigs(optionOverrides.views);
- let viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
- return mapHash(viewDefs, (viewDef) => buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults));
- }
- function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
- let durationInput = viewDef.overrides.duration || viewDef.defaults.duration || dynamicOptionOverrides.duration || optionOverrides.duration;
- let duration = null;
- let durationUnit = "";
- let singleUnit = "";
- let singleUnitOverrides = {};
- if (durationInput) {
- duration = createDurationCached(durationInput);
- if (duration) {
- let denom = greatestDurationDenominator(duration);
- durationUnit = denom.unit;
- if (denom.value === 1) {
- singleUnit = durationUnit;
- singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {};
- }
- }
- }
- let queryButtonText = (optionsSubset) => {
- let buttonTextMap = optionsSubset.buttonText || {};
- let buttonTextKey = viewDef.defaults.buttonTextKey;
- if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
- return buttonTextMap[buttonTextKey];
- }
- if (buttonTextMap[viewDef.type] != null) {
- return buttonTextMap[viewDef.type];
- }
- if (buttonTextMap[singleUnit] != null) {
- return buttonTextMap[singleUnit];
- }
- return null;
- };
- let queryButtonTitle = (optionsSubset) => {
- let buttonHints = optionsSubset.buttonHints || {};
- let buttonKey = viewDef.defaults.buttonTextKey;
- if (buttonKey != null && buttonHints[buttonKey] != null) {
- return buttonHints[buttonKey];
- }
- if (buttonHints[viewDef.type] != null) {
- return buttonHints[viewDef.type];
- }
- if (buttonHints[singleUnit] != null) {
- return buttonHints[singleUnit];
- }
- return null;
- };
- return {
- type: viewDef.type,
- component: viewDef.component,
- duration,
- durationUnit,
- singleUnit,
- optionDefaults: viewDef.defaults,
- optionOverrides: Object.assign(Object.assign({}, singleUnitOverrides), viewDef.overrides),
- buttonTextOverride: queryButtonText(dynamicOptionOverrides) || queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence
- viewDef.overrides.buttonText,
- buttonTextDefault: queryButtonText(localeDefaults) || viewDef.defaults.buttonText || queryButtonText(BASE_OPTION_DEFAULTS) || viewDef.type,
- // not DRY
- buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) || queryButtonTitle(optionOverrides) || viewDef.overrides.buttonHint,
- buttonTitleDefault: queryButtonTitle(localeDefaults) || viewDef.defaults.buttonHint || queryButtonTitle(BASE_OPTION_DEFAULTS)
- // will eventually fall back to buttonText
- };
- }
- var durationInputMap = {};
- function createDurationCached(durationInput) {
- let json = JSON.stringify(durationInput);
- let res = durationInputMap[json];
- if (res === void 0) {
- res = createDuration(durationInput);
- durationInputMap[json] = res;
- }
- return res;
- }
- function reduceViewType(viewType, action) {
- switch (action.type) {
- case "CHANGE_VIEW_TYPE":
- viewType = action.viewType;
- }
- return viewType;
- }
- function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) {
- switch (action.type) {
- case "SET_OPTION":
- return Object.assign(Object.assign({}, dynamicOptionOverrides), { [action.optionName]: action.rawOptionValue });
- default:
- return dynamicOptionOverrides;
- }
- }
- function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
- let dp;
- switch (action.type) {
- case "CHANGE_VIEW_TYPE":
- return dateProfileGenerator.build(action.dateMarker || currentDate);
- case "CHANGE_DATE":
- return dateProfileGenerator.build(action.dateMarker);
- case "PREV":
- dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
- if (dp.isValid) {
- return dp;
- }
- break;
- case "NEXT":
- dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
- if (dp.isValid) {
- return dp;
- }
- break;
- }
- return currentDateProfile;
- }
- function initEventSources(calendarOptions, dateProfile, context) {
- let activeRange = dateProfile ? dateProfile.activeRange : null;
- return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
- }
- function reduceEventSources(eventSources, action, dateProfile, context) {
- let activeRange = dateProfile ? dateProfile.activeRange : null;
- switch (action.type) {
- case "ADD_EVENT_SOURCES":
- return addSources(eventSources, action.sources, activeRange, context);
- case "REMOVE_EVENT_SOURCE":
- return removeSource(eventSources, action.sourceId);
- case "PREV":
- case "NEXT":
- case "CHANGE_DATE":
- case "CHANGE_VIEW_TYPE":
- if (dateProfile) {
- return fetchDirtySources(eventSources, activeRange, context);
- }
- return eventSources;
- case "FETCH_EVENT_SOURCES":
- return fetchSourcesByIds(eventSources, action.sourceIds ? (
- // why no type?
- arrayToHash(action.sourceIds)
- ) : excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context);
- case "RECEIVE_EVENTS":
- case "RECEIVE_EVENT_ERROR":
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
- case "REMOVE_ALL_EVENT_SOURCES":
- return {};
- default:
- return eventSources;
- }
- }
- function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) {
- let activeRange = dateProfile ? dateProfile.activeRange : null;
- return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context);
- }
- function computeEventSourcesLoading(eventSources) {
- for (let sourceId in eventSources) {
- if (eventSources[sourceId].isFetching) {
- return true;
- }
- }
- return false;
- }
- function addSources(eventSourceHash, sources, fetchRange, context) {
- let hash = {};
- for (let source of sources) {
- hash[source.sourceId] = source;
- }
- if (fetchRange) {
- hash = fetchDirtySources(hash, fetchRange, context);
- }
- return Object.assign(Object.assign({}, eventSourceHash), hash);
- }
- function removeSource(eventSourceHash, sourceId) {
- return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId);
- }
- function fetchDirtySources(sourceHash, fetchRange, context) {
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context);
- }
- function isSourceDirty(eventSource, fetchRange, context) {
- if (!doesSourceNeedRange(eventSource, context)) {
- return !eventSource.latestFetchId;
- }
- return !context.options.lazyFetching || !eventSource.fetchRange || eventSource.isFetching || // always cancel outdated in-progress fetches
- fetchRange.start < eventSource.fetchRange.start || fetchRange.end > eventSource.fetchRange.end;
- }
- function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) {
- let nextSources = {};
- for (let sourceId in prevSources) {
- let source = prevSources[sourceId];
- if (sourceIdHash[sourceId]) {
- nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context);
- } else {
- nextSources[sourceId] = source;
- }
- }
- return nextSources;
- }
- function fetchSource(eventSource, fetchRange, isRefetch, context) {
- let { options, calendarApi } = context;
- let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
- let fetchId = guid();
- sourceDef.fetch({
- eventSource,
- range: fetchRange,
- isRefetch,
- context
- }, (res) => {
- let { rawEvents } = res;
- if (options.eventSourceSuccess) {
- rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents;
- }
- if (eventSource.success) {
- rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents;
- }
- context.dispatch({
- type: "RECEIVE_EVENTS",
- sourceId: eventSource.sourceId,
- fetchId,
- fetchRange,
- rawEvents
- });
- }, (error) => {
- let errorHandled = false;
- if (options.eventSourceFailure) {
- options.eventSourceFailure.call(calendarApi, error);
- errorHandled = true;
- }
- if (eventSource.failure) {
- eventSource.failure(error);
- errorHandled = true;
- }
- if (!errorHandled) {
- console.warn(error.message, error);
- }
- context.dispatch({
- type: "RECEIVE_EVENT_ERROR",
- sourceId: eventSource.sourceId,
- fetchId,
- fetchRange,
- error
- });
- });
- return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
- }
- function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
- let eventSource = sourceHash[sourceId];
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId) {
- return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) });
- }
- return sourceHash;
- }
- function excludeStaticSources(eventSources, context) {
- return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context));
- }
- function parseInitialSources(rawOptions, context) {
- let refiners = buildEventSourceRefiners(context);
- let rawSources = [].concat(rawOptions.eventSources || []);
- let sources = [];
- if (rawOptions.initialEvents) {
- rawSources.unshift(rawOptions.initialEvents);
- }
- if (rawOptions.events) {
- rawSources.unshift(rawOptions.events);
- }
- for (let rawSource of rawSources) {
- let source = parseEventSource(rawSource, context, refiners);
- if (source) {
- sources.push(source);
- }
- }
- return sources;
- }
- function doesSourceNeedRange(eventSource, context) {
- let defs = context.pluginHooks.eventSourceDefs;
- return !defs[eventSource.sourceDefId].ignoreRange;
- }
- function reduceDateSelection(currentSelection, action) {
- switch (action.type) {
- case "UNSELECT_DATES":
- return null;
- case "SELECT_DATES":
- return action.selection;
- default:
- return currentSelection;
- }
- }
- function reduceSelectedEvent(currentInstanceId, action) {
- switch (action.type) {
- case "UNSELECT_EVENT":
- return "";
- case "SELECT_EVENT":
- return action.eventInstanceId;
- default:
- return currentInstanceId;
- }
- }
- function reduceEventDrag(currentDrag, action) {
- let newDrag;
- switch (action.type) {
- case "UNSET_EVENT_DRAG":
- return null;
- case "SET_EVENT_DRAG":
- newDrag = action.state;
- return {
- affectedEvents: newDrag.affectedEvents,
- mutatedEvents: newDrag.mutatedEvents,
- isEvent: newDrag.isEvent
- };
- default:
- return currentDrag;
- }
- }
- function reduceEventResize(currentResize, action) {
- let newResize;
- switch (action.type) {
- case "UNSET_EVENT_RESIZE":
- return null;
- case "SET_EVENT_RESIZE":
- newResize = action.state;
- return {
- affectedEvents: newResize.affectedEvents,
- mutatedEvents: newResize.mutatedEvents,
- isEvent: newResize.isEvent
- };
- default:
- return currentResize;
- }
- }
- function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
- let header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null;
- let footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null;
- return { header, footer };
- }
- function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
- let sectionWidgets = {};
- let viewsWithButtons = [];
- let hasTitle = false;
- for (let sectionName in sectionStrHash) {
- let sectionStr = sectionStrHash[sectionName];
- let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi);
- sectionWidgets[sectionName] = sectionRes.widgets;
- viewsWithButtons.push(...sectionRes.viewsWithButtons);
- hasTitle = hasTitle || sectionRes.hasTitle;
- }
- return { sectionWidgets, viewsWithButtons, hasTitle };
- }
- function parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
- let isRtl = calendarOptions.direction === "rtl";
- let calendarCustomButtons = calendarOptions.customButtons || {};
- let calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {};
- let calendarButtonText = calendarOptions.buttonText || {};
- let calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {};
- let calendarButtonHints = calendarOptions.buttonHints || {};
- let sectionSubstrs = sectionStr ? sectionStr.split(" ") : [];
- let viewsWithButtons = [];
- let hasTitle = false;
- let widgets = sectionSubstrs.map((buttonGroupStr) => buttonGroupStr.split(",").map((buttonName) => {
- if (buttonName === "title") {
- hasTitle = true;
- return { buttonName };
- }
- let customButtonProps;
- let viewSpec;
- let buttonClick;
- let buttonIcon;
- let buttonText;
- let buttonHint;
- if (customButtonProps = calendarCustomButtons[buttonName]) {
- buttonClick = (ev) => {
- if (customButtonProps.click) {
- customButtonProps.click.call(ev.target, ev, ev.target);
- }
- };
- (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = customButtonProps.text);
- buttonHint = customButtonProps.hint || customButtonProps.text;
- } else if (viewSpec = viewSpecs[buttonName]) {
- viewsWithButtons.push(buttonName);
- buttonClick = () => {
- calendarApi.changeView(buttonName);
- };
- (buttonText = viewSpec.buttonTextOverride) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = viewSpec.buttonTextDefault);
- let textFallback = viewSpec.buttonTextOverride || viewSpec.buttonTextDefault;
- buttonHint = formatWithOrdinals(
- viewSpec.buttonTitleOverride || viewSpec.buttonTitleDefault || calendarOptions.viewHint,
- [textFallback, buttonName],
- // view-name = buttonName
- textFallback
- );
- } else if (calendarApi[buttonName]) {
- buttonClick = () => {
- calendarApi[buttonName]();
- };
- (buttonText = calendarButtonTextOverrides[buttonName]) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = calendarButtonText[buttonName]);
- if (buttonName === "prevYear" || buttonName === "nextYear") {
- let prevOrNext = buttonName === "prevYear" ? "prev" : "next";
- buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || calendarButtonHints[prevOrNext], [
- calendarButtonText.year || "year",
- "year"
- ], calendarButtonText[buttonName]);
- } else {
- buttonHint = (navUnit) => formatWithOrdinals(calendarButtonHintOverrides[buttonName] || calendarButtonHints[buttonName], [
- calendarButtonText[navUnit] || navUnit,
- navUnit
- ], calendarButtonText[buttonName]);
- }
- }
- return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
- }));
- return { widgets, viewsWithButtons, hasTitle };
- }
- var ViewImpl = class {
- constructor(type, getCurrentData, dateEnv) {
- this.type = type;
- this.getCurrentData = getCurrentData;
- this.dateEnv = dateEnv;
- }
- get calendar() {
- return this.getCurrentData().calendarApi;
- }
- get title() {
- return this.getCurrentData().viewTitle;
- }
- get activeStart() {
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
- }
- get activeEnd() {
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
- }
- get currentStart() {
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
- }
- get currentEnd() {
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
- }
- getOption(name) {
- return this.getCurrentData().options[name];
- }
- };
- var eventSourceDef$2 = {
- ignoreRange: true,
- parseMeta(refined) {
- if (Array.isArray(refined.events)) {
- return refined.events;
- }
- return null;
- },
- fetch(arg, successCallback) {
- successCallback({
- rawEvents: arg.eventSource.meta
- });
- }
- };
- var arrayEventSourcePlugin = createPlugin({
- name: "array-event-source",
- eventSourceDefs: [eventSourceDef$2]
- });
- var eventSourceDef$1 = {
- parseMeta(refined) {
- if (typeof refined.events === "function") {
- return refined.events;
- }
- return null;
- },
- fetch(arg, successCallback, errorCallback) {
- const { dateEnv } = arg.context;
- const func = arg.eventSource.meta;
- unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback);
- }
- };
- var funcEventSourcePlugin = createPlugin({
- name: "func-event-source",
- eventSourceDefs: [eventSourceDef$1]
- });
- var JSON_FEED_EVENT_SOURCE_REFINERS = {
- method: String,
- extraParams: identity,
- startParam: String,
- endParam: String,
- timeZoneParam: String
- };
- var eventSourceDef = {
- parseMeta(refined) {
- if (refined.url && (refined.format === "json" || !refined.format)) {
- return {
- url: refined.url,
- format: "json",
- method: (refined.method || "GET").toUpperCase(),
- extraParams: refined.extraParams,
- startParam: refined.startParam,
- endParam: refined.endParam,
- timeZoneParam: refined.timeZoneParam
- };
- }
- return null;
- },
- fetch(arg, successCallback, errorCallback) {
- const { meta } = arg.eventSource;
- const requestParams = buildRequestParams(meta, arg.range, arg.context);
- requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => {
- successCallback({ rawEvents, response });
- }, errorCallback);
- }
- };
- var jsonFeedEventSourcePlugin = createPlugin({
- name: "json-event-source",
- eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
- eventSourceDefs: [eventSourceDef]
- });
- function buildRequestParams(meta, range, context) {
- let { dateEnv, options } = context;
- let startParam;
- let endParam;
- let timeZoneParam;
- let customRequestParams;
- let params = {};
- startParam = meta.startParam;
- if (startParam == null) {
- startParam = options.startParam;
- }
- endParam = meta.endParam;
- if (endParam == null) {
- endParam = options.endParam;
- }
- timeZoneParam = meta.timeZoneParam;
- if (timeZoneParam == null) {
- timeZoneParam = options.timeZoneParam;
- }
- if (typeof meta.extraParams === "function") {
- customRequestParams = meta.extraParams();
- } else {
- customRequestParams = meta.extraParams || {};
- }
- Object.assign(params, customRequestParams);
- params[startParam] = dateEnv.formatIso(range.start);
- params[endParam] = dateEnv.formatIso(range.end);
- if (dateEnv.timeZone !== "local") {
- params[timeZoneParam] = dateEnv.timeZone;
- }
- return params;
- }
- var SIMPLE_RECURRING_REFINERS = {
- daysOfWeek: identity,
- startTime: createDuration,
- endTime: createDuration,
- duration: createDuration,
- startRecur: identity,
- endRecur: identity
- };
- var recurring = {
- parse(refined, dateEnv) {
- if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
- let recurringData = {
- daysOfWeek: refined.daysOfWeek || null,
- startTime: refined.startTime || null,
- endTime: refined.endTime || null,
- startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
- endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null
- };
- let duration;
- if (refined.duration) {
- duration = refined.duration;
- }
- if (!duration && refined.startTime && refined.endTime) {
- duration = subtractDurations(refined.endTime, refined.startTime);
- }
- return {
- allDayGuess: Boolean(!refined.startTime && !refined.endTime),
- duration,
- typeData: recurringData
- // doesn't need endTime anymore but oh well
- };
- }
- return null;
- },
- expand(typeData, framingRange, dateEnv) {
- let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
- if (clippedFramingRange) {
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
- }
- return [];
- }
- };
- var simpleRecurringEventsPlugin = createPlugin({
- name: "simple-recurring-event",
- recurringTypes: [recurring],
- eventRefiners: SIMPLE_RECURRING_REFINERS
- });
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
- let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
- let dayMarker = startOfDay(framingRange.start);
- let endMarker = framingRange.end;
- let instanceStarts = [];
- while (dayMarker < endMarker) {
- let instanceStart;
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
- if (startTime) {
- instanceStart = dateEnv.add(dayMarker, startTime);
- } else {
- instanceStart = dayMarker;
- }
- instanceStarts.push(instanceStart);
- }
- dayMarker = addDays(dayMarker, 1);
- }
- return instanceStarts;
- }
- var changeHandlerPlugin = createPlugin({
- name: "change-handler",
- optionChangeHandlers: {
- events(events, context) {
- handleEventSources([events], context);
- },
- eventSources: handleEventSources
- }
- });
- function handleEventSources(inputs, context) {
- let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
- if (unfoundSources.length === 1 && inputs.length === 1 && Array.isArray(unfoundSources[0]._raw) && Array.isArray(inputs[0])) {
- context.dispatch({
- type: "RESET_RAW_EVENTS",
- sourceId: unfoundSources[0].sourceId,
- rawEvents: inputs[0]
- });
- return;
- }
- let newInputs = [];
- for (let input of inputs) {
- let inputFound = false;
- for (let i3 = 0; i3 < unfoundSources.length; i3 += 1) {
- if (unfoundSources[i3]._raw === input) {
- unfoundSources.splice(i3, 1);
- inputFound = true;
- break;
- }
- }
- if (!inputFound) {
- newInputs.push(input);
- }
- }
- for (let unfoundSource of unfoundSources) {
- context.dispatch({
- type: "REMOVE_EVENT_SOURCE",
- sourceId: unfoundSource.sourceId
- });
- }
- for (let newInput of newInputs) {
- context.calendarApi.addEventSource(newInput);
- }
- }
- function handleDateProfile(dateProfile, context) {
- context.emitter.trigger("datesSet", Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
- }
- function handleEventStore(eventStore, context) {
- let { emitter } = context;
- if (emitter.hasHandlers("eventsSet")) {
- emitter.trigger("eventsSet", buildEventApis(eventStore, context));
- }
- }
- var globalPlugins = [
- arrayEventSourcePlugin,
- funcEventSourcePlugin,
- jsonFeedEventSourcePlugin,
- simpleRecurringEventsPlugin,
- changeHandlerPlugin,
- createPlugin({
- name: "misc",
- isLoadingFuncs: [
- (state) => computeEventSourcesLoading(state.eventSources)
- ],
- propSetHandlers: {
- dateProfile: handleDateProfile,
- eventStore: handleEventStore
- }
- })
- ];
- var TaskRunner = class {
- constructor(runTaskOption, drainedOption) {
- this.runTaskOption = runTaskOption;
- this.drainedOption = drainedOption;
- this.queue = [];
- this.delayedRunner = new DelayedRunner(this.drain.bind(this));
- }
- request(task, delay) {
- this.queue.push(task);
- this.delayedRunner.request(delay);
- }
- pause(scope) {
- this.delayedRunner.pause(scope);
- }
- resume(scope, force) {
- this.delayedRunner.resume(scope, force);
- }
- drain() {
- let { queue } = this;
- while (queue.length) {
- let completedTasks = [];
- let task;
- while (task = queue.shift()) {
- this.runTask(task);
- completedTasks.push(task);
- }
- this.drained(completedTasks);
- }
- }
- runTask(task) {
- if (this.runTaskOption) {
- this.runTaskOption(task);
- }
- }
- drained(completedTasks) {
- if (this.drainedOption) {
- this.drainedOption(completedTasks);
- }
- }
- };
- function buildTitle(dateProfile, viewOptions, dateEnv) {
- let range;
- if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
- range = dateProfile.currentRange;
- } else {
- range = dateProfile.activeRange;
- }
- return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), {
- isEndExclusive: dateProfile.isRangeAllDay,
- defaultSeparator: viewOptions.titleRangeSeparator
- });
- }
- function buildTitleFormat(dateProfile) {
- let { currentRangeUnit } = dateProfile;
- if (currentRangeUnit === "year") {
- return { year: "numeric" };
- }
- if (currentRangeUnit === "month") {
- return { year: "numeric", month: "long" };
- }
- let days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
- if (days !== null && days > 1) {
- return { year: "numeric", month: "short", day: "numeric" };
- }
- return { year: "numeric", month: "long", day: "numeric" };
- }
- var CalendarDataManager = class {
- constructor(props) {
- this.computeCurrentViewData = memoize(this._computeCurrentViewData);
- this.organizeRawLocales = memoize(organizeRawLocales);
- this.buildLocale = memoize(buildLocale);
- this.buildPluginHooks = buildBuildPluginHooks();
- this.buildDateEnv = memoize(buildDateEnv$1);
- this.buildTheme = memoize(buildTheme);
- this.parseToolbars = memoize(parseToolbars);
- this.buildViewSpecs = memoize(buildViewSpecs);
- this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator);
- this.buildViewApi = memoize(buildViewApi);
- this.buildViewUiProps = memoizeObjArg(buildViewUiProps);
- this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual);
- this.buildEventUiBases = memoize(buildEventUiBases);
- this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours);
- this.buildTitle = memoize(buildTitle);
- this.emitter = new Emitter();
- this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this));
- this.currentCalendarOptionsInput = {};
- this.currentCalendarOptionsRefined = {};
- this.currentViewOptionsInput = {};
- this.currentViewOptionsRefined = {};
- this.currentCalendarOptionsRefiners = {};
- this.optionsForRefining = [];
- this.optionsForHandling = [];
- this.getCurrentData = () => this.data;
- this.dispatch = (action) => {
- this.actionRunner.request(action);
- };
- this.props = props;
- this.actionRunner.pause();
- let dynamicOptionOverrides = {};
- let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
- let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView;
- let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides);
- props.calendarApi.currentDataManager = this;
- this.emitter.setThisContext(props.calendarApi);
- this.emitter.setOptions(currentViewData.options);
- let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv);
- let dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
- if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) {
- currentDate = dateProfile.currentRange.start;
- }
- let calendarContext = {
- dateEnv: optionsData.dateEnv,
- options: optionsData.calendarOptions,
- pluginHooks: optionsData.pluginHooks,
- calendarApi: props.calendarApi,
- dispatch: this.dispatch,
- emitter: this.emitter,
- getCurrentData: this.getCurrentData
- };
- for (let callback of optionsData.pluginHooks.contextInit) {
- callback(calendarContext);
- }
- let eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext);
- let initialState = {
- dynamicOptionOverrides,
- currentViewType,
- currentDate,
- dateProfile,
- businessHours: this.parseContextBusinessHours(calendarContext),
- eventSources,
- eventUiBases: {},
- eventStore: createEmptyEventStore(),
- renderableEventStore: createEmptyEventStore(),
- dateSelection: null,
- eventSelection: "",
- eventDrag: null,
- eventResize: null,
- selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig
- };
- let contextAndState = Object.assign(Object.assign({}, calendarContext), initialState);
- for (let reducer of optionsData.pluginHooks.reducers) {
- Object.assign(initialState, reducer(null, null, contextAndState));
- }
- if (computeIsLoading(initialState, calendarContext)) {
- this.emitter.trigger("loading", true);
- }
- this.state = initialState;
- this.updateData();
- this.actionRunner.resume();
- }
- resetOptions(optionOverrides, changedOptionNames) {
- let { props } = this;
- if (changedOptionNames === void 0) {
- props.optionOverrides = optionOverrides;
- } else {
- props.optionOverrides = Object.assign(Object.assign({}, props.optionOverrides || {}), optionOverrides);
- this.optionsForRefining.push(...changedOptionNames);
- }
- if (changedOptionNames === void 0 || changedOptionNames.length) {
- this.actionRunner.request({
- type: "NOTHING"
- });
- }
- }
- _handleAction(action) {
- let { props, state, emitter } = this;
- let dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action);
- let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
- let currentViewType = reduceViewType(state.currentViewType, action);
- let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides);
- props.calendarApi.currentDataManager = this;
- emitter.setThisContext(props.calendarApi);
- emitter.setOptions(currentViewData.options);
- let calendarContext = {
- dateEnv: optionsData.dateEnv,
- options: optionsData.calendarOptions,
- pluginHooks: optionsData.pluginHooks,
- calendarApi: props.calendarApi,
- dispatch: this.dispatch,
- emitter,
- getCurrentData: this.getCurrentData
- };
- let { currentDate, dateProfile } = state;
- if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) {
- dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
- }
- currentDate = reduceCurrentDate(currentDate, action);
- dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator);
- if (action.type === "PREV" || // TODO: move this logic into DateProfileGenerator
- action.type === "NEXT" || // "
- !rangeContainsMarker(dateProfile.currentRange, currentDate)) {
- currentDate = dateProfile.currentRange.start;
- }
- let eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext);
- let eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext);
- let isEventsLoading = computeEventSourcesLoading(eventSources);
- let renderableEventStore = isEventsLoading && !currentViewData.options.progressiveEventRendering ? state.renderableEventStore || eventStore : (
- // try from previous state
- eventStore
- );
- let { eventUiSingleBase, selectionConfig } = this.buildViewUiProps(calendarContext);
- let eventUiBySource = this.buildEventUiBySource(eventSources);
- let eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
- let newState = {
- dynamicOptionOverrides,
- currentViewType,
- currentDate,
- dateProfile,
- eventSources,
- eventStore,
- renderableEventStore,
- selectionConfig,
- eventUiBases,
- businessHours: this.parseContextBusinessHours(calendarContext),
- dateSelection: reduceDateSelection(state.dateSelection, action),
- eventSelection: reduceSelectedEvent(state.eventSelection, action),
- eventDrag: reduceEventDrag(state.eventDrag, action),
- eventResize: reduceEventResize(state.eventResize, action)
- };
- let contextAndState = Object.assign(Object.assign({}, calendarContext), newState);
- for (let reducer of optionsData.pluginHooks.reducers) {
- Object.assign(newState, reducer(state, action, contextAndState));
- }
- let wasLoading = computeIsLoading(state, calendarContext);
- let isLoading = computeIsLoading(newState, calendarContext);
- if (!wasLoading && isLoading) {
- emitter.trigger("loading", true);
- } else if (wasLoading && !isLoading) {
- emitter.trigger("loading", false);
- }
- this.state = newState;
- if (props.onAction) {
- props.onAction(action);
- }
- }
- updateData() {
- let { props, state } = this;
- let oldData = this.data;
- let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi);
- let currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides);
- let data = this.data = Object.assign(Object.assign(Object.assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state);
- let changeHandlers = optionsData.pluginHooks.optionChangeHandlers;
- let oldCalendarOptions = oldData && oldData.calendarOptions;
- let newCalendarOptions = optionsData.calendarOptions;
- if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) {
- if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) {
- state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data);
- state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv);
- state.renderableEventStore = data.renderableEventStore = rezoneEventStoreDates(data.renderableEventStore, oldData.dateEnv, data.dateEnv);
- }
- for (let optionName in changeHandlers) {
- if (this.optionsForHandling.indexOf(optionName) !== -1 || oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) {
- changeHandlers[optionName](newCalendarOptions[optionName], data);
- }
- }
- }
- this.optionsForHandling = [];
- if (props.onData) {
- props.onData(data);
- }
- }
- computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) {
- if (!this.optionsForRefining.length && optionOverrides === this.stableOptionOverrides && dynamicOptionOverrides === this.stableDynamicOptionOverrides) {
- return this.stableCalendarOptionsData;
- }
- let { refinedOptions, pluginHooks, localeDefaults, availableLocaleData, extra } = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides);
- warnUnknownOptions(extra);
- let dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator);
- let viewSpecs = this.buildViewSpecs(pluginHooks.views, this.stableOptionOverrides, this.stableDynamicOptionOverrides, localeDefaults);
- let theme = this.buildTheme(refinedOptions, pluginHooks);
- let toolbarConfig = this.parseToolbars(refinedOptions, this.stableOptionOverrides, theme, viewSpecs, calendarApi);
- return this.stableCalendarOptionsData = {
- calendarOptions: refinedOptions,
- pluginHooks,
- dateEnv,
- viewSpecs,
- theme,
- toolbarConfig,
- localeDefaults,
- availableRawLocales: availableLocaleData.map
- };
- }
- // always called from behind a memoizer
- processRawCalendarOptions(optionOverrides, dynamicOptionOverrides) {
- let { locales, locale } = mergeRawOptions([
- BASE_OPTION_DEFAULTS,
- optionOverrides,
- dynamicOptionOverrides
- ]);
- let availableLocaleData = this.organizeRawLocales(locales);
- let availableRawLocales = availableLocaleData.map;
- let localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options;
- let pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins);
- let refiners = this.currentCalendarOptionsRefiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
- let extra = {};
- let raw = mergeRawOptions([
- BASE_OPTION_DEFAULTS,
- localeDefaults,
- optionOverrides,
- dynamicOptionOverrides
- ]);
- let refined = {};
- let currentRaw = this.currentCalendarOptionsInput;
- let currentRefined = this.currentCalendarOptionsRefined;
- let anyChanges = false;
- for (let optionName in raw) {
- if (this.optionsForRefining.indexOf(optionName) === -1 && (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && optionName in currentRaw && COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) {
- refined[optionName] = currentRefined[optionName];
- } else if (refiners[optionName]) {
- refined[optionName] = refiners[optionName](raw[optionName]);
- anyChanges = true;
- } else {
- extra[optionName] = currentRaw[optionName];
- }
- }
- if (anyChanges) {
- this.currentCalendarOptionsInput = raw;
- this.currentCalendarOptionsRefined = refined;
- this.stableOptionOverrides = optionOverrides;
- this.stableDynamicOptionOverrides = dynamicOptionOverrides;
- }
- this.optionsForHandling.push(...this.optionsForRefining);
- this.optionsForRefining = [];
- return {
- rawOptions: this.currentCalendarOptionsInput,
- refinedOptions: this.currentCalendarOptionsRefined,
- pluginHooks,
- availableLocaleData,
- localeDefaults,
- extra
- };
- }
- _computeCurrentViewData(viewType, optionsData, optionOverrides, dynamicOptionOverrides) {
- let viewSpec = optionsData.viewSpecs[viewType];
- if (!viewSpec) {
- throw new Error(`viewType "${viewType}" is not available. Please make sure you've loaded all neccessary plugins`);
- }
- let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides);
- warnUnknownOptions(extra);
- let dateProfileGenerator = this.buildDateProfileGenerator({
- dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass,
- duration: viewSpec.duration,
- durationUnit: viewSpec.durationUnit,
- usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime,
- dateEnv: optionsData.dateEnv,
- calendarApi: this.props.calendarApi,
- slotMinTime: refinedOptions.slotMinTime,
- slotMaxTime: refinedOptions.slotMaxTime,
- showNonCurrentDates: refinedOptions.showNonCurrentDates,
- dayCount: refinedOptions.dayCount,
- dateAlignment: refinedOptions.dateAlignment,
- dateIncrement: refinedOptions.dateIncrement,
- hiddenDays: refinedOptions.hiddenDays,
- weekends: refinedOptions.weekends,
- nowInput: refinedOptions.now,
- validRangeInput: refinedOptions.validRange,
- visibleRangeInput: refinedOptions.visibleRange,
- fixedWeekCount: refinedOptions.fixedWeekCount
- });
- let viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv);
- return { viewSpec, options: refinedOptions, dateProfileGenerator, viewApi };
- }
- processRawViewOptions(viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) {
- let raw = mergeRawOptions([
- BASE_OPTION_DEFAULTS,
- viewSpec.optionDefaults,
- localeDefaults,
- optionOverrides,
- viewSpec.optionOverrides,
- dynamicOptionOverrides
- ]);
- let refiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
- let refined = {};
- let currentRaw = this.currentViewOptionsInput;
- let currentRefined = this.currentViewOptionsRefined;
- let anyChanges = false;
- let extra = {};
- for (let optionName in raw) {
- if (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName])) {
- refined[optionName] = currentRefined[optionName];
- } else {
- if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName])) {
- if (optionName in this.currentCalendarOptionsRefined) {
- refined[optionName] = this.currentCalendarOptionsRefined[optionName];
- }
- } else if (refiners[optionName]) {
- refined[optionName] = refiners[optionName](raw[optionName]);
- } else {
- extra[optionName] = raw[optionName];
- }
- anyChanges = true;
- }
- }
- if (anyChanges) {
- this.currentViewOptionsInput = raw;
- this.currentViewOptionsRefined = refined;
- }
- return {
- rawOptions: this.currentViewOptionsInput,
- refinedOptions: this.currentViewOptionsRefined,
- extra
- };
- }
- };
- function buildDateEnv$1(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) {
- let locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map);
- return new DateEnv({
- calendarSystem: "gregory",
- timeZone,
- namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl,
- locale,
- weekNumberCalculation,
- firstDay,
- weekText,
- cmdFormatter: pluginHooks.cmdFormatter,
- defaultSeparator
- });
- }
- function buildTheme(options, pluginHooks) {
- let ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme;
- return new ThemeClass(options);
- }
- function buildDateProfileGenerator(props) {
- let DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator;
- return new DateProfileGeneratorClass(props);
- }
- function buildViewApi(type, getCurrentData, dateEnv) {
- return new ViewImpl(type, getCurrentData, dateEnv);
- }
- function buildEventUiBySource(eventSources) {
- return mapHash(eventSources, (eventSource) => eventSource.ui);
- }
- function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
- let eventUiBases = { "": eventUiSingleBase };
- for (let defId in eventDefs) {
- let def = eventDefs[defId];
- if (def.sourceId && eventUiBySource[def.sourceId]) {
- eventUiBases[defId] = eventUiBySource[def.sourceId];
- }
- }
- return eventUiBases;
- }
- function buildViewUiProps(calendarContext) {
- let { options } = calendarContext;
- return {
- eventUiSingleBase: createEventUi({
- display: options.eventDisplay,
- editable: options.editable,
- startEditable: options.eventStartEditable,
- durationEditable: options.eventDurationEditable,
- constraint: options.eventConstraint,
- overlap: typeof options.eventOverlap === "boolean" ? options.eventOverlap : void 0,
- allow: options.eventAllow,
- backgroundColor: options.eventBackgroundColor,
- borderColor: options.eventBorderColor,
- textColor: options.eventTextColor,
- color: options.eventColor
- // classNames: options.eventClassNames // render hook will handle this
- }, calendarContext),
- selectionConfig: createEventUi({
- constraint: options.selectConstraint,
- overlap: typeof options.selectOverlap === "boolean" ? options.selectOverlap : void 0,
- allow: options.selectAllow
- }, calendarContext)
- };
- }
- function computeIsLoading(state, context) {
- for (let isLoadingFunc of context.pluginHooks.isLoadingFuncs) {
- if (isLoadingFunc(state)) {
- return true;
- }
- }
- return false;
- }
- function parseContextBusinessHours(calendarContext) {
- return parseBusinessHours(calendarContext.options.businessHours, calendarContext);
- }
- function warnUnknownOptions(options, viewName) {
- for (let optionName in options) {
- console.warn(`Unknown option '${optionName}'` + (viewName ? ` for view '${viewName}'` : ""));
- }
- }
- var ToolbarSection = class extends BaseComponent {
- render() {
- let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup));
- return y("div", { className: "fc-toolbar-chunk" }, ...children);
- }
- renderWidgetGroup(widgetGroup) {
- let { props } = this;
- let { theme } = this.context;
- let children = [];
- let isOnlyButtons = true;
- for (let widget of widgetGroup) {
- let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget;
- if (buttonName === "title") {
- isOnlyButtons = false;
- children.push(y("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title));
- } else {
- let isPressed = buttonName === props.activeButton;
- let isDisabled = !props.isTodayEnabled && buttonName === "today" || !props.isPrevEnabled && buttonName === "prev" || !props.isNextEnabled && buttonName === "next";
- let buttonClasses = [`fc-${buttonName}-button`, theme.getClass("button")];
- if (isPressed) {
- buttonClasses.push(theme.getClass("buttonActive"));
- }
- children.push(y("button", { type: "button", title: typeof buttonHint === "function" ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(" "), onClick: buttonClick }, buttonText || (buttonIcon ? y("span", { className: buttonIcon, role: "img" }) : "")));
- }
- }
- if (children.length > 1) {
- let groupClassName = isOnlyButtons && theme.getClass("buttonGroup") || "";
- return y("div", { className: groupClassName }, ...children);
- }
- return children[0];
- }
- };
- var Toolbar = class extends BaseComponent {
- render() {
- let { model, extraClassName } = this.props;
- let forceLtr = false;
- let startContent;
- let endContent;
- let sectionWidgets = model.sectionWidgets;
- let centerContent = sectionWidgets.center;
- if (sectionWidgets.left) {
- forceLtr = true;
- startContent = sectionWidgets.left;
- } else {
- startContent = sectionWidgets.start;
- }
- if (sectionWidgets.right) {
- forceLtr = true;
- endContent = sectionWidgets.right;
- } else {
- endContent = sectionWidgets.end;
- }
- let classNames = [
- extraClassName || "",
- "fc-toolbar",
- forceLtr ? "fc-toolbar-ltr" : ""
- ];
- return y(
- "div",
- { className: classNames.join(" ") },
- this.renderSection("start", startContent || []),
- this.renderSection("center", centerContent || []),
- this.renderSection("end", endContent || [])
- );
- }
- renderSection(key, widgetGroups) {
- let { props } = this;
- return y(ToolbarSection, { key, widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId });
- }
- };
- var ViewHarness = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.state = {
- availableWidth: null
- };
- this.handleEl = (el) => {
- this.el = el;
- setRef(this.props.elRef, el);
- this.updateAvailableWidth();
- };
- this.handleResize = () => {
- this.updateAvailableWidth();
- };
- }
- render() {
- let { props, state } = this;
- let { aspectRatio } = props;
- let classNames = [
- "fc-view-harness",
- aspectRatio || props.liquid || props.height ? "fc-view-harness-active" : "fc-view-harness-passive"
- // let the view do the height
- ];
- let height = "";
- let paddingBottom = "";
- if (aspectRatio) {
- if (state.availableWidth !== null) {
- height = state.availableWidth / aspectRatio;
- } else {
- paddingBottom = `${1 / aspectRatio * 100}%`;
- }
- } else {
- height = props.height || "";
- }
- return y("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(" "), style: { height, paddingBottom } }, props.children);
- }
- componentDidMount() {
- this.context.addResizeHandler(this.handleResize);
- }
- componentWillUnmount() {
- this.context.removeResizeHandler(this.handleResize);
- }
- updateAvailableWidth() {
- if (this.el && // needed. but why?
- this.props.aspectRatio) {
- this.setState({ availableWidth: this.el.offsetWidth });
- }
- }
- };
- var EventClicking = class extends Interaction {
- constructor(settings) {
- super(settings);
- this.handleSegClick = (ev, segEl) => {
- let { component } = this;
- let { context } = component;
- let seg = getElSeg(segEl);
- if (seg && // might be the <div> surrounding the more link
- component.isValidSegDownEl(ev.target)) {
- let hasUrlContainer = elementClosest(ev.target, ".fc-event-forced-url");
- let url = hasUrlContainer ? hasUrlContainer.querySelector("a[href]").href : "";
- context.emitter.trigger("eventClick", {
- el: segEl,
- event: new EventImpl(component.context, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: context.viewApi
- });
- if (url && !ev.defaultPrevented) {
- window.location.href = url;
- }
- }
- };
- this.destroy = listenBySelector(
- settings.el,
- "click",
- ".fc-event",
- // on both fg and bg events
- this.handleSegClick
- );
- }
- };
- var EventHovering = class extends Interaction {
- constructor(settings) {
- super(settings);
- this.handleEventElRemove = (el) => {
- if (el === this.currentSegEl) {
- this.handleSegLeave(null, this.currentSegEl);
- }
- };
- this.handleSegEnter = (ev, segEl) => {
- if (getElSeg(segEl)) {
- this.currentSegEl = segEl;
- this.triggerEvent("eventMouseEnter", ev, segEl);
- }
- };
- this.handleSegLeave = (ev, segEl) => {
- if (this.currentSegEl) {
- this.currentSegEl = null;
- this.triggerEvent("eventMouseLeave", ev, segEl);
- }
- };
- this.removeHoverListeners = listenToHoverBySelector(
- settings.el,
- ".fc-event",
- // on both fg and bg events
- this.handleSegEnter,
- this.handleSegLeave
- );
- }
- destroy() {
- this.removeHoverListeners();
- }
- triggerEvent(publicEvName, ev, segEl) {
- let { component } = this;
- let { context } = component;
- let seg = getElSeg(segEl);
- if (!ev || component.isValidSegDownEl(ev.target)) {
- context.emitter.trigger(publicEvName, {
- el: segEl,
- event: new EventImpl(context, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: context.viewApi
- });
- }
- }
- };
- var CalendarContent = class extends PureComponent {
- constructor() {
- super(...arguments);
- this.buildViewContext = memoize(buildViewContext);
- this.buildViewPropTransformers = memoize(buildViewPropTransformers);
- this.buildToolbarProps = memoize(buildToolbarProps);
- this.headerRef = d();
- this.footerRef = d();
- this.interactionsStore = {};
- this.state = {
- viewLabelId: getUniqueDomId()
- };
- this.registerInteractiveComponent = (component, settingsInput) => {
- let settings = parseInteractionSettings(component, settingsInput);
- let DEFAULT_INTERACTIONS = [
- EventClicking,
- EventHovering
- ];
- let interactionClasses = DEFAULT_INTERACTIONS.concat(this.props.pluginHooks.componentInteractions);
- let interactions = interactionClasses.map((TheInteractionClass) => new TheInteractionClass(settings));
- this.interactionsStore[component.uid] = interactions;
- interactionSettingsStore[component.uid] = settings;
- };
- this.unregisterInteractiveComponent = (component) => {
- let listeners = this.interactionsStore[component.uid];
- if (listeners) {
- for (let listener of listeners) {
- listener.destroy();
- }
- delete this.interactionsStore[component.uid];
- }
- delete interactionSettingsStore[component.uid];
- };
- this.resizeRunner = new DelayedRunner(() => {
- this.props.emitter.trigger("_resize", true);
- this.props.emitter.trigger("windowResize", { view: this.props.viewApi });
- });
- this.handleWindowResize = (ev) => {
- let { options } = this.props;
- if (options.handleWindowResize && ev.target === window) {
- this.resizeRunner.request(options.windowResizeDelay);
- }
- };
- }
- /*
- renders INSIDE of an outer div
- */
- render() {
- let { props } = this;
- let { toolbarConfig, options } = props;
- let toolbarProps = this.buildToolbarProps(
- props.viewSpec,
- props.dateProfile,
- props.dateProfileGenerator,
- props.currentDate,
- getNow(props.options.now, props.dateEnv),
- // TODO: use NowTimer????
- props.viewTitle
- );
- let viewVGrow = false;
- let viewHeight = "";
- let viewAspectRatio;
- if (props.isHeightAuto || props.forPrint) {
- viewHeight = "";
- } else if (options.height != null) {
- viewVGrow = true;
- } else if (options.contentHeight != null) {
- viewHeight = options.contentHeight;
- } else {
- viewAspectRatio = Math.max(options.aspectRatio, 0.5);
- }
- let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent);
- let viewLabelId = toolbarConfig.header && toolbarConfig.header.hasTitle ? this.state.viewLabelId : void 0;
- return y(
- ViewContextType.Provider,
- { value: viewContext },
- toolbarConfig.header && y(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps)),
- y(
- ViewHarness,
- { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId },
- this.renderView(props),
- this.buildAppendContent()
- ),
- toolbarConfig.footer && y(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))
- );
- }
- componentDidMount() {
- let { props } = this;
- this.calendarInteractions = props.pluginHooks.calendarInteractions.map((CalendarInteractionClass) => new CalendarInteractionClass(props));
- window.addEventListener("resize", this.handleWindowResize);
- let { propSetHandlers } = props.pluginHooks;
- for (let propName in propSetHandlers) {
- propSetHandlers[propName](props[propName], props);
- }
- }
- componentDidUpdate(prevProps) {
- let { props } = this;
- let { propSetHandlers } = props.pluginHooks;
- for (let propName in propSetHandlers) {
- if (props[propName] !== prevProps[propName]) {
- propSetHandlers[propName](props[propName], props);
- }
- }
- }
- componentWillUnmount() {
- window.removeEventListener("resize", this.handleWindowResize);
- this.resizeRunner.clear();
- for (let interaction of this.calendarInteractions) {
- interaction.destroy();
- }
- this.props.emitter.trigger("_unmount");
- }
- buildAppendContent() {
- let { props } = this;
- let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props));
- return y(_, {}, ...children);
- }
- renderView(props) {
- let { pluginHooks } = props;
- let { viewSpec } = props;
- let viewProps = {
- dateProfile: props.dateProfile,
- businessHours: props.businessHours,
- eventStore: props.renderableEventStore,
- eventUiBases: props.eventUiBases,
- dateSelection: props.dateSelection,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize,
- isHeightAuto: props.isHeightAuto,
- forPrint: props.forPrint
- };
- let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
- for (let transformer of transformers) {
- Object.assign(viewProps, transformer.transform(viewProps, props));
- }
- let ViewComponent = viewSpec.component;
- return y(ViewComponent, Object.assign({}, viewProps));
- }
- };
- function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) {
- let todayInfo = dateProfileGenerator.build(now, void 0, false);
- let prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false);
- let nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false);
- return {
- title,
- activeButton: viewSpec.type,
- navUnit: viewSpec.singleUnit,
- isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
- isPrevEnabled: prevInfo.isValid,
- isNextEnabled: nextInfo.isValid
- };
- }
- function buildViewPropTransformers(theClasses) {
- return theClasses.map((TheClass) => new TheClass());
- }
- var Calendar = class extends CalendarImpl {
- constructor(el, optionOverrides = {}) {
- super();
- this.isRendering = false;
- this.isRendered = false;
- this.currentClassNames = [];
- this.customContentRenderId = 0;
- this.handleAction = (action) => {
- switch (action.type) {
- case "SET_EVENT_DRAG":
- case "SET_EVENT_RESIZE":
- this.renderRunner.tryDrain();
- }
- };
- this.handleData = (data) => {
- this.currentData = data;
- this.renderRunner.request(data.calendarOptions.rerenderDelay);
- };
- this.handleRenderRequest = () => {
- if (this.isRendering) {
- this.isRendered = true;
- let { currentData } = this;
- flushSync(() => {
- D(y(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => {
- this.setClassNames(classNames);
- this.setHeight(height);
- return y(
- RenderId.Provider,
- { value: this.customContentRenderId },
- y(CalendarContent, Object.assign({ isHeightAuto, forPrint }, currentData))
- );
- }), this.el);
- });
- } else if (this.isRendered) {
- this.isRendered = false;
- D(null, this.el);
- this.setClassNames([]);
- this.setHeight("");
- }
- };
- ensureElHasStyles(el);
- this.el = el;
- this.renderRunner = new DelayedRunner(this.handleRenderRequest);
- new CalendarDataManager({
- optionOverrides,
- calendarApi: this,
- onAction: this.handleAction,
- onData: this.handleData
- });
- }
- render() {
- let wasRendering = this.isRendering;
- if (!wasRendering) {
- this.isRendering = true;
- } else {
- this.customContentRenderId += 1;
- }
- this.renderRunner.request();
- if (wasRendering) {
- this.updateSize();
- }
- }
- destroy() {
- if (this.isRendering) {
- this.isRendering = false;
- this.renderRunner.request();
- }
- }
- updateSize() {
- flushSync(() => {
- super.updateSize();
- });
- }
- batchRendering(func) {
- this.renderRunner.pause("batchRendering");
- func();
- this.renderRunner.resume("batchRendering");
- }
- pauseRendering() {
- this.renderRunner.pause("pauseRendering");
- }
- resumeRendering() {
- this.renderRunner.resume("pauseRendering", true);
- }
- resetOptions(optionOverrides, changedOptionNames) {
- this.currentDataManager.resetOptions(optionOverrides, changedOptionNames);
- }
- setClassNames(classNames) {
- if (!isArraysEqual(classNames, this.currentClassNames)) {
- let { classList } = this.el;
- for (let className of this.currentClassNames) {
- classList.remove(className);
- }
- for (let className of classNames) {
- classList.add(className);
- }
- this.currentClassNames = classNames;
- }
- }
- setHeight(height) {
- applyStyleProp(this.el, "height", height);
- }
- };
- function formatDate(dateInput, options = {}) {
- let dateEnv = buildDateEnv(options);
- let formatter = createFormatter(options);
- let dateMeta = dateEnv.createMarkerMeta(dateInput);
- if (!dateMeta) {
- return "";
- }
- return dateEnv.format(dateMeta.marker, formatter, {
- forcedTzo: dateMeta.forcedTzo
- });
- }
- function formatRange(startInput, endInput, options) {
- let dateEnv = buildDateEnv(typeof options === "object" && options ? options : {});
- let formatter = createFormatter(options);
- let startMeta = dateEnv.createMarkerMeta(startInput);
- let endMeta = dateEnv.createMarkerMeta(endInput);
- if (!startMeta || !endMeta) {
- return "";
- }
- return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
- forcedStartTzo: startMeta.forcedTzo,
- forcedEndTzo: endMeta.forcedTzo,
- isEndExclusive: options.isEndExclusive,
- defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator
- });
- }
- function buildDateEnv(settings) {
- let locale = buildLocale(settings.locale || "en", organizeRawLocales([]).map);
- return new DateEnv(Object.assign(Object.assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: "gregory" }, settings), { locale }));
- }
- function sliceEvents(props, allDay) {
- return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
- }
- var version = "6.1.14";
- export {
- injectStyles,
- removeElement,
- elementClosest,
- elementMatches,
- applyStyle,
- getEventTargetViaRoot,
- getUniqueDomId,
- whenTransitionDone,
- disableCursor,
- enableCursor,
- preventSelection,
- allowSelection,
- preventContextMenu,
- allowContextMenu,
- compareNumbers,
- createDuration,
- addDurations,
- multiplyDuration,
- asRoughMs,
- wholeDivideDurations,
- addWeeks,
- addDays,
- addMs,
- diffWeeks,
- diffDays,
- startOfDay,
- buildIsoString,
- formatDayString,
- formatIsoMonthStr,
- formatIsoTimeString,
- memoize,
- createFormatter,
- BASE_OPTION_DEFAULTS,
- identity,
- mapHash,
- isPropsEqual,
- ViewContextType,
- BaseComponent,
- setRef,
- ContentContainer,
- ViewContainer,
- intersectRanges,
- rangeContainsRange,
- rangeContainsMarker,
- diffDates,
- DateProfileGenerator,
- createEventInstance,
- refineEventDef,
- parseEventDef,
- eventTupleToStore,
- getRelevantEvents,
- createEmptyEventStore,
- Emitter,
- triggerDateSelect,
- getDefaultEventEnd,
- applyMutationToEventStore,
- EventImpl,
- buildEventApis,
- hasBgRendering,
- getElSeg,
- sortEventSegs,
- buildSegTimeText,
- getSegMeta,
- buildEventRangeKey,
- getSegAnchorAttrs,
- isDateSpansEqual,
- JsonRequestError,
- Interaction,
- interactionSettingsToStore,
- interactionSettingsStore,
- pointInsideRect,
- intersectRects,
- constrainPoint,
- getRectCenter,
- diffPoints,
- Splitter,
- buildNavLinkAttrs,
- computeInnerRect,
- computeRect,
- getClippingParents,
- PositionCache,
- ScrollController,
- ElementScrollController,
- WindowScrollController,
- DateComponent,
- SegHierarchy,
- getEntrySpanEnd,
- buildEntryKey,
- groupIntersectingEntries,
- intersectSpans,
- binarySearch,
- ElementDragging,
- config,
- parseDragMeta,
- NowTimer,
- DayHeader,
- DaySeriesModel,
- DayTableModel,
- Slicer,
- isInteractionValid,
- isDateSelectionValid,
- RefMap,
- renderScrollShim,
- getStickyHeaderDates,
- getStickyFooterScrollbar,
- SimpleScrollGrid,
- EventContainer,
- StandardEvent,
- NowIndicatorContainer,
- DayCellContainer,
- hasCustomDayCellContent,
- BgEvent,
- renderFill,
- WeekNumberContainer,
- MoreLinkContainer,
- computeEarliestSegStart,
- CustomRenderingStore,
- globalLocales,
- createPlugin,
- globalPlugins,
- Calendar,
- formatDate,
- formatRange,
- sliceEvents,
- version
- };
- //# sourceMappingURL=chunk-QH2VTIUN.js.map
|