export function flexibleCompare(a, b) { if (!a && !b) { return 0 } if (b == null) { return -1 } if (a == null) { return 1 } if ($.type(a) === 'string' || $.type(b) === 'string') { return String(a).localeCompare(String(b)) } return a - b }
export function initScaleProps(timelineView: TimelineView) { timelineView.labelInterval = queryDurationOption(timelineView, 'slotLabelInterval') timelineView.slotDuration = queryDurationOption(timelineView, 'slotDuration') validateLabelAndSlot(timelineView) // validate after computed grid duration ensureLabelInterval(timelineView) ensureSlotDuration(timelineView) let input = timelineView.opt('slotLabelFormat') const type = $.type(input) timelineView.headerFormats = type === 'array' ? input : type === 'string' ? [ input ] : computeHeaderFormats(timelineView) timelineView.isTimeScale = core.durationHasTime(timelineView.slotDuration) let largeUnit = null if (!timelineView.isTimeScale) { const slotUnit = core.computeGreatestUnit(timelineView.slotDuration) if (/year|month|week/.test(slotUnit)) { largeUnit = slotUnit } } timelineView.largeUnit = largeUnit timelineView.emphasizeWeeks = (timelineView.slotDuration.as('days') === 1) && (timelineView.currentRangeAs('weeks') >= 2) && !timelineView.opt('businessHours') /* console.log('label interval =', timelineView.labelInterval.humanize()) console.log('slot duration =', timelineView.slotDuration.humanize()) console.log('header formats =', timelineView.headerFormats) console.log('isTimeScale', timelineView.isTimeScale) console.log('largeUnit', timelineView.largeUnit) */ let rawSnapDuration = timelineView.opt('snapDuration') timelineView.snapDuration = rawSnapDuration ? moment.duration(rawSnapDuration) : timelineView.slotDuration timelineView.snapsPerSlot = core.divideDurationByDuration(timelineView.slotDuration, timelineView.snapDuration) }