1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267 |
- import {
- DayTable
- } from "./chunk-INZMDDGR.js";
- import "./chunk-DAAU2ANU.js";
- import {
- BaseComponent,
- BgEvent,
- ContentContainer,
- DateComponent,
- DayCellContainer,
- DayHeader,
- DaySeriesModel,
- DayTableModel,
- MoreLinkContainer,
- NowIndicatorContainer,
- NowTimer,
- PositionCache,
- RefMap,
- SegHierarchy,
- SimpleScrollGrid,
- Slicer,
- Splitter,
- StandardEvent,
- ViewContainer,
- ViewContextType,
- WeekNumberContainer,
- addDurations,
- asRoughMs,
- binarySearch,
- buildEntryKey,
- buildEventRangeKey,
- buildIsoString,
- buildNavLinkAttrs,
- computeEarliestSegStart,
- createDuration,
- createFormatter,
- createPlugin,
- diffDays,
- formatIsoTimeString,
- getEntrySpanEnd,
- getSegMeta,
- getStickyFooterScrollbar,
- getStickyHeaderDates,
- groupIntersectingEntries,
- hasBgRendering,
- hasCustomDayCellContent,
- injectStyles,
- intersectRanges,
- memoize,
- multiplyDuration,
- rangeContainsMarker,
- renderFill,
- renderScrollShim,
- sortEventSegs,
- startOfDay,
- wholeDivideDurations
- } from "./chunk-QH2VTIUN.js";
- import {
- _,
- d,
- y
- } from "./chunk-PTVH4XAB.js";
- import "./chunk-2LSFTFF7.js";
- // node_modules/.pnpm/@fullcalendar+timegrid@6.1.14_@fullcalendar+core@6.1.14/node_modules/@fullcalendar/timegrid/internal.js
- var AllDaySplitter = class extends Splitter {
- getKeyInfo() {
- return {
- allDay: {},
- timed: {}
- };
- }
- getKeysForDateSpan(dateSpan) {
- if (dateSpan.allDay) {
- return ["allDay"];
- }
- return ["timed"];
- }
- getKeysForEventDef(eventDef) {
- if (!eventDef.allDay) {
- return ["timed"];
- }
- if (hasBgRendering(eventDef)) {
- return ["timed", "allDay"];
- }
- return ["allDay"];
- }
- };
- var DEFAULT_SLAT_LABEL_FORMAT = createFormatter({
- hour: "numeric",
- minute: "2-digit",
- omitZeroMinute: true,
- meridiem: "short"
- });
- function TimeColsAxisCell(props) {
- let classNames = [
- "fc-timegrid-slot",
- "fc-timegrid-slot-label",
- props.isLabeled ? "fc-scrollgrid-shrink" : "fc-timegrid-slot-minor"
- ];
- return y(ViewContextType.Consumer, null, (context) => {
- if (!props.isLabeled) {
- return y("td", { className: classNames.join(" "), "data-time": props.isoTimeStr });
- }
- let { dateEnv, options, viewApi } = context;
- let labelFormat = (
- // TODO: fully pre-parse
- options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : Array.isArray(options.slotLabelFormat) ? createFormatter(options.slotLabelFormat[0]) : createFormatter(options.slotLabelFormat)
- );
- let renderProps = {
- level: 0,
- time: props.time,
- date: dateEnv.toDate(props.date),
- view: viewApi,
- text: dateEnv.format(props.date, labelFormat)
- };
- return y(ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: {
- "data-time": props.isoTimeStr
- }, renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => y(
- "div",
- { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" },
- y(InnerContent, { elTag: "div", elClasses: [
- "fc-timegrid-slot-label-cushion",
- "fc-scrollgrid-shrink-cushion"
- ] })
- ));
- });
- }
- function renderInnerContent(props) {
- return props.text;
- }
- var TimeBodyAxis = class extends BaseComponent {
- render() {
- return this.props.slatMetas.map((slatMeta) => y(
- "tr",
- { key: slatMeta.key },
- y(TimeColsAxisCell, Object.assign({}, slatMeta))
- ));
- }
- };
- var DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week: "short" });
- var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5;
- var TimeColsView = class extends DateComponent {
- constructor() {
- super(...arguments);
- this.allDaySplitter = new AllDaySplitter();
- this.headerElRef = d();
- this.rootElRef = d();
- this.scrollerElRef = d();
- this.state = {
- slatCoords: null
- };
- this.handleScrollTopRequest = (scrollTop) => {
- let scrollerEl = this.scrollerElRef.current;
- if (scrollerEl) {
- scrollerEl.scrollTop = scrollTop;
- }
- };
- this.renderHeadAxis = (rowKey, frameHeight = "") => {
- let { options } = this.context;
- let { dateProfile } = this.props;
- let range = dateProfile.renderRange;
- let dayCnt = diffDays(range.start, range.end);
- let navLinkAttrs = dayCnt === 1 ? buildNavLinkAttrs(this.context, range.start, "week") : {};
- if (options.weekNumbers && rowKey === "day") {
- return y(WeekNumberContainer, { elTag: "th", elClasses: [
- "fc-timegrid-axis",
- "fc-scrollgrid-shrink"
- ], elAttrs: {
- "aria-hidden": true
- }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, (InnerContent) => y(
- "div",
- { className: [
- "fc-timegrid-axis-frame",
- "fc-scrollgrid-shrink-frame",
- "fc-timegrid-axis-frame-liquid"
- ].join(" "), style: { height: frameHeight } },
- y(InnerContent, { elTag: "a", elClasses: [
- "fc-timegrid-axis-cushion",
- "fc-scrollgrid-shrink-cushion",
- "fc-scrollgrid-sync-inner"
- ], elAttrs: navLinkAttrs })
- ));
- }
- return y(
- "th",
- { "aria-hidden": true, className: "fc-timegrid-axis" },
- y("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } })
- );
- };
- this.renderTableRowAxis = (rowHeight) => {
- let { options, viewApi } = this.context;
- let renderProps = {
- text: options.allDayText,
- view: viewApi
- };
- return (
- // TODO: make reusable hook. used in list view too
- y(ContentContainer, { elTag: "td", elClasses: [
- "fc-timegrid-axis",
- "fc-scrollgrid-shrink"
- ], elAttrs: {
- "aria-hidden": true
- }, renderProps, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => y(
- "div",
- { className: [
- "fc-timegrid-axis-frame",
- "fc-scrollgrid-shrink-frame",
- rowHeight == null ? " fc-timegrid-axis-frame-liquid" : ""
- ].join(" "), style: { height: rowHeight } },
- y(InnerContent, { elTag: "span", elClasses: [
- "fc-timegrid-axis-cushion",
- "fc-scrollgrid-shrink-cushion",
- "fc-scrollgrid-sync-inner"
- ] })
- ))
- );
- };
- this.handleSlatCoords = (slatCoords) => {
- this.setState({ slatCoords });
- };
- }
- // rendering
- // ----------------------------------------------------------------------------------------------------
- renderSimpleLayout(headerRowContent, allDayContent, timeContent) {
- let { context, props } = this;
- let sections = [];
- let stickyHeaderDates = getStickyHeaderDates(context.options);
- if (headerRowContent) {
- sections.push({
- type: "header",
- key: "header",
- isSticky: stickyHeaderDates,
- chunk: {
- elRef: this.headerElRef,
- tableClassName: "fc-col-header",
- rowContent: headerRowContent
- }
- });
- }
- if (allDayContent) {
- sections.push({
- type: "body",
- key: "all-day",
- chunk: { content: allDayContent }
- });
- sections.push({
- type: "body",
- key: "all-day-divider",
- outerContent: (
- // TODO: rename to cellContent so don't need to define <tr>?
- y(
- "tr",
- { role: "presentation", className: "fc-scrollgrid-section" },
- y("td", { className: "fc-timegrid-divider " + context.theme.getClass("tableCellShaded") })
- )
- )
- });
- }
- sections.push({
- type: "body",
- key: "body",
- liquid: true,
- expandRows: Boolean(context.options.expandRows),
- chunk: {
- scrollerElRef: this.scrollerElRef,
- content: timeContent
- }
- });
- return y(
- ViewContainer,
- { elRef: this.rootElRef, elClasses: ["fc-timegrid"], viewSpec: context.viewSpec },
- y(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: "shrink" }], sections })
- );
- }
- renderHScrollLayout(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) {
- let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
- if (!ScrollGrid) {
- throw new Error("No ScrollGrid implementation");
- }
- let { context, props } = this;
- let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
- let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
- let sections = [];
- if (headerRowContent) {
- sections.push({
- type: "header",
- key: "header",
- isSticky: stickyHeaderDates,
- syncRowHeights: true,
- chunks: [
- {
- key: "axis",
- rowContent: (arg) => y("tr", { role: "presentation" }, this.renderHeadAxis("day", arg.rowSyncHeights[0]))
- },
- {
- key: "cols",
- elRef: this.headerElRef,
- tableClassName: "fc-col-header",
- rowContent: headerRowContent
- }
- ]
- });
- }
- if (allDayContent) {
- sections.push({
- type: "body",
- key: "all-day",
- syncRowHeights: true,
- chunks: [
- {
- key: "axis",
- rowContent: (contentArg) => y("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0]))
- },
- {
- key: "cols",
- content: allDayContent
- }
- ]
- });
- sections.push({
- key: "all-day-divider",
- type: "body",
- outerContent: (
- // TODO: rename to cellContent so don't need to define <tr>?
- y(
- "tr",
- { role: "presentation", className: "fc-scrollgrid-section" },
- y("td", { colSpan: 2, className: "fc-timegrid-divider " + context.theme.getClass("tableCellShaded") })
- )
- )
- });
- }
- let isNowIndicator = context.options.nowIndicator;
- sections.push({
- type: "body",
- key: "body",
- liquid: true,
- expandRows: Boolean(context.options.expandRows),
- chunks: [
- {
- key: "axis",
- content: (arg) => (
- // TODO: make this now-indicator arrow more DRY with TimeColsContent
- y(
- "div",
- { className: "fc-timegrid-axis-chunk" },
- y(
- "table",
- { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : "" } },
- arg.tableColGroupNode,
- y(
- "tbody",
- null,
- y(TimeBodyAxis, { slatMetas })
- )
- ),
- y(
- "div",
- { className: "fc-timegrid-now-indicator-container" },
- y(NowTimer, {
- unit: isNowIndicator ? "minute" : "day"
- /* hacky */
- }, (nowDate) => {
- let nowIndicatorTop = isNowIndicator && slatCoords && slatCoords.safeComputeTop(nowDate);
- if (typeof nowIndicatorTop === "number") {
- return y(NowIndicatorContainer, { elClasses: ["fc-timegrid-now-indicator-arrow"], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate });
- }
- return null;
- })
- )
- )
- )
- },
- {
- key: "cols",
- scrollerElRef: this.scrollerElRef,
- content: timeContent
- }
- ]
- });
- if (stickyFooterScrollbar) {
- sections.push({
- key: "footer",
- type: "footer",
- isSticky: true,
- chunks: [
- {
- key: "axis",
- content: renderScrollShim
- },
- {
- key: "cols",
- content: renderScrollShim
- }
- ]
- });
- }
- return y(
- ViewContainer,
- { elRef: this.rootElRef, elClasses: ["fc-timegrid"], viewSpec: context.viewSpec },
- y(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, forPrint: props.forPrint, collapsibleWidth: false, colGroups: [
- { width: "shrink", cols: [{ width: "shrink" }] },
- { cols: [{ span: colCnt, minWidth: dayMinWidth }] }
- ], sections })
- );
- }
- /* Dimensions
- ------------------------------------------------------------------------------------------------------------------*/
- getAllDayMaxEventProps() {
- let { dayMaxEvents, dayMaxEventRows } = this.context.options;
- if (dayMaxEvents === true || dayMaxEventRows === true) {
- dayMaxEvents = void 0;
- dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS;
- }
- return { dayMaxEvents, dayMaxEventRows };
- }
- };
- function renderAllDayInner(renderProps) {
- return renderProps.text;
- }
- var TimeColsSlatsCoords = class {
- constructor(positions, dateProfile, slotDuration) {
- this.positions = positions;
- this.dateProfile = dateProfile;
- this.slotDuration = slotDuration;
- }
- safeComputeTop(date) {
- let { dateProfile } = this;
- if (rangeContainsMarker(dateProfile.currentRange, date)) {
- let startOfDayDate = startOfDay(date);
- let timeMs = date.valueOf() - startOfDayDate.valueOf();
- if (timeMs >= asRoughMs(dateProfile.slotMinTime) && timeMs < asRoughMs(dateProfile.slotMaxTime)) {
- return this.computeTimeTop(createDuration(timeMs));
- }
- }
- return null;
- }
- // Computes the top coordinate, relative to the bounds of the grid, of the given date.
- // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
- computeDateTop(when, startOfDayDate) {
- if (!startOfDayDate) {
- startOfDayDate = startOfDay(when);
- }
- return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf()));
- }
- // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
- // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform.
- // Eventually allow computation with arbirary slat dates.
- computeTimeTop(duration) {
- let { positions, dateProfile } = this;
- let len = positions.els.length;
- let slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.slotMinTime)) / asRoughMs(this.slotDuration);
- let slatIndex;
- let slatRemainder;
- slatCoverage = Math.max(0, slatCoverage);
- slatCoverage = Math.min(len, slatCoverage);
- slatIndex = Math.floor(slatCoverage);
- slatIndex = Math.min(slatIndex, len - 1);
- slatRemainder = slatCoverage - slatIndex;
- return positions.tops[slatIndex] + positions.getHeight(slatIndex) * slatRemainder;
- }
- };
- var TimeColsSlatsBody = class extends BaseComponent {
- render() {
- let { props, context } = this;
- let { options } = context;
- let { slatElRefs } = props;
- return y("tbody", null, props.slatMetas.map((slatMeta, i) => {
- let renderProps = {
- time: slatMeta.time,
- date: context.dateEnv.toDate(slatMeta.date),
- view: context.viewApi
- };
- return y(
- "tr",
- { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) },
- props.axis && y(TimeColsAxisCell, Object.assign({}, slatMeta)),
- y(ContentContainer, { elTag: "td", elClasses: [
- "fc-timegrid-slot",
- "fc-timegrid-slot-lane",
- !slatMeta.isLabeled && "fc-timegrid-slot-minor"
- ], elAttrs: {
- "data-time": slatMeta.isoTimeStr
- }, renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount })
- );
- }));
- }
- };
- var TimeColsSlats = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.rootElRef = d();
- this.slatElRefs = new RefMap();
- }
- render() {
- let { props, context } = this;
- return y(
- "div",
- { ref: this.rootElRef, className: "fc-timegrid-slots" },
- y(
- "table",
- { "aria-hidden": true, className: context.theme.getClass("table"), style: {
- minWidth: props.tableMinWidth,
- width: props.clientWidth,
- height: props.minHeight
- } },
- props.tableColGroupNode,
- y(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas })
- )
- );
- }
- componentDidMount() {
- this.updateSizing();
- }
- componentDidUpdate() {
- this.updateSizing();
- }
- componentWillUnmount() {
- if (this.props.onCoords) {
- this.props.onCoords(null);
- }
- }
- updateSizing() {
- let { context, props } = this;
- if (props.onCoords && props.clientWidth !== null) {
- let rootEl = this.rootElRef.current;
- if (rootEl.offsetHeight) {
- props.onCoords(new TimeColsSlatsCoords(new PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration));
- }
- }
- }
- };
- function collectSlatEls(elMap, slatMetas) {
- return slatMetas.map((slatMeta) => elMap[slatMeta.key]);
- }
- function splitSegsByCol(segs, colCnt) {
- let segsByCol = [];
- let i;
- for (i = 0; i < colCnt; i += 1) {
- segsByCol.push([]);
- }
- if (segs) {
- for (i = 0; i < segs.length; i += 1) {
- segsByCol[segs[i].col].push(segs[i]);
- }
- }
- return segsByCol;
- }
- function splitInteractionByCol(ui, colCnt) {
- let byRow = [];
- if (!ui) {
- for (let i = 0; i < colCnt; i += 1) {
- byRow[i] = null;
- }
- } else {
- for (let i = 0; i < colCnt; i += 1) {
- byRow[i] = {
- affectedInstances: ui.affectedInstances,
- isEvent: ui.isEvent,
- segs: []
- };
- }
- for (let seg of ui.segs) {
- byRow[seg.col].segs.push(seg);
- }
- }
- return byRow;
- }
- var TimeColMoreLink = class extends BaseComponent {
- render() {
- let { props } = this;
- return y(MoreLinkContainer, { elClasses: ["fc-timegrid-more-link"], elStyle: {
- top: props.top,
- bottom: props.bottom
- }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner, forceTimed: true }, (InnerContent) => y(InnerContent, { elTag: "div", elClasses: ["fc-timegrid-more-link-inner", "fc-sticky"] }));
- }
- };
- function renderMoreLinkInner(props) {
- return props.shortText;
- }
- function buildPositioning(segInputs, strictOrder, maxStackCnt) {
- let hierarchy = new SegHierarchy();
- if (strictOrder != null) {
- hierarchy.strictOrder = strictOrder;
- }
- if (maxStackCnt != null) {
- hierarchy.maxStackCnt = maxStackCnt;
- }
- let hiddenEntries = hierarchy.addSegs(segInputs);
- let hiddenGroups = groupIntersectingEntries(hiddenEntries);
- let web = buildWeb(hierarchy);
- web = stretchWeb(web, 1);
- let segRects = webToRects(web);
- return { segRects, hiddenGroups };
- }
- function buildWeb(hierarchy) {
- const { entriesByLevel } = hierarchy;
- const buildNode = cacheable((level, lateral) => level + ":" + lateral, (level, lateral) => {
- let siblingRange = findNextLevelSegs(hierarchy, level, lateral);
- let nextLevelRes = buildNodes(siblingRange, buildNode);
- let entry = entriesByLevel[level][lateral];
- return [
- Object.assign(Object.assign({}, entry), { nextLevelNodes: nextLevelRes[0] }),
- entry.thickness + nextLevelRes[1]
- // the pressure builds
- ];
- });
- return buildNodes(entriesByLevel.length ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } : null, buildNode)[0];
- }
- function buildNodes(siblingRange, buildNode) {
- if (!siblingRange) {
- return [[], 0];
- }
- let { level, lateralStart, lateralEnd } = siblingRange;
- let lateral = lateralStart;
- let pairs = [];
- while (lateral < lateralEnd) {
- pairs.push(buildNode(level, lateral));
- lateral += 1;
- }
- pairs.sort(cmpDescPressures);
- return [
- pairs.map(extractNode),
- pairs[0][1]
- // first item's pressure
- ];
- }
- function cmpDescPressures(a, b) {
- return b[1] - a[1];
- }
- function extractNode(a) {
- return a[0];
- }
- function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) {
- let { levelCoords, entriesByLevel } = hierarchy;
- let subjectEntry = entriesByLevel[subjectLevel][subjectLateral];
- let afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness;
- let levelCnt = levelCoords.length;
- let level = subjectLevel;
- for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1)
- ;
- for (; level < levelCnt; level += 1) {
- let entries = entriesByLevel[level];
- let entry;
- let searchIndex = binarySearch(entries, subjectEntry.span.start, getEntrySpanEnd);
- let lateralStart = searchIndex[0] + searchIndex[1];
- let lateralEnd = lateralStart;
- while (
- // loop through entries that horizontally intersect
- (entry = entries[lateralEnd]) && // but not past the whole seg list
- entry.span.start < subjectEntry.span.end
- ) {
- lateralEnd += 1;
- }
- if (lateralStart < lateralEnd) {
- return { level, lateralStart, lateralEnd };
- }
- }
- return null;
- }
- function stretchWeb(topLevelNodes, totalThickness) {
- const stretchNode = cacheable((node, startCoord, prevThickness) => buildEntryKey(node), (node, startCoord, prevThickness) => {
- let { nextLevelNodes, thickness } = node;
- let allThickness = thickness + prevThickness;
- let thicknessFraction = thickness / allThickness;
- let endCoord;
- let newChildren = [];
- if (!nextLevelNodes.length) {
- endCoord = totalThickness;
- } else {
- for (let childNode of nextLevelNodes) {
- if (endCoord === void 0) {
- let res = stretchNode(childNode, startCoord, allThickness);
- endCoord = res[0];
- newChildren.push(res[1]);
- } else {
- let res = stretchNode(childNode, endCoord, 0);
- newChildren.push(res[1]);
- }
- }
- }
- let newThickness = (endCoord - startCoord) * thicknessFraction;
- return [endCoord - newThickness, Object.assign(Object.assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })];
- });
- return topLevelNodes.map((node) => stretchNode(node, 0, 0)[1]);
- }
- function webToRects(topLevelNodes) {
- let rects = [];
- const processNode = cacheable((node, levelCoord, stackDepth) => buildEntryKey(node), (node, levelCoord, stackDepth) => {
- let rect = Object.assign(Object.assign({}, node), {
- levelCoord,
- stackDepth,
- stackForward: 0
- });
- rects.push(rect);
- return rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1;
- });
- function processNodes(nodes, levelCoord, stackDepth) {
- let stackForward = 0;
- for (let node of nodes) {
- stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward);
- }
- return stackForward;
- }
- processNodes(topLevelNodes, 0, 0);
- return rects;
- }
- function cacheable(keyFunc, workFunc) {
- const cache = {};
- return (...args) => {
- let key = keyFunc(...args);
- return key in cache ? cache[key] : cache[key] = workFunc(...args);
- };
- }
- function computeSegVCoords(segs, colDate, slatCoords = null, eventMinHeight = 0) {
- let vcoords = [];
- if (slatCoords) {
- for (let i = 0; i < segs.length; i += 1) {
- let seg = segs[i];
- let spanStart = slatCoords.computeDateTop(seg.start, colDate);
- let spanEnd = Math.max(
- spanStart + (eventMinHeight || 0),
- // :(
- slatCoords.computeDateTop(seg.end, colDate)
- );
- vcoords.push({
- start: Math.round(spanStart),
- end: Math.round(spanEnd)
- //
- });
- }
- }
- return vcoords;
- }
- function computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack) {
- let segInputs = [];
- let dumbSegs = [];
- for (let i = 0; i < segs.length; i += 1) {
- let vcoords = segVCoords[i];
- if (vcoords) {
- segInputs.push({
- index: i,
- thickness: 1,
- span: vcoords
- });
- } else {
- dumbSegs.push(segs[i]);
- }
- }
- let { segRects, hiddenGroups } = buildPositioning(segInputs, eventOrderStrict, eventMaxStack);
- let segPlacements = [];
- for (let segRect of segRects) {
- segPlacements.push({
- seg: segs[segRect.index],
- rect: segRect
- });
- }
- for (let dumbSeg of dumbSegs) {
- segPlacements.push({ seg: dumbSeg, rect: null });
- }
- return { segPlacements, hiddenGroups };
- }
- var DEFAULT_TIME_FORMAT = createFormatter({
- hour: "numeric",
- minute: "2-digit",
- meridiem: false
- });
- var TimeColEvent = class extends BaseComponent {
- render() {
- return y(StandardEvent, Object.assign({}, this.props, { elClasses: [
- "fc-timegrid-event",
- "fc-v-event",
- this.props.isShort && "fc-timegrid-event-short"
- ], defaultTimeFormat: DEFAULT_TIME_FORMAT }));
- }
- };
- var TimeCol = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.sortEventSegs = memoize(sortEventSegs);
- }
- // TODO: memoize event-placement?
- render() {
- let { props, context } = this;
- let { options } = context;
- let isSelectMirror = options.selectMirror;
- let mirrorSegs = (
- // yuck
- props.eventDrag && props.eventDrag.segs || props.eventResize && props.eventResize.segs || isSelectMirror && props.dateSelectionSegs || []
- );
- let interactionAffectedInstances = (
- // TODO: messy way to compute this
- props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}
- );
- let sortedFgSegs = this.sortEventSegs(props.fgEventSegs, options.eventOrder);
- return y(DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [
- "fc-timegrid-col",
- ...props.extraClassNames || []
- ], elAttrs: Object.assign({ role: "gridcell" }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => y(
- "div",
- { className: "fc-timegrid-col-frame" },
- y(
- "div",
- { className: "fc-timegrid-col-bg" },
- this.renderFillSegs(props.businessHourSegs, "non-business"),
- this.renderFillSegs(props.bgEventSegs, "bg-event"),
- this.renderFillSegs(props.dateSelectionSegs, "highlight")
- ),
- y("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)),
- y("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror), "mirror")),
- y("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)),
- hasCustomDayCellContent(options) && y(InnerContent, { elTag: "div", elClasses: ["fc-timegrid-col-misc"] })
- ));
- }
- renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey) {
- let { props } = this;
- if (props.forPrint) {
- return renderPlainFgSegs(sortedFgSegs, props);
- }
- return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey);
- }
- renderPositionedFgSegs(segs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey) {
- let { eventMaxStack, eventShortHeight, eventOrderStrict, eventMinHeight } = this.context.options;
- let { date, slatCoords, eventSelection, todayRange, nowDate } = this.props;
- let isMirror = isDragging || isResizing || isDateSelecting;
- let segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight);
- let { segPlacements, hiddenGroups } = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack);
- return y(
- _,
- null,
- this.renderHiddenGroups(hiddenGroups, segs),
- segPlacements.map((segPlacement) => {
- let { seg, rect } = segPlacement;
- let instanceId = seg.eventRange.instance.instanceId;
- let isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect);
- let vStyle = computeSegVStyle(rect && rect.span);
- let hStyle = !isMirror && rect ? this.computeSegHStyle(rect) : { left: 0, right: 0 };
- let isInset = Boolean(rect) && rect.stackForward > 0;
- let isShort = Boolean(rect) && rect.span.end - rect.span.start < eventShortHeight;
- return y(
- "div",
- { className: "fc-timegrid-event-harness" + (isInset ? " fc-timegrid-event-harness-inset" : ""), key: forcedKey || instanceId, style: Object.assign(Object.assign({ visibility: isVisible ? "" : "hidden" }, vStyle), hStyle) },
- y(TimeColEvent, Object.assign({ seg, isDragging, isResizing, isDateSelecting, isSelected: instanceId === eventSelection, isShort }, getSegMeta(seg, todayRange, nowDate)))
- );
- })
- );
- }
- // will already have eventMinHeight applied because segInputs already had it
- renderHiddenGroups(hiddenGroups, segs) {
- let { extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize } = this.props;
- return y(_, null, hiddenGroups.map((hiddenGroup) => {
- let positionCss = computeSegVStyle(hiddenGroup.span);
- let hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs);
- return y(TimeColMoreLink, { key: buildIsoString(computeEarliestSegStart(hiddenSegs)), hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize });
- }));
- }
- renderFillSegs(segs, fillType) {
- let { props, context } = this;
- let segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight);
- let children = segVCoords.map((vcoords, i) => {
- let seg = segs[i];
- return y("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === "bg-event" ? y(BgEvent, Object.assign({ seg }, getSegMeta(seg, props.todayRange, props.nowDate))) : renderFill(fillType));
- });
- return y(_, null, children);
- }
- renderNowIndicator(segs) {
- let { slatCoords, date } = this.props;
- if (!slatCoords) {
- return null;
- }
- return segs.map((seg, i) => y(
- NowIndicatorContainer,
- {
- // key doesn't matter. will only ever be one
- key: i,
- elClasses: ["fc-timegrid-now-indicator-line"],
- elStyle: {
- top: slatCoords.computeDateTop(seg.start, date)
- },
- isAxis: false,
- date
- }
- ));
- }
- computeSegHStyle(segHCoords) {
- let { isRtl, options } = this.context;
- let shouldOverlap = options.slotEventOverlap;
- let nearCoord = segHCoords.levelCoord;
- let farCoord = segHCoords.levelCoord + segHCoords.thickness;
- let left;
- let right;
- if (shouldOverlap) {
- farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2);
- }
- if (isRtl) {
- left = 1 - farCoord;
- right = nearCoord;
- } else {
- left = nearCoord;
- right = 1 - farCoord;
- }
- let props = {
- zIndex: segHCoords.stackDepth + 1,
- left: left * 100 + "%",
- right: right * 100 + "%"
- };
- if (shouldOverlap && !segHCoords.stackForward) {
- props[isRtl ? "marginLeft" : "marginRight"] = 10 * 2;
- }
- return props;
- }
- };
- function renderPlainFgSegs(sortedFgSegs, { todayRange, nowDate, eventSelection, eventDrag, eventResize }) {
- let hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || (eventResize ? eventResize.affectedInstances : null) || {};
- return y(_, null, sortedFgSegs.map((seg) => {
- let instanceId = seg.eventRange.instance.instanceId;
- return y(
- "div",
- { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? "hidden" : "" } },
- y(TimeColEvent, Object.assign({ seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, getSegMeta(seg, todayRange, nowDate)))
- );
- }));
- }
- function computeSegVStyle(segVCoords) {
- if (!segVCoords) {
- return { top: "", bottom: "" };
- }
- return {
- top: segVCoords.start,
- bottom: -segVCoords.end
- };
- }
- function compileSegsFromEntries(segEntries, allSegs) {
- return segEntries.map((segEntry) => allSegs[segEntry.index]);
- }
- var TimeColsContent = class extends BaseComponent {
- constructor() {
- super(...arguments);
- this.splitFgEventSegs = memoize(splitSegsByCol);
- this.splitBgEventSegs = memoize(splitSegsByCol);
- this.splitBusinessHourSegs = memoize(splitSegsByCol);
- this.splitNowIndicatorSegs = memoize(splitSegsByCol);
- this.splitDateSelectionSegs = memoize(splitSegsByCol);
- this.splitEventDrag = memoize(splitInteractionByCol);
- this.splitEventResize = memoize(splitInteractionByCol);
- this.rootElRef = d();
- this.cellElRefs = new RefMap();
- }
- render() {
- let { props, context } = this;
- let nowIndicatorTop = context.options.nowIndicator && props.slatCoords && props.slatCoords.safeComputeTop(props.nowDate);
- let colCnt = props.cells.length;
- let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt);
- let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt);
- let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt);
- let nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt);
- let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt);
- let eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt);
- let eventResizeByRow = this.splitEventResize(props.eventResize, colCnt);
- return y(
- "div",
- { className: "fc-timegrid-cols", ref: this.rootElRef },
- y(
- "table",
- { role: "presentation", style: {
- minWidth: props.tableMinWidth,
- width: props.clientWidth
- } },
- props.tableColGroupNode,
- y(
- "tbody",
- { role: "presentation" },
- y(
- "tr",
- { role: "row" },
- props.axis && y(
- "td",
- { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" },
- y(
- "div",
- { className: "fc-timegrid-col-frame" },
- y("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === "number" && y(NowIndicatorContainer, { elClasses: ["fc-timegrid-now-indicator-arrow"], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate }))
- )
- ),
- props.cells.map((cell, i) => y(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint }))
- )
- )
- )
- );
- }
- componentDidMount() {
- this.updateCoords();
- }
- componentDidUpdate() {
- this.updateCoords();
- }
- updateCoords() {
- let { props } = this;
- if (props.onColCoords && props.clientWidth !== null) {
- props.onColCoords(new PositionCache(
- this.rootElRef.current,
- collectCellEls(this.cellElRefs.currentMap, props.cells),
- true,
- // horizontal
- false
- ));
- }
- }
- };
- function collectCellEls(elMap, cells) {
- return cells.map((cell) => elMap[cell.key]);
- }
- var TimeCols = class extends DateComponent {
- constructor() {
- super(...arguments);
- this.processSlotOptions = memoize(processSlotOptions);
- this.state = {
- slatCoords: null
- };
- this.handleRootEl = (el) => {
- if (el) {
- this.context.registerInteractiveComponent(this, {
- el,
- isHitComboAllowed: this.props.isHitComboAllowed
- });
- } else {
- this.context.unregisterInteractiveComponent(this);
- }
- };
- this.handleScrollRequest = (request) => {
- let { onScrollTopRequest } = this.props;
- let { slatCoords } = this.state;
- if (onScrollTopRequest && slatCoords) {
- if (request.time) {
- let top = slatCoords.computeTimeTop(request.time);
- top = Math.ceil(top);
- if (top) {
- top += 1;
- }
- onScrollTopRequest(top);
- }
- return true;
- }
- return false;
- };
- this.handleColCoords = (colCoords) => {
- this.colCoords = colCoords;
- };
- this.handleSlatCoords = (slatCoords) => {
- this.setState({ slatCoords });
- if (this.props.onSlatCoords) {
- this.props.onSlatCoords(slatCoords);
- }
- };
- }
- render() {
- let { props, state } = this;
- return y(
- "div",
- { className: "fc-timegrid-body", ref: this.handleRootEl, style: {
- // these props are important to give this wrapper correct dimensions for interactions
- // TODO: if we set it here, can we avoid giving to inner tables?
- width: props.clientWidth,
- minWidth: props.tableMinWidth
- } },
- y(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : "", tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null, onCoords: this.handleSlatCoords }),
- y(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint })
- );
- }
- componentDidMount() {
- this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest);
- }
- componentDidUpdate(prevProps) {
- this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile);
- }
- componentWillUnmount() {
- this.scrollResponder.detach();
- }
- queryHit(positionLeft, positionTop) {
- let { dateEnv, options } = this.context;
- let { colCoords } = this;
- let { dateProfile } = this.props;
- let { slatCoords } = this.state;
- let { snapDuration, snapsPerSlot } = this.processSlotOptions(this.props.slotDuration, options.snapDuration);
- let colIndex = colCoords.leftToIndex(positionLeft);
- let slatIndex = slatCoords.positions.topToIndex(positionTop);
- if (colIndex != null && slatIndex != null) {
- let cell = this.props.cells[colIndex];
- let slatTop = slatCoords.positions.tops[slatIndex];
- let slatHeight = slatCoords.positions.getHeight(slatIndex);
- let partial = (positionTop - slatTop) / slatHeight;
- let localSnapIndex = Math.floor(partial * snapsPerSlot);
- let snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
- let dayDate = this.props.cells[colIndex].date;
- let time = addDurations(dateProfile.slotMinTime, multiplyDuration(snapDuration, snapIndex));
- let start = dateEnv.add(dayDate, time);
- let end = dateEnv.add(start, snapDuration);
- return {
- dateProfile,
- dateSpan: Object.assign({ range: { start, end }, allDay: false }, cell.extraDateSpan),
- dayEl: colCoords.els[colIndex],
- rect: {
- left: colCoords.lefts[colIndex],
- right: colCoords.rights[colIndex],
- top: slatTop,
- bottom: slatTop + slatHeight
- },
- layer: 0
- };
- }
- return null;
- }
- };
- function processSlotOptions(slotDuration, snapDurationOverride) {
- let snapDuration = snapDurationOverride || slotDuration;
- let snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration);
- if (snapsPerSlot === null) {
- snapDuration = slotDuration;
- snapsPerSlot = 1;
- }
- return { snapDuration, snapsPerSlot };
- }
- var DayTimeColsSlicer = class extends Slicer {
- sliceRange(range, dayRanges) {
- let segs = [];
- for (let col = 0; col < dayRanges.length; col += 1) {
- let segRange = intersectRanges(range, dayRanges[col]);
- if (segRange) {
- segs.push({
- start: segRange.start,
- end: segRange.end,
- isStart: segRange.start.valueOf() === range.start.valueOf(),
- isEnd: segRange.end.valueOf() === range.end.valueOf(),
- col
- });
- }
- }
- return segs;
- }
- };
- var DayTimeCols = class extends DateComponent {
- constructor() {
- super(...arguments);
- this.buildDayRanges = memoize(buildDayRanges);
- this.slicer = new DayTimeColsSlicer();
- this.timeColsRef = d();
- }
- render() {
- let { props, context } = this;
- let { dateProfile, dayTableModel } = props;
- let { nowIndicator, nextDayThreshold } = context.options;
- let dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv);
- return y(NowTimer, { unit: nowIndicator ? "minute" : "day" }, (nowDate, todayRange) => y(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate, nowIndicatorSegs: nowIndicator && this.slicer.sliceNowDate(nowDate, dateProfile, nextDayThreshold, context, dayRanges), todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords })));
- }
- };
- function buildDayRanges(dayTableModel, dateProfile, dateEnv) {
- let ranges = [];
- for (let date of dayTableModel.headerDates) {
- ranges.push({
- start: dateEnv.add(date, dateProfile.slotMinTime),
- end: dateEnv.add(date, dateProfile.slotMaxTime)
- });
- }
- return ranges;
- }
- var STOCK_SUB_DURATIONS = [
- { hours: 1 },
- { minutes: 30 },
- { minutes: 15 },
- { seconds: 30 },
- { seconds: 15 }
- ];
- function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) {
- let dayStart = /* @__PURE__ */ new Date(0);
- let slatTime = slotMinTime;
- let slatIterator = createDuration(0);
- let labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration);
- let metas = [];
- while (asRoughMs(slatTime) < asRoughMs(slotMaxTime)) {
- let date = dateEnv.add(dayStart, slatTime);
- let isLabeled = wholeDivideDurations(slatIterator, labelInterval) !== null;
- metas.push({
- date,
- time: slatTime,
- key: date.toISOString(),
- isoTimeStr: formatIsoTimeString(date),
- isLabeled
- });
- slatTime = addDurations(slatTime, slotDuration);
- slatIterator = addDurations(slatIterator, slotDuration);
- }
- return metas;
- }
- function computeLabelInterval(slotDuration) {
- let i;
- let labelInterval;
- let slotsPerLabel;
- for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) {
- labelInterval = createDuration(STOCK_SUB_DURATIONS[i]);
- slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration);
- if (slotsPerLabel !== null && slotsPerLabel > 1) {
- return labelInterval;
- }
- }
- return slotDuration;
- }
- var DayTimeColsView = class extends TimeColsView {
- constructor() {
- super(...arguments);
- this.buildTimeColsModel = memoize(buildTimeColsModel);
- this.buildSlatMetas = memoize(buildSlatMetas);
- }
- render() {
- let { options, dateEnv, dateProfileGenerator } = this.context;
- let { props } = this;
- let { dateProfile } = props;
- let dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator);
- let splitProps = this.allDaySplitter.splitProps(props);
- let slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv);
- let { dayMinWidth } = options;
- let hasAttachedAxis = !dayMinWidth;
- let hasDetachedAxis = dayMinWidth;
- let headerContent = options.dayHeaders && y(DayHeader, { dates: dayTableModel.headerDates, dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null });
- let allDayContent = options.allDaySlot !== false && ((contentArg) => y(DayTable, Object.assign({}, splitProps.allDay, { dateProfile, dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, this.getAllDayMaxEventProps())));
- let timeGridContent = (contentArg) => y(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel, dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest }));
- return hasDetachedAxis ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent);
- }
- };
- function buildTimeColsModel(dateProfile, dateProfileGenerator) {
- let daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);
- return new DayTableModel(daySeries, false);
- }
- var css_248z = '.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}';
- injectStyles(css_248z);
- // node_modules/.pnpm/@fullcalendar+timegrid@6.1.14_@fullcalendar+core@6.1.14/node_modules/@fullcalendar/timegrid/index.js
- var OPTION_REFINERS = {
- allDaySlot: Boolean
- };
- var index = createPlugin({
- name: "@fullcalendar/timegrid",
- initialView: "timeGridWeek",
- optionRefiners: OPTION_REFINERS,
- views: {
- timeGrid: {
- component: DayTimeColsView,
- usesMinMaxTime: true,
- allDaySlot: true,
- slotDuration: "00:30:00",
- slotEventOverlap: true
- // a bad name. confused with overlap/constraint system
- },
- timeGridDay: {
- type: "timeGrid",
- duration: { days: 1 }
- },
- timeGridWeek: {
- type: "timeGrid",
- duration: { weeks: 1 }
- }
- }
- });
- export {
- index as default
- };
- //# sourceMappingURL=@fullcalendar_timegrid.js.map
|