@internetarchive/histogram-date-range 1.4.1-alpha1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -229,7 +229,7 @@ export declare class HistogramDateRange extends LitElement {
229
229
  get minLabelTemplate(): TemplateResult;
230
230
  get maxLabelTemplate(): TemplateResult;
231
231
  get tooltipTemplate(): TemplateResult;
232
- private get histogramAccessibility();
232
+ private get histogramAccessibilityTemplate();
233
233
  private get noDataTemplate();
234
234
  private get activityIndicatorTemplate();
235
235
  static styles: import("lit").CSSResult;
@@ -818,22 +818,19 @@ let HistogramDateRange = class HistogramDateRange extends LitElement {
818
818
  <div id="tooltip" style=${styles} popover>${this._tooltipContent}</div>
819
819
  `;
820
820
  }
821
- get histogramAccessibility() {
822
- let rangeText;
821
+ get histogramAccessibilityTemplate() {
822
+ let rangeText = '';
823
823
  if (this.minSelectedDate && this.maxSelectedDate) {
824
- rangeText = `from ${this.minSelectedDate} to ${this.maxSelectedDate}`;
824
+ rangeText = ` from ${this.minSelectedDate} to ${this.maxSelectedDate}`;
825
825
  }
826
826
  else if (this.minSelectedDate) {
827
- rangeText = `from ${this.minSelectedDate}`;
827
+ rangeText = ` from ${this.minSelectedDate}`;
828
828
  }
829
829
  else if (this.maxSelectedDate) {
830
- rangeText = `up to ${this.maxSelectedDate}`;
830
+ rangeText = ` up to ${this.maxSelectedDate}`;
831
831
  }
832
- else {
833
- rangeText = 'for all available dates';
834
- }
835
- const titleText = `Filter results distribution ${rangeText}`;
836
- const descText = `This chart shows the distribution of search results ${rangeText}. The bars represent result counts for each time period within the selected date range.`.trim();
832
+ const titleText = `Filter results for dates${rangeText}`;
833
+ const descText = `This histogram shows the distribution of dates${rangeText}`;
837
834
  return html `<title id="histogram-title">${titleText}</title
838
835
  ><desc id="histogram-desc">${descText}</desc>`;
839
836
  }
@@ -874,7 +871,7 @@ let HistogramDateRange = class HistogramDateRange extends LitElement {
874
871
  aria-labelledby="histogram-title histogram-desc"
875
872
  @pointerleave="${this.drop}"
876
873
  >
877
- ${this.histogramAccessibility} ${this.selectedRangeTemplate}
874
+ ${this.histogramAccessibilityTemplate} ${this.selectedRangeTemplate}
878
875
  <svg id="histogram">${this.histogramTemplate}</svg>
879
876
  ${this.minSliderTemplate} ${this.maxSliderTemplate}
880
877
  </svg>
@@ -1 +1 @@
1
- {"version":3,"file":"histogram-date-range.js","sourceRoot":"","sources":["../../src/histogram-date-range.ts"],"names":[],"mappings":"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","sourcesContent":["import '@internetarchive/ia-activity-indicator';\nimport dayjs from 'dayjs/esm';\nimport customParseFormat from 'dayjs/esm/plugin/customParseFormat';\nimport fixFirstCenturyYears from './plugins/fix-first-century-years';\nimport {\n css,\n html,\n LitElement,\n nothing,\n PropertyValues,\n svg,\n SVGTemplateResult,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\ndayjs.extend(customParseFormat);\ndayjs.extend(fixFirstCenturyYears);\n\ntype SliderId = 'slider-min' | 'slider-max';\n\nexport type BinSnappingInterval = 'none' | 'month' | 'year';\n\nexport type BarScalingPreset = 'linear' | 'logarithmic';\nexport type BarScalingFunction = (binValue: number) => number;\nexport type BarScalingOption = BarScalingPreset | BarScalingFunction;\n\ninterface HistogramItem {\n value: number;\n height: number;\n binStart: string;\n binEnd: string;\n tooltip: string;\n}\n\ninterface BarDataset extends DOMStringMap {\n numItems: string;\n binStart: string;\n binEnd: string;\n}\n\n// these values can be overridden via the component's HTML (camelCased) attributes\nconst WIDTH = 180;\nconst HEIGHT = 40;\nconst SLIDER_WIDTH = 10;\nconst TOOLTIP_WIDTH = 125;\nconst TOOLTIP_HEIGHT = 30;\nconst DATE_FORMAT = 'YYYY';\nconst MISSING_DATA = 'no data';\nconst UPDATE_DEBOUNCE_DELAY_MS = 0;\nconst TOOLTIP_LABEL = 'item';\n\n// this constant is not set up to be overridden\nconst SLIDER_CORNER_SIZE = 4;\n\n/**\n * Map from bar scaling preset options to the corresponding function they represent\n */\nconst BAR_SCALING_PRESET_FNS: Record<BarScalingPreset, BarScalingFunction> = {\n linear: (binValue: number) => binValue,\n logarithmic: (binValue: number) => Math.log1p(binValue),\n};\n\n// these CSS custom props can be overridden from the HTML that is invoking this component\nconst sliderColor = css`var(--histogramDateRangeSliderColor, #4B65FE)`;\nconst selectedRangeColor = css`var(--histogramDateRangeSelectedRangeColor, #DBE0FF)`;\nconst barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;\nconst activityIndicatorColor = css`var(--histogramDateRangeActivityIndicator, #2C2C2C)`;\nconst barExcludedFill = css`var(--histogramDateRangeBarExcludedFill, #CCCCCC)`;\nconst inputRowMargin = css`var(--histogramDateRangeInputRowMargin, 0)`;\nconst inputBorder = css`var(--histogramDateRangeInputBorder, 0.5px solid #2C2C2C)`;\nconst inputWidth = css`var(--histogramDateRangeInputWidth, 35px)`;\nconst inputFontSize = css`var(--histogramDateRangeInputFontSize, 1.2rem)`;\nconst inputFontFamily = css`var(--histogramDateRangeInputFontFamily, sans-serif)`;\nconst tooltipBackgroundColor = css`var(--histogramDateRangeTooltipBackgroundColor, #2C2C2C)`;\nconst tooltipTextColor = css`var(--histogramDateRangeTooltipTextColor, #FFFFFF)`;\nconst tooltipFontSize = css`var(--histogramDateRangeTooltipFontSize, 1.1rem)`;\nconst tooltipFontFamily = css`var(--histogramDateRangeTooltipFontFamily, sans-serif)`;\n\n@customElement('histogram-date-range')\nexport class HistogramDateRange extends LitElement {\n /* eslint-disable lines-between-class-members */\n\n // public reactive properties that can be set via HTML attributes\n @property({ type: Number }) width = WIDTH;\n @property({ type: Number }) height = HEIGHT;\n @property({ type: Number }) sliderWidth = SLIDER_WIDTH;\n @property({ type: Number }) tooltipWidth = TOOLTIP_WIDTH;\n @property({ type: Number }) tooltipHeight = TOOLTIP_HEIGHT;\n @property({ type: Number }) updateDelay = UPDATE_DEBOUNCE_DELAY_MS;\n @property({ type: String }) dateFormat = DATE_FORMAT;\n @property({ type: String }) missingDataMessage = MISSING_DATA;\n @property({ type: String }) minDate = '';\n @property({ type: String }) maxDate = '';\n @property({ type: Boolean }) disabled = false;\n @property({ type: Array }) bins: number[] = [];\n /** If true, update events will not be canceled by the date inputs receiving focus */\n @property({ type: Boolean }) updateWhileFocused = false;\n\n /**\n * What interval bins should be snapped to for determining their time ranges.\n * - `none` (default): Bins should each represent an identical duration of time,\n * without regard for the actual dates represented.\n * - `month`: Bins should each represent one or more full, non-overlapping months.\n * The bin ranges will be \"snapped\" to the nearest month boundaries, which can\n * result in bins that represent different amounts of time, particularly if the\n * provided bins do not evenly divide the provided date range, or if the months\n * represented are of different lengths.\n * - `year`: Same as `month`, but snapping to year boundaries instead of months.\n */\n @property({ type: String }) binSnapping: BinSnappingInterval = 'none';\n\n /**\n * What label to use on tooltips to identify the type of data being represented.\n * Defaults to `'item(s)'`.\n */\n @property({ type: String }) tooltipLabel = TOOLTIP_LABEL;\n\n /**\n * A function or preset value indicating how the height of each bar relates to its\n * corresponding bin value. Current presets available are 'logarithmic' and 'linear',\n * but a custom function may be provided instead if other behavior is desired.\n *\n * The default scaling (`'logarithmic'`) uses the logarithm of each bin value, yielding\n * more prominent bars for smaller values. This ensures that even when the difference\n * between the min & max values is large, small values are unlikely to completely disappear\n * visually. However, the cost is that bars have less noticeable variation among values of\n * a similar magnitude, and their heights are not a direct representation of the bin values.\n *\n * The `'linear'` preset option instead sizes the bars in linear proportion to their bin\n * values.\n */\n @property({ type: String }) barScaling: BarScalingOption = 'logarithmic';\n\n // internal reactive properties not exposed as attributes\n @state() private _tooltipOffsetX = 0;\n @state() private _tooltipOffsetY = 0;\n @state() private _tooltipContent?: TemplateResult;\n @state() private _tooltipDateFormat?: string;\n @state() private _isDragging = false;\n @state() private _isLoading = false;\n\n @query('#tooltip') private _tooltip!: HTMLDivElement;\n\n // non-reactive properties (changes don't auto-trigger re-rendering)\n private _minSelectedDate = '';\n private _maxSelectedDate = '';\n private _minDateMS = 0;\n private _maxDateMS = 0;\n private _dragOffset = 0;\n private _histWidth = 0;\n private _binWidth = 0;\n private _currentSlider?: SVGRectElement;\n private _histData: HistogramItem[] = [];\n private _emitUpdatedEventTimer?: ReturnType<typeof setTimeout>;\n private _previousDateRange = '';\n\n /* eslint-enable lines-between-class-members */\n\n disconnectedCallback(): void {\n this.removeListeners();\n super.disconnectedCallback();\n }\n\n willUpdate(changedProps: PropertyValues): void {\n // check for changes that would affect bin data calculations\n if (\n changedProps.has('bins') ||\n changedProps.has('minDate') ||\n changedProps.has('maxDate') ||\n changedProps.has('minSelectedDate') ||\n changedProps.has('maxSelectedDate') ||\n changedProps.has('width') ||\n changedProps.has('height') ||\n changedProps.has('binSnapping') ||\n changedProps.has('barScaling')\n ) {\n this.handleDataUpdate();\n }\n }\n\n /**\n * Set private properties that depend on the attribute bin data\n *\n * We're caching these values and not using getters to avoid recalculating all\n * of the hist data every time the user drags a slider or hovers over a bar\n * creating a tooltip.\n */\n private handleDataUpdate(): void {\n if (!this.hasBinData) {\n return;\n }\n this._histWidth = this.width - this.sliderWidth * 2;\n\n this._minDateMS = this.snapTimestamp(this.getMSFromString(this.minDate));\n // NB: The max date string, converted as-is to ms, represents the *start* of the\n // final date interval; we want the *end*, so we add any snap interval/offset.\n this._maxDateMS =\n this.snapTimestamp(\n this.getMSFromString(this.maxDate) + this.snapInterval\n ) + this.snapEndOffset;\n\n this._binWidth = this._histWidth / this._numBins;\n this._previousDateRange = this.currentDateRangeString;\n this._histData = this.calculateHistData();\n this.minSelectedDate = this.minSelectedDate\n ? this.minSelectedDate\n : this.minDate;\n this.maxSelectedDate = this.maxSelectedDate\n ? this.maxSelectedDate\n : this.maxDate;\n }\n\n /**\n * Rounds the given timestamp to the next full second.\n */\n private snapToNextSecond(timestamp: number): number {\n return Math.ceil(timestamp / 1000) * 1000;\n }\n\n /**\n * Rounds the given timestamp to the (approximate) nearest start of a month,\n * such that dates up to and including the 15th of the month are rounded down,\n * while dates past the 15th are rounded up.\n */\n private snapToMonth(timestamp: number): number {\n const d = dayjs(timestamp);\n const monthsToAdd = d.date() < 16 ? 0 : 1;\n const snapped = d\n .add(monthsToAdd, 'month')\n .date(1)\n .hour(0)\n .minute(0)\n .second(0)\n .millisecond(0); // First millisecond of the month\n return snapped.valueOf();\n }\n\n /**\n * Rounds the given timestamp to the (approximate) nearest start of a year,\n * such that dates up to the end of June are rounded down, while dates in\n * July or later are rounded up.\n */\n private snapToYear(timestamp: number): number {\n const d = dayjs(timestamp);\n const yearsToAdd = d.month() < 6 ? 0 : 1;\n const snapped = d\n .add(yearsToAdd, 'year')\n .month(0)\n .date(1)\n .hour(0)\n .minute(0)\n .second(0)\n .millisecond(0); // First millisecond of the year\n return snapped.valueOf();\n }\n\n /**\n * Rounds the given timestamp according to the `binSnapping` property.\n * Default is simply to snap to the nearest full second.\n */\n private snapTimestamp(timestamp: number): number {\n switch (this.binSnapping) {\n case 'year':\n return this.snapToYear(timestamp);\n case 'month':\n return this.snapToMonth(timestamp);\n case 'none':\n default:\n // We still align it to second boundaries to resolve minor discrepancies\n return this.snapToNextSecond(timestamp);\n }\n }\n\n /**\n * Function to scale bin values, whether from a preset or a provided custom function.\n */\n private get barScalingFunction(): BarScalingFunction {\n if (typeof this.barScaling === 'string') {\n return BAR_SCALING_PRESET_FNS[this.barScaling];\n }\n\n return this.barScaling;\n }\n\n private calculateHistData(): HistogramItem[] {\n const { bins, height, dateRangeMS, _numBins, _minDateMS } = this;\n const minValue = Math.min(...this.bins);\n const maxValue = Math.max(...this.bins);\n // if there is no difference between the min and max values, use a range of\n // 1 because log scaling will fail if the range is 0\n const valueRange =\n minValue === maxValue ? 1 : this.barScalingFunction(maxValue);\n const valueScale = height / valueRange;\n const dateScale = dateRangeMS / _numBins;\n\n return bins.map((v: number, i: number) => {\n const binStartMS = this.snapTimestamp(i * dateScale + _minDateMS);\n const binStart = this.formatDate(binStartMS);\n\n const binEndMS =\n this.snapTimestamp((i + 1) * dateScale + _minDateMS) +\n this.snapEndOffset;\n const binEnd = this.formatDate(binEndMS);\n\n const tooltipStart = this.formatDate(binStartMS, this.tooltipDateFormat);\n const tooltipEnd = this.formatDate(binEndMS, this.tooltipDateFormat);\n // If start/end are the same, just render a single value\n const tooltip =\n tooltipStart === tooltipEnd\n ? tooltipStart\n : `${tooltipStart} - ${tooltipEnd}`;\n\n return {\n value: v,\n // apply the configured scaling function to the bin value before determining bar height\n height: Math.floor(this.barScalingFunction(v) * valueScale),\n binStart,\n binEnd,\n tooltip,\n };\n });\n }\n\n private get hasBinData(): boolean {\n return this._numBins > 0;\n }\n\n private get _numBins(): number {\n if (!this.bins || !this.bins.length) {\n return 0;\n }\n return this.bins.length;\n }\n\n private get histogramLeftEdgeX(): number {\n return this.sliderWidth;\n }\n\n private get histogramRightEdgeX(): number {\n return this.width - this.sliderWidth;\n }\n\n /**\n * Approximate size in ms of the interval to which bins are snapped.\n */\n private get snapInterval(): number {\n const yearMS = 31_536_000_000; // A 365-day approximation of ms in a year\n const monthMS = 2_592_000_000; // A 30-day approximation of ms in a month\n switch (this.binSnapping) {\n case 'year':\n return yearMS;\n case 'month':\n return monthMS;\n case 'none':\n default:\n return 0;\n }\n }\n\n /**\n * Offset added to the end of each bin to ensure disjoint intervals,\n * depending on whether snapping is enabled and there are multiple bins.\n */\n private get snapEndOffset(): number {\n return this.binSnapping !== 'none' && this._numBins > 1 ? -1 : 0;\n }\n\n /**\n * Optional date format to use for tooltips only.\n * Falls back to `dateFormat` if not provided.\n */\n @property({ type: String }) get tooltipDateFormat(): string {\n return this._tooltipDateFormat ?? this.dateFormat;\n }\n\n set tooltipDateFormat(value: string) {\n this._tooltipDateFormat = value;\n }\n\n /** component's loading (and disabled) state */\n @property({ type: Boolean }) get loading(): boolean {\n return this._isLoading;\n }\n\n set loading(value: boolean) {\n this.disabled = value;\n this._isLoading = value;\n }\n\n /** formatted minimum date of selected date range */\n @property() get minSelectedDate(): string {\n return this.formatDate(this.getMSFromString(this._minSelectedDate));\n }\n\n /** updates minSelectedDate if new date is valid */\n set minSelectedDate(rawDate: string) {\n if (!this._minSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._minSelectedDate = rawDate;\n return;\n }\n const proposedDateMS = this.getMSFromString(rawDate);\n const isValidDate = !Number.isNaN(proposedDateMS);\n const isNotTooRecent =\n proposedDateMS <= this.getMSFromString(this.maxSelectedDate);\n if (isValidDate && isNotTooRecent) {\n this._minSelectedDate = this.formatDate(proposedDateMS);\n }\n this.requestUpdate();\n }\n\n /** formatted maximum date of selected date range */\n @property() get maxSelectedDate(): string {\n return this.formatDate(this.getMSFromString(this._maxSelectedDate));\n }\n\n /** updates maxSelectedDate if new date is valid */\n set maxSelectedDate(rawDate: string) {\n if (!this._maxSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._maxSelectedDate = rawDate;\n return;\n }\n const proposedDateMS = this.getMSFromString(rawDate);\n const isValidDate = !Number.isNaN(proposedDateMS);\n const isNotTooOld =\n proposedDateMS >= this.getMSFromString(this.minSelectedDate);\n if (isValidDate && isNotTooOld) {\n this._maxSelectedDate = this.formatDate(proposedDateMS);\n }\n this.requestUpdate();\n }\n\n /** horizontal position of min date slider */\n get minSliderX(): number {\n const x = this.translateDateToPosition(this.minSelectedDate);\n return this.validMinSliderX(x);\n }\n\n /** horizontal position of max date slider */\n get maxSliderX(): number {\n const maxSelectedDateMS = this.snapTimestamp(\n this.getMSFromString(this.maxSelectedDate) + this.snapInterval\n );\n const x = this.translateDateToPosition(this.formatDate(maxSelectedDateMS));\n return this.validMaxSliderX(x);\n }\n\n private get dateRangeMS(): number {\n return this._maxDateMS - this._minDateMS;\n }\n\n private showTooltip(e: PointerEvent): void {\n if (this._isDragging || this.disabled) {\n return;\n }\n\n const target = e.currentTarget as SVGRectElement;\n const x = target.x.baseVal.value + this.sliderWidth / 2;\n const dataset = target.dataset as BarDataset;\n const itemsText = `${this.tooltipLabel}${\n dataset.numItems !== '1' ? 's' : ''\n }`;\n const formattedNumItems = Number(dataset.numItems).toLocaleString();\n\n const tooltipPadding = 2;\n const bufferHeight = 9;\n const heightAboveHistogram = bufferHeight + this.tooltipHeight;\n const histogramBounds = this.getBoundingClientRect();\n const barX = histogramBounds.x + x;\n const histogramY = histogramBounds.y;\n\n // Center the tooltip horizontally along the bar\n this._tooltipOffsetX =\n barX -\n tooltipPadding +\n (this._binWidth - this.sliderWidth - this.tooltipWidth) / 2 +\n window.scrollX;\n // Place the tooltip (with arrow) just above the top of the histogram bars\n this._tooltipOffsetY = histogramY - heightAboveHistogram + window.scrollY;\n\n this._tooltipContent = html`\n ${formattedNumItems} ${itemsText}<br />\n ${dataset.tooltip}\n `;\n this._tooltip.showPopover?.();\n }\n\n private hideTooltip(): void {\n this._tooltipContent = undefined;\n this._tooltip.hidePopover?.();\n }\n\n // use arrow functions (rather than standard JS class instance methods) so\n // that `this` is bound to the histogramDateRange object and not the event\n // target. for more info see\n // https://lit-element.polymer-project.org/guide/events#using-this-in-event-listeners\n private drag = (e: PointerEvent): void => {\n // prevent selecting text or other ranges while dragging, especially in Safari\n e.preventDefault();\n if (this.disabled) {\n return;\n }\n this.setDragOffset(e);\n this._isDragging = true;\n this.addListeners();\n this.cancelPendingUpdateEvent();\n };\n\n private drop = (): void => {\n if (this._isDragging) {\n this.removeListeners();\n this.beginEmitUpdateProcess();\n }\n this._isDragging = false;\n };\n\n /**\n * Adjust the date range based on slider movement\n *\n * @param e PointerEvent from the slider being moved\n */\n private move = (e: PointerEvent): void => {\n const histogramClientX = this.getBoundingClientRect().x;\n const newX = e.clientX - histogramClientX - this._dragOffset;\n const slider = this._currentSlider as SVGRectElement;\n if ((slider.id as SliderId) === 'slider-min') {\n this.minSelectedDate = this.translatePositionToDate(\n this.validMinSliderX(newX)\n );\n } else {\n this.maxSelectedDate = this.translatePositionToDate(\n this.validMaxSliderX(newX)\n );\n if (this.getMSFromString(this.maxSelectedDate) > this._maxDateMS) {\n this.maxSelectedDate = this.maxDate;\n }\n }\n };\n\n /**\n * Constrain a proposed value for the minimum (left) slider\n *\n * If the value is less than the leftmost valid position, then set it to the\n * left edge of the histogram (ie the slider width). If the value is greater\n * than the rightmost valid position (the position of the max slider), then\n * set it to the position of the max slider\n */\n private validMinSliderX(newX: number): number {\n // allow the left slider to go right only to the right slider, even if the\n // max selected date is out of range\n const rightLimit = Math.min(\n this.translateDateToPosition(this.maxSelectedDate),\n this.histogramRightEdgeX\n );\n newX = this.clamp(newX, this.histogramLeftEdgeX, rightLimit);\n const isInvalid =\n Number.isNaN(newX) || rightLimit < this.histogramLeftEdgeX;\n return isInvalid ? this.histogramLeftEdgeX : newX;\n }\n\n /**\n * Constrain a proposed value for the maximum (right) slider\n *\n * If the value is greater than the rightmost valid position, then set it to\n * the right edge of the histogram (ie histogram width - slider width). If the\n * value is less than the leftmost valid position (the position of the min\n * slider), then set it to the position of the min slider\n */\n private validMaxSliderX(newX: number): number {\n // allow the right slider to go left only to the left slider, even if the\n // min selected date is out of range\n const leftLimit = Math.max(\n this.histogramLeftEdgeX,\n this.translateDateToPosition(this.minSelectedDate)\n );\n newX = this.clamp(newX, leftLimit, this.histogramRightEdgeX);\n const isInvalid =\n Number.isNaN(newX) || leftLimit > this.histogramRightEdgeX;\n return isInvalid ? this.histogramRightEdgeX : newX;\n }\n\n private addListeners(): void {\n window.addEventListener('pointermove', this.move);\n window.addEventListener('pointerup', this.drop);\n window.addEventListener('pointercancel', this.drop);\n }\n\n private removeListeners(): void {\n window.removeEventListener('pointermove', this.move);\n window.removeEventListener('pointerup', this.drop);\n window.removeEventListener('pointercancel', this.drop);\n }\n\n /**\n * start a timer to emit an update event. this timer can be canceled (and the\n * event not emitted) if user drags a slider or focuses a date input within\n * the update delay\n */\n private beginEmitUpdateProcess(): void {\n this.cancelPendingUpdateEvent();\n this._emitUpdatedEventTimer = setTimeout(() => {\n if (this.currentDateRangeString === this._previousDateRange) {\n // don't emit duplicate event if no change since last emitted event\n return;\n }\n this._previousDateRange = this.currentDateRangeString;\n const options = {\n detail: {\n minDate: this.minSelectedDate,\n maxDate: this.maxSelectedDate,\n },\n bubbles: true,\n composed: true,\n };\n this.dispatchEvent(new CustomEvent('histogramDateRangeUpdated', options));\n }, this.updateDelay);\n }\n\n private cancelPendingUpdateEvent(): void {\n if (this._emitUpdatedEventTimer === undefined) {\n return;\n }\n clearTimeout(this._emitUpdatedEventTimer);\n this._emitUpdatedEventTimer = undefined;\n }\n\n /**\n * find position of pointer in relation to the current slider\n */\n private setDragOffset(e: PointerEvent): void {\n this._currentSlider = e.currentTarget as SVGRectElement;\n const sliderX =\n (this._currentSlider.id as SliderId) === 'slider-min'\n ? this.minSliderX\n : this.maxSliderX;\n const histogramClientX = this.getBoundingClientRect().x;\n this._dragOffset = e.clientX - histogramClientX - sliderX;\n }\n\n /**\n * @param x horizontal position of slider\n * @returns string representation of date\n */\n private translatePositionToDate(x: number): string {\n // Snap to the nearest second, fixing the case where input like 1/1/2010\n // would get translated to 12/31/2009 due to slight discrepancies from\n // pixel boundaries and floating point error.\n const milliseconds = this.snapToNextSecond(\n ((x - this.sliderWidth) * this.dateRangeMS) / this._histWidth\n );\n return this.formatDate(this._minDateMS + milliseconds);\n }\n\n /**\n * Returns slider x-position corresponding to given date\n *\n * @param date\n * @returns x-position of slider\n */\n private translateDateToPosition(date: string): number {\n const milliseconds = this.getMSFromString(date);\n return (\n this.sliderWidth +\n ((milliseconds - this._minDateMS) * this._histWidth) / this.dateRangeMS\n );\n }\n\n /** ensure that the returned value is between minValue and maxValue */\n private clamp(x: number, minValue: number, maxValue: number): number {\n return Math.min(Math.max(x, minValue), maxValue);\n }\n\n private handleInputFocus(): void {\n if (!this.updateWhileFocused) {\n this.cancelPendingUpdateEvent();\n }\n }\n\n private handleMinDateInput(e: Event): void {\n const target = e.currentTarget as HTMLInputElement;\n if (target.value !== this.minSelectedDate) {\n this.minSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n }\n\n private handleMaxDateInput(e: Event): void {\n const target = e.currentTarget as HTMLInputElement;\n if (target.value !== this.maxSelectedDate) {\n this.maxSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n }\n\n private handleKeyUp(e: KeyboardEvent): void {\n if (e.key === 'Enter') {\n const target = e.currentTarget as HTMLInputElement;\n target.blur();\n if (target.id === 'date-min') {\n this.handleMinDateInput(e);\n } else if (target.id === 'date-max') {\n this.handleMaxDateInput(e);\n }\n }\n }\n\n private get currentDateRangeString(): string {\n return `${this.minSelectedDate}:${this.maxSelectedDate}`;\n }\n\n private getMSFromString(date: unknown): number {\n // It's possible that `date` is not a string in certain situations.\n // For instance if you use LitElement bindings and the date is `2000`,\n // it will be treated as a number instead of a string. This just makes sure\n // we're dealing with a string.\n const stringified = typeof date === 'string' ? date : String(date);\n const digitGroupCount = (stringified.split(/(\\d+)/).length - 1) / 2;\n if (digitGroupCount === 1) {\n // if there's just a single set of digits, assume it's a year\n const dateObj = new Date(0, 0); // start at January 1, 1900\n dateObj.setFullYear(Number(stringified)); // override year\n return dateObj.getTime(); // get time in milliseconds\n }\n return dayjs(stringified, [this.dateFormat, DATE_FORMAT]).valueOf();\n }\n\n /**\n * expand or narrow the selected range by moving the slider nearest the\n * clicked bar to the outer edge of the clicked bar\n *\n * @param e Event click event from a histogram bar\n */\n private handleBarClick(e: Event): void {\n const dataset = (e.currentTarget as SVGRectElement).dataset as BarDataset;\n // use the midpoint of the width of the clicked bar to determine which is\n // the nearest slider\n const clickPosition =\n (this.getMSFromString(dataset.binStart) +\n this.getMSFromString(dataset.binEnd)) /\n 2;\n const distanceFromMinSlider = Math.abs(\n clickPosition - this.getMSFromString(this.minSelectedDate)\n );\n const distanceFromMaxSlider = Math.abs(\n clickPosition - this.getMSFromString(this.maxSelectedDate)\n );\n // update the selected range by moving the nearer slider\n if (distanceFromMinSlider < distanceFromMaxSlider) {\n this.minSelectedDate = dataset.binStart;\n } else {\n this.maxSelectedDate = dataset.binEnd;\n }\n this.beginEmitUpdateProcess();\n }\n\n private get minSliderTemplate(): SVGTemplateResult {\n // width/height in pixels of curved part of the sliders (like\n // border-radius); used as part of a SVG quadratic curve. see\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#curve_commands\n const cs = SLIDER_CORNER_SIZE;\n\n const sliderShape = `\n M${this.minSliderX},0\n h-${this.sliderWidth - cs}\n q-${cs},0 -${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} ${cs},${cs}\n h${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.minSliderX, 'slider-min', sliderShape);\n }\n\n private get maxSliderTemplate(): SVGTemplateResult {\n const cs = SLIDER_CORNER_SIZE;\n const sliderShape = `\n M${this.maxSliderX},0\n h${this.sliderWidth - cs}\n q${cs},0 ${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} -${cs},${cs}\n h-${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.maxSliderX, 'slider-max', sliderShape);\n }\n\n private generateSliderSVG(\n sliderPositionX: number,\n id: SliderId,\n sliderShape: string\n ): SVGTemplateResult {\n // whether the curved part of the slider is facing towards the left (1), ie\n // minimum, or facing towards the right (-1), ie maximum\n const k = id === 'slider-min' ? 1 : -1;\n\n const sliderClasses = classMap({\n slider: true,\n draggable: !this.disabled,\n dragging: this._isDragging,\n });\n\n return svg`\n <svg\n id=${id}\n class=${sliderClasses}\n @pointerdown=${this.drag}\n >\n <path d=\"${sliderShape} z\" fill=\"${sliderColor}\" />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.4 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.6 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n </svg>\n `;\n }\n\n get selectedRangeTemplate(): SVGTemplateResult {\n return svg`\n <rect\n x=\"${this.minSliderX}\"\n y=\"0\"\n width=\"${this.maxSliderX - this.minSliderX}\"\n height=\"${this.height}\"\n fill=\"${selectedRangeColor}\"\n />`;\n }\n\n get histogramTemplate(): SVGTemplateResult[] {\n const xScale = this._histWidth / this._numBins;\n const barWidth = xScale - 1;\n let x = this.sliderWidth; // start at the left edge of the histogram\n\n return this._histData.map(data => {\n const { minSelectedDate, maxSelectedDate } = this;\n const barHeight = data.height;\n\n const binIsBeforeMin = this.isBefore(data.binEnd, minSelectedDate);\n const binIsAfterMax = this.isAfter(data.binStart, maxSelectedDate);\n const barFill =\n binIsBeforeMin || binIsAfterMax ? barExcludedFill : barIncludedFill;\n\n // the stroke-dasharray style below creates a transparent border around the\n // right edge of the bar, which prevents user from encountering a gap\n // between adjacent bars (eg when viewing the tooltips or when trying to\n // extend the range by clicking on a bar)\n const barStyle = `stroke-dasharray: 0 ${barWidth} ${barHeight} ${barWidth} 0 ${barHeight}`;\n\n const bar = svg`\n <rect\n class=\"bar-pointer-target\"\n x=${x}\n y=\"0\"\n width=${barWidth}\n height=${this.height}\n @pointerenter=${this.showTooltip}\n @pointerleave=${this.hideTooltip}\n @click=${this.handleBarClick}\n fill=\"transparent\"\n data-num-items=${data.value}\n data-bin-start=${data.binStart}\n data-bin-end=${data.binEnd}\n data-tooltip=${data.tooltip}\n />\n <rect\n class=\"bar\"\n style=${barStyle}\n x=${x}\n y=${this.height - barHeight}\n width=${barWidth}\n height=${barHeight}\n fill=${barFill}\n />`;\n x += xScale;\n return bar;\n });\n }\n\n /** Whether the first arg represents a date strictly before the second arg */\n private isBefore(date1: string, date2: string): boolean {\n const date1MS = this.getMSFromString(date1);\n const date2MS = this.getMSFromString(date2);\n return date1MS < date2MS;\n }\n\n /** Whether the first arg represents a date strictly after the second arg */\n private isAfter(date1: string, date2: string): boolean {\n const date1MS = this.getMSFromString(date1);\n const date2MS = this.getMSFromString(date2);\n return date1MS > date2MS;\n }\n\n private formatDate(dateMS: number, format: string = this.dateFormat): string {\n if (Number.isNaN(dateMS)) {\n return '';\n }\n const date = dayjs(dateMS);\n if (date.year() < 1000) {\n // years before 1000 don't play well with dayjs custom formatting, so work around dayjs\n // by setting the year to a sentinel value and then replacing it instead.\n // this is a bit hacky but it does the trick for essentially all reasonable cases\n // until such time as we replace dayjs.\n const tmpDate = date.year(199999);\n return tmpDate.format(format).replace(/199999/g, date.year().toString());\n }\n return date.format(format);\n }\n\n /**\n * NOTE: we are relying on the lit `live` directive in the template to\n * ensure that the change to minSelectedDate is noticed and the input value\n * gets properly re-rendered. see\n * https://lit.dev/docs/templates/directives/#live\n */\n get minInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-min\"\n placeholder=${this.dateFormat}\n type=\"text\"\n @focus=${this.handleInputFocus}\n @blur=${this.handleMinDateInput}\n @keyup=${this.handleKeyUp}\n .value=${live(this.minSelectedDate)}\n ?disabled=${this.disabled}\n />\n `;\n }\n\n get maxInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-max\"\n placeholder=${this.dateFormat}\n type=\"text\"\n @focus=${this.handleInputFocus}\n @blur=${this.handleMaxDateInput}\n @keyup=${this.handleKeyUp}\n .value=${live(this.maxSelectedDate)}\n ?disabled=${this.disabled}\n />\n `;\n }\n\n get minLabelTemplate(): TemplateResult {\n return html`<label for=\"date-min\" class=\"sr-only\">Minimum date:</label>`;\n }\n\n get maxLabelTemplate(): TemplateResult {\n return html`<label for=\"date-max\" class=\"sr-only\">Maximum date:</label>`;\n }\n\n get tooltipTemplate(): TemplateResult {\n const styles = styleMap({\n width: `${this.tooltipWidth}px`,\n height: `${this.tooltipHeight}px`,\n top: `${this._tooltipOffsetY}px`,\n left: `${this._tooltipOffsetX}px`,\n });\n\n return html`\n <div id=\"tooltip\" style=${styles} popover>${this._tooltipContent}</div>\n `;\n }\n\n private get histogramAccessibility(): TemplateResult {\n let rangeText: string;\n if (this.minSelectedDate && this.maxSelectedDate) {\n rangeText = `from ${this.minSelectedDate} to ${this.maxSelectedDate}`;\n } else if (this.minSelectedDate) {\n rangeText = `from ${this.minSelectedDate}`;\n } else if (this.maxSelectedDate) {\n rangeText = `up to ${this.maxSelectedDate}`;\n } else {\n rangeText = 'for all available dates';\n }\n\n const titleText = `Filter results distribution ${rangeText}`;\n\n const descText =\n `This chart shows the distribution of search results ${rangeText}. The bars represent result counts for each time period within the selected date range.`.trim();\n\n return html`<title id=\"histogram-title\">${titleText}</title\n ><desc id=\"histogram-desc\">${descText}</desc>`;\n }\n\n private get noDataTemplate(): TemplateResult {\n return html`\n <div class=\"missing-data-message\">${this.missingDataMessage}</div>\n `;\n }\n\n private get activityIndicatorTemplate(): TemplateResult | typeof nothing {\n if (!this.loading) {\n return nothing;\n }\n return html`\n <ia-activity-indicator mode=\"processing\"> </ia-activity-indicator>\n `;\n }\n\n static styles = css`\n .missing-data-message {\n text-align: center;\n }\n #container {\n margin: 0;\n touch-action: none;\n position: relative;\n }\n .disabled {\n opacity: 0.3;\n }\n ia-activity-indicator {\n position: absolute;\n left: calc(50% - 10px);\n top: 10px;\n width: 20px;\n height: 20px;\n --activityIndicatorLoadingDotColor: rgba(0, 0, 0, 0);\n --activityIndicatorLoadingRingColor: ${activityIndicatorColor};\n }\n\n /* prevent selection from interfering with tooltip, especially on mobile */\n /* https://stackoverflow.com/a/4407335/1163042 */\n .noselect {\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Safari */\n -moz-user-select: none; /* Old versions of Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none; /* current Chrome, Edge, Opera and Firefox */\n }\n .bar,\n .bar-pointer-target {\n /* create a transparent border around the hist bars to prevent \"gaps\" and\n flickering when moving around between bars. this also helps with handling\n clicks on the bars, preventing users from being able to click in between\n bars */\n stroke: rgba(0, 0, 0, 0);\n /* ensure transparent stroke wide enough to cover gap between bars */\n stroke-width: 2px;\n }\n .bar {\n /* ensure the bar's pointer target receives events, not the bar itself */\n pointer-events: none;\n }\n .bar-pointer-target:hover + .bar {\n /* highlight currently hovered bar */\n fill-opacity: 0.7;\n }\n .disabled .bar-pointer-target:hover + .bar {\n /* ensure no visual hover interaction when disabled */\n fill-opacity: 1;\n }\n /****** histogram ********/\n #tooltip {\n position: absolute;\n background: ${tooltipBackgroundColor};\n margin: 0;\n border: 0;\n color: ${tooltipTextColor};\n text-align: center;\n border-radius: 3px;\n padding: 2px;\n font-size: ${tooltipFontSize};\n font-family: ${tooltipFontFamily};\n touch-action: none;\n pointer-events: none;\n overflow: visible;\n }\n #tooltip:after {\n content: '';\n position: absolute;\n margin-left: -5px;\n top: 100%;\n left: 50%;\n /* arrow */\n border: 5px solid ${tooltipTextColor};\n border-color: ${tooltipBackgroundColor} transparent transparent\n transparent;\n }\n /****** slider ********/\n .slider {\n shape-rendering: crispEdges; /* So the slider doesn't get blurry if dragged between pixels */\n }\n .draggable:hover {\n cursor: grab;\n }\n .dragging {\n cursor: grabbing !important;\n }\n /****** inputs ********/\n #inputs {\n display: flex;\n justify-content: center;\n margin: ${inputRowMargin};\n }\n #inputs .dash {\n position: relative;\n bottom: -1px;\n align-self: center; /* Otherwise the dash sticks to the top while the inputs grow */\n }\n input {\n width: ${inputWidth};\n margin: 0 3px;\n border: ${inputBorder};\n border-radius: 2px !important;\n text-align: center;\n font-size: ${inputFontSize};\n font-family: ${inputFontFamily};\n }\n .sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n margin: 0 !important;\n padding: 0 !important;\n border: 0 !important;\n overflow: hidden !important;\n white-space: nowrap !important;\n clip: rect(1px, 1px, 1px, 1px) !important;\n -webkit-clip-path: inset(50%) !important;\n clip-path: inset(50%) !important;\n }\n `;\n\n render(): TemplateResult {\n if (!this.hasBinData) {\n return this.noDataTemplate;\n }\n return html`\n <div\n id=\"container\"\n class=\"\n noselect\n ${this._isDragging ? 'dragging' : ''}\n \"\n style=\"width: ${this.width}px\"\n >\n ${this.activityIndicatorTemplate} ${this.tooltipTemplate}\n <div\n class=\"inner-container\n ${this.disabled ? 'disabled' : ''}\"\n >\n <svg\n width=\"${this.width}\"\n height=\"${this.height}\"\n aria-labelledby=\"histogram-title histogram-desc\"\n @pointerleave=\"${this.drop}\"\n >\n ${this.histogramAccessibility} ${this.selectedRangeTemplate}\n <svg id=\"histogram\">${this.histogramTemplate}</svg>\n ${this.minSliderTemplate} ${this.maxSliderTemplate}\n </svg>\n <div id=\"inputs\">\n ${this.minLabelTemplate} ${this.minInputTemplate}\n <div class=\"dash\">-</div>\n ${this.maxLabelTemplate} ${this.maxInputTemplate}\n <slot name=\"inputs-right-side\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\n// help TypeScript provide strong typing when interacting with DOM APIs\n// https://stackoverflow.com/questions/65148695/lit-element-typescript-project-global-interface-declaration-necessary\ndeclare global {\n interface HTMLElementTagNameMap {\n 'histogram-date-range': HistogramDateRange;\n }\n}\n"]}
1
+ {"version":3,"file":"histogram-date-range.js","sourceRoot":"","sources":["../../src/histogram-date-range.ts"],"names":[],"mappings":"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","sourcesContent":["import '@internetarchive/ia-activity-indicator';\nimport dayjs from 'dayjs/esm';\nimport customParseFormat from 'dayjs/esm/plugin/customParseFormat';\nimport fixFirstCenturyYears from './plugins/fix-first-century-years';\nimport {\n css,\n html,\n LitElement,\n nothing,\n PropertyValues,\n svg,\n SVGTemplateResult,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\ndayjs.extend(customParseFormat);\ndayjs.extend(fixFirstCenturyYears);\n\ntype SliderId = 'slider-min' | 'slider-max';\n\nexport type BinSnappingInterval = 'none' | 'month' | 'year';\n\nexport type BarScalingPreset = 'linear' | 'logarithmic';\nexport type BarScalingFunction = (binValue: number) => number;\nexport type BarScalingOption = BarScalingPreset | BarScalingFunction;\n\ninterface HistogramItem {\n value: number;\n height: number;\n binStart: string;\n binEnd: string;\n tooltip: string;\n}\n\ninterface BarDataset extends DOMStringMap {\n numItems: string;\n binStart: string;\n binEnd: string;\n}\n\n// these values can be overridden via the component's HTML (camelCased) attributes\nconst WIDTH = 180;\nconst HEIGHT = 40;\nconst SLIDER_WIDTH = 10;\nconst TOOLTIP_WIDTH = 125;\nconst TOOLTIP_HEIGHT = 30;\nconst DATE_FORMAT = 'YYYY';\nconst MISSING_DATA = 'no data';\nconst UPDATE_DEBOUNCE_DELAY_MS = 0;\nconst TOOLTIP_LABEL = 'item';\n\n// this constant is not set up to be overridden\nconst SLIDER_CORNER_SIZE = 4;\n\n/**\n * Map from bar scaling preset options to the corresponding function they represent\n */\nconst BAR_SCALING_PRESET_FNS: Record<BarScalingPreset, BarScalingFunction> = {\n linear: (binValue: number) => binValue,\n logarithmic: (binValue: number) => Math.log1p(binValue),\n};\n\n// these CSS custom props can be overridden from the HTML that is invoking this component\nconst sliderColor = css`var(--histogramDateRangeSliderColor, #4B65FE)`;\nconst selectedRangeColor = css`var(--histogramDateRangeSelectedRangeColor, #DBE0FF)`;\nconst barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;\nconst activityIndicatorColor = css`var(--histogramDateRangeActivityIndicator, #2C2C2C)`;\nconst barExcludedFill = css`var(--histogramDateRangeBarExcludedFill, #CCCCCC)`;\nconst inputRowMargin = css`var(--histogramDateRangeInputRowMargin, 0)`;\nconst inputBorder = css`var(--histogramDateRangeInputBorder, 0.5px solid #2C2C2C)`;\nconst inputWidth = css`var(--histogramDateRangeInputWidth, 35px)`;\nconst inputFontSize = css`var(--histogramDateRangeInputFontSize, 1.2rem)`;\nconst inputFontFamily = css`var(--histogramDateRangeInputFontFamily, sans-serif)`;\nconst tooltipBackgroundColor = css`var(--histogramDateRangeTooltipBackgroundColor, #2C2C2C)`;\nconst tooltipTextColor = css`var(--histogramDateRangeTooltipTextColor, #FFFFFF)`;\nconst tooltipFontSize = css`var(--histogramDateRangeTooltipFontSize, 1.1rem)`;\nconst tooltipFontFamily = css`var(--histogramDateRangeTooltipFontFamily, sans-serif)`;\n\n@customElement('histogram-date-range')\nexport class HistogramDateRange extends LitElement {\n /* eslint-disable lines-between-class-members */\n\n // public reactive properties that can be set via HTML attributes\n @property({ type: Number }) width = WIDTH;\n @property({ type: Number }) height = HEIGHT;\n @property({ type: Number }) sliderWidth = SLIDER_WIDTH;\n @property({ type: Number }) tooltipWidth = TOOLTIP_WIDTH;\n @property({ type: Number }) tooltipHeight = TOOLTIP_HEIGHT;\n @property({ type: Number }) updateDelay = UPDATE_DEBOUNCE_DELAY_MS;\n @property({ type: String }) dateFormat = DATE_FORMAT;\n @property({ type: String }) missingDataMessage = MISSING_DATA;\n @property({ type: String }) minDate = '';\n @property({ type: String }) maxDate = '';\n @property({ type: Boolean }) disabled = false;\n @property({ type: Array }) bins: number[] = [];\n /** If true, update events will not be canceled by the date inputs receiving focus */\n @property({ type: Boolean }) updateWhileFocused = false;\n\n /**\n * What interval bins should be snapped to for determining their time ranges.\n * - `none` (default): Bins should each represent an identical duration of time,\n * without regard for the actual dates represented.\n * - `month`: Bins should each represent one or more full, non-overlapping months.\n * The bin ranges will be \"snapped\" to the nearest month boundaries, which can\n * result in bins that represent different amounts of time, particularly if the\n * provided bins do not evenly divide the provided date range, or if the months\n * represented are of different lengths.\n * - `year`: Same as `month`, but snapping to year boundaries instead of months.\n */\n @property({ type: String }) binSnapping: BinSnappingInterval = 'none';\n\n /**\n * What label to use on tooltips to identify the type of data being represented.\n * Defaults to `'item(s)'`.\n */\n @property({ type: String }) tooltipLabel = TOOLTIP_LABEL;\n\n /**\n * A function or preset value indicating how the height of each bar relates to its\n * corresponding bin value. Current presets available are 'logarithmic' and 'linear',\n * but a custom function may be provided instead if other behavior is desired.\n *\n * The default scaling (`'logarithmic'`) uses the logarithm of each bin value, yielding\n * more prominent bars for smaller values. This ensures that even when the difference\n * between the min & max values is large, small values are unlikely to completely disappear\n * visually. However, the cost is that bars have less noticeable variation among values of\n * a similar magnitude, and their heights are not a direct representation of the bin values.\n *\n * The `'linear'` preset option instead sizes the bars in linear proportion to their bin\n * values.\n */\n @property({ type: String }) barScaling: BarScalingOption = 'logarithmic';\n\n // internal reactive properties not exposed as attributes\n @state() private _tooltipOffsetX = 0;\n @state() private _tooltipOffsetY = 0;\n @state() private _tooltipContent?: TemplateResult;\n @state() private _tooltipDateFormat?: string;\n @state() private _isDragging = false;\n @state() private _isLoading = false;\n\n @query('#tooltip') private _tooltip!: HTMLDivElement;\n\n // non-reactive properties (changes don't auto-trigger re-rendering)\n private _minSelectedDate = '';\n private _maxSelectedDate = '';\n private _minDateMS = 0;\n private _maxDateMS = 0;\n private _dragOffset = 0;\n private _histWidth = 0;\n private _binWidth = 0;\n private _currentSlider?: SVGRectElement;\n private _histData: HistogramItem[] = [];\n private _emitUpdatedEventTimer?: ReturnType<typeof setTimeout>;\n private _previousDateRange = '';\n\n /* eslint-enable lines-between-class-members */\n\n disconnectedCallback(): void {\n this.removeListeners();\n super.disconnectedCallback();\n }\n\n willUpdate(changedProps: PropertyValues): void {\n // check for changes that would affect bin data calculations\n if (\n changedProps.has('bins') ||\n changedProps.has('minDate') ||\n changedProps.has('maxDate') ||\n changedProps.has('minSelectedDate') ||\n changedProps.has('maxSelectedDate') ||\n changedProps.has('width') ||\n changedProps.has('height') ||\n changedProps.has('binSnapping') ||\n changedProps.has('barScaling')\n ) {\n this.handleDataUpdate();\n }\n }\n\n /**\n * Set private properties that depend on the attribute bin data\n *\n * We're caching these values and not using getters to avoid recalculating all\n * of the hist data every time the user drags a slider or hovers over a bar\n * creating a tooltip.\n */\n private handleDataUpdate(): void {\n if (!this.hasBinData) {\n return;\n }\n this._histWidth = this.width - this.sliderWidth * 2;\n\n this._minDateMS = this.snapTimestamp(this.getMSFromString(this.minDate));\n // NB: The max date string, converted as-is to ms, represents the *start* of the\n // final date interval; we want the *end*, so we add any snap interval/offset.\n this._maxDateMS =\n this.snapTimestamp(\n this.getMSFromString(this.maxDate) + this.snapInterval\n ) + this.snapEndOffset;\n\n this._binWidth = this._histWidth / this._numBins;\n this._previousDateRange = this.currentDateRangeString;\n this._histData = this.calculateHistData();\n this.minSelectedDate = this.minSelectedDate\n ? this.minSelectedDate\n : this.minDate;\n this.maxSelectedDate = this.maxSelectedDate\n ? this.maxSelectedDate\n : this.maxDate;\n }\n\n /**\n * Rounds the given timestamp to the next full second.\n */\n private snapToNextSecond(timestamp: number): number {\n return Math.ceil(timestamp / 1000) * 1000;\n }\n\n /**\n * Rounds the given timestamp to the (approximate) nearest start of a month,\n * such that dates up to and including the 15th of the month are rounded down,\n * while dates past the 15th are rounded up.\n */\n private snapToMonth(timestamp: number): number {\n const d = dayjs(timestamp);\n const monthsToAdd = d.date() < 16 ? 0 : 1;\n const snapped = d\n .add(monthsToAdd, 'month')\n .date(1)\n .hour(0)\n .minute(0)\n .second(0)\n .millisecond(0); // First millisecond of the month\n return snapped.valueOf();\n }\n\n /**\n * Rounds the given timestamp to the (approximate) nearest start of a year,\n * such that dates up to the end of June are rounded down, while dates in\n * July or later are rounded up.\n */\n private snapToYear(timestamp: number): number {\n const d = dayjs(timestamp);\n const yearsToAdd = d.month() < 6 ? 0 : 1;\n const snapped = d\n .add(yearsToAdd, 'year')\n .month(0)\n .date(1)\n .hour(0)\n .minute(0)\n .second(0)\n .millisecond(0); // First millisecond of the year\n return snapped.valueOf();\n }\n\n /**\n * Rounds the given timestamp according to the `binSnapping` property.\n * Default is simply to snap to the nearest full second.\n */\n private snapTimestamp(timestamp: number): number {\n switch (this.binSnapping) {\n case 'year':\n return this.snapToYear(timestamp);\n case 'month':\n return this.snapToMonth(timestamp);\n case 'none':\n default:\n // We still align it to second boundaries to resolve minor discrepancies\n return this.snapToNextSecond(timestamp);\n }\n }\n\n /**\n * Function to scale bin values, whether from a preset or a provided custom function.\n */\n private get barScalingFunction(): BarScalingFunction {\n if (typeof this.barScaling === 'string') {\n return BAR_SCALING_PRESET_FNS[this.barScaling];\n }\n\n return this.barScaling;\n }\n\n private calculateHistData(): HistogramItem[] {\n const { bins, height, dateRangeMS, _numBins, _minDateMS } = this;\n const minValue = Math.min(...this.bins);\n const maxValue = Math.max(...this.bins);\n // if there is no difference between the min and max values, use a range of\n // 1 because log scaling will fail if the range is 0\n const valueRange =\n minValue === maxValue ? 1 : this.barScalingFunction(maxValue);\n const valueScale = height / valueRange;\n const dateScale = dateRangeMS / _numBins;\n\n return bins.map((v: number, i: number) => {\n const binStartMS = this.snapTimestamp(i * dateScale + _minDateMS);\n const binStart = this.formatDate(binStartMS);\n\n const binEndMS =\n this.snapTimestamp((i + 1) * dateScale + _minDateMS) +\n this.snapEndOffset;\n const binEnd = this.formatDate(binEndMS);\n\n const tooltipStart = this.formatDate(binStartMS, this.tooltipDateFormat);\n const tooltipEnd = this.formatDate(binEndMS, this.tooltipDateFormat);\n // If start/end are the same, just render a single value\n const tooltip =\n tooltipStart === tooltipEnd\n ? tooltipStart\n : `${tooltipStart} - ${tooltipEnd}`;\n\n return {\n value: v,\n // apply the configured scaling function to the bin value before determining bar height\n height: Math.floor(this.barScalingFunction(v) * valueScale),\n binStart,\n binEnd,\n tooltip,\n };\n });\n }\n\n private get hasBinData(): boolean {\n return this._numBins > 0;\n }\n\n private get _numBins(): number {\n if (!this.bins || !this.bins.length) {\n return 0;\n }\n return this.bins.length;\n }\n\n private get histogramLeftEdgeX(): number {\n return this.sliderWidth;\n }\n\n private get histogramRightEdgeX(): number {\n return this.width - this.sliderWidth;\n }\n\n /**\n * Approximate size in ms of the interval to which bins are snapped.\n */\n private get snapInterval(): number {\n const yearMS = 31_536_000_000; // A 365-day approximation of ms in a year\n const monthMS = 2_592_000_000; // A 30-day approximation of ms in a month\n switch (this.binSnapping) {\n case 'year':\n return yearMS;\n case 'month':\n return monthMS;\n case 'none':\n default:\n return 0;\n }\n }\n\n /**\n * Offset added to the end of each bin to ensure disjoint intervals,\n * depending on whether snapping is enabled and there are multiple bins.\n */\n private get snapEndOffset(): number {\n return this.binSnapping !== 'none' && this._numBins > 1 ? -1 : 0;\n }\n\n /**\n * Optional date format to use for tooltips only.\n * Falls back to `dateFormat` if not provided.\n */\n @property({ type: String }) get tooltipDateFormat(): string {\n return this._tooltipDateFormat ?? this.dateFormat;\n }\n\n set tooltipDateFormat(value: string) {\n this._tooltipDateFormat = value;\n }\n\n /** component's loading (and disabled) state */\n @property({ type: Boolean }) get loading(): boolean {\n return this._isLoading;\n }\n\n set loading(value: boolean) {\n this.disabled = value;\n this._isLoading = value;\n }\n\n /** formatted minimum date of selected date range */\n @property() get minSelectedDate(): string {\n return this.formatDate(this.getMSFromString(this._minSelectedDate));\n }\n\n /** updates minSelectedDate if new date is valid */\n set minSelectedDate(rawDate: string) {\n if (!this._minSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._minSelectedDate = rawDate;\n return;\n }\n const proposedDateMS = this.getMSFromString(rawDate);\n const isValidDate = !Number.isNaN(proposedDateMS);\n const isNotTooRecent =\n proposedDateMS <= this.getMSFromString(this.maxSelectedDate);\n if (isValidDate && isNotTooRecent) {\n this._minSelectedDate = this.formatDate(proposedDateMS);\n }\n this.requestUpdate();\n }\n\n /** formatted maximum date of selected date range */\n @property() get maxSelectedDate(): string {\n return this.formatDate(this.getMSFromString(this._maxSelectedDate));\n }\n\n /** updates maxSelectedDate if new date is valid */\n set maxSelectedDate(rawDate: string) {\n if (!this._maxSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._maxSelectedDate = rawDate;\n return;\n }\n const proposedDateMS = this.getMSFromString(rawDate);\n const isValidDate = !Number.isNaN(proposedDateMS);\n const isNotTooOld =\n proposedDateMS >= this.getMSFromString(this.minSelectedDate);\n if (isValidDate && isNotTooOld) {\n this._maxSelectedDate = this.formatDate(proposedDateMS);\n }\n this.requestUpdate();\n }\n\n /** horizontal position of min date slider */\n get minSliderX(): number {\n const x = this.translateDateToPosition(this.minSelectedDate);\n return this.validMinSliderX(x);\n }\n\n /** horizontal position of max date slider */\n get maxSliderX(): number {\n const maxSelectedDateMS = this.snapTimestamp(\n this.getMSFromString(this.maxSelectedDate) + this.snapInterval\n );\n const x = this.translateDateToPosition(this.formatDate(maxSelectedDateMS));\n return this.validMaxSliderX(x);\n }\n\n private get dateRangeMS(): number {\n return this._maxDateMS - this._minDateMS;\n }\n\n private showTooltip(e: PointerEvent): void {\n if (this._isDragging || this.disabled) {\n return;\n }\n\n const target = e.currentTarget as SVGRectElement;\n const x = target.x.baseVal.value + this.sliderWidth / 2;\n const dataset = target.dataset as BarDataset;\n const itemsText = `${this.tooltipLabel}${\n dataset.numItems !== '1' ? 's' : ''\n }`;\n const formattedNumItems = Number(dataset.numItems).toLocaleString();\n\n const tooltipPadding = 2;\n const bufferHeight = 9;\n const heightAboveHistogram = bufferHeight + this.tooltipHeight;\n const histogramBounds = this.getBoundingClientRect();\n const barX = histogramBounds.x + x;\n const histogramY = histogramBounds.y;\n\n // Center the tooltip horizontally along the bar\n this._tooltipOffsetX =\n barX -\n tooltipPadding +\n (this._binWidth - this.sliderWidth - this.tooltipWidth) / 2 +\n window.scrollX;\n // Place the tooltip (with arrow) just above the top of the histogram bars\n this._tooltipOffsetY = histogramY - heightAboveHistogram + window.scrollY;\n\n this._tooltipContent = html`\n ${formattedNumItems} ${itemsText}<br />\n ${dataset.tooltip}\n `;\n this._tooltip.showPopover?.();\n }\n\n private hideTooltip(): void {\n this._tooltipContent = undefined;\n this._tooltip.hidePopover?.();\n }\n\n // use arrow functions (rather than standard JS class instance methods) so\n // that `this` is bound to the histogramDateRange object and not the event\n // target. for more info see\n // https://lit-element.polymer-project.org/guide/events#using-this-in-event-listeners\n private drag = (e: PointerEvent): void => {\n // prevent selecting text or other ranges while dragging, especially in Safari\n e.preventDefault();\n if (this.disabled) {\n return;\n }\n this.setDragOffset(e);\n this._isDragging = true;\n this.addListeners();\n this.cancelPendingUpdateEvent();\n };\n\n private drop = (): void => {\n if (this._isDragging) {\n this.removeListeners();\n this.beginEmitUpdateProcess();\n }\n this._isDragging = false;\n };\n\n /**\n * Adjust the date range based on slider movement\n *\n * @param e PointerEvent from the slider being moved\n */\n private move = (e: PointerEvent): void => {\n const histogramClientX = this.getBoundingClientRect().x;\n const newX = e.clientX - histogramClientX - this._dragOffset;\n const slider = this._currentSlider as SVGRectElement;\n if ((slider.id as SliderId) === 'slider-min') {\n this.minSelectedDate = this.translatePositionToDate(\n this.validMinSliderX(newX)\n );\n } else {\n this.maxSelectedDate = this.translatePositionToDate(\n this.validMaxSliderX(newX)\n );\n if (this.getMSFromString(this.maxSelectedDate) > this._maxDateMS) {\n this.maxSelectedDate = this.maxDate;\n }\n }\n };\n\n /**\n * Constrain a proposed value for the minimum (left) slider\n *\n * If the value is less than the leftmost valid position, then set it to the\n * left edge of the histogram (ie the slider width). If the value is greater\n * than the rightmost valid position (the position of the max slider), then\n * set it to the position of the max slider\n */\n private validMinSliderX(newX: number): number {\n // allow the left slider to go right only to the right slider, even if the\n // max selected date is out of range\n const rightLimit = Math.min(\n this.translateDateToPosition(this.maxSelectedDate),\n this.histogramRightEdgeX\n );\n newX = this.clamp(newX, this.histogramLeftEdgeX, rightLimit);\n const isInvalid =\n Number.isNaN(newX) || rightLimit < this.histogramLeftEdgeX;\n return isInvalid ? this.histogramLeftEdgeX : newX;\n }\n\n /**\n * Constrain a proposed value for the maximum (right) slider\n *\n * If the value is greater than the rightmost valid position, then set it to\n * the right edge of the histogram (ie histogram width - slider width). If the\n * value is less than the leftmost valid position (the position of the min\n * slider), then set it to the position of the min slider\n */\n private validMaxSliderX(newX: number): number {\n // allow the right slider to go left only to the left slider, even if the\n // min selected date is out of range\n const leftLimit = Math.max(\n this.histogramLeftEdgeX,\n this.translateDateToPosition(this.minSelectedDate)\n );\n newX = this.clamp(newX, leftLimit, this.histogramRightEdgeX);\n const isInvalid =\n Number.isNaN(newX) || leftLimit > this.histogramRightEdgeX;\n return isInvalid ? this.histogramRightEdgeX : newX;\n }\n\n private addListeners(): void {\n window.addEventListener('pointermove', this.move);\n window.addEventListener('pointerup', this.drop);\n window.addEventListener('pointercancel', this.drop);\n }\n\n private removeListeners(): void {\n window.removeEventListener('pointermove', this.move);\n window.removeEventListener('pointerup', this.drop);\n window.removeEventListener('pointercancel', this.drop);\n }\n\n /**\n * start a timer to emit an update event. this timer can be canceled (and the\n * event not emitted) if user drags a slider or focuses a date input within\n * the update delay\n */\n private beginEmitUpdateProcess(): void {\n this.cancelPendingUpdateEvent();\n this._emitUpdatedEventTimer = setTimeout(() => {\n if (this.currentDateRangeString === this._previousDateRange) {\n // don't emit duplicate event if no change since last emitted event\n return;\n }\n this._previousDateRange = this.currentDateRangeString;\n const options = {\n detail: {\n minDate: this.minSelectedDate,\n maxDate: this.maxSelectedDate,\n },\n bubbles: true,\n composed: true,\n };\n this.dispatchEvent(new CustomEvent('histogramDateRangeUpdated', options));\n }, this.updateDelay);\n }\n\n private cancelPendingUpdateEvent(): void {\n if (this._emitUpdatedEventTimer === undefined) {\n return;\n }\n clearTimeout(this._emitUpdatedEventTimer);\n this._emitUpdatedEventTimer = undefined;\n }\n\n /**\n * find position of pointer in relation to the current slider\n */\n private setDragOffset(e: PointerEvent): void {\n this._currentSlider = e.currentTarget as SVGRectElement;\n const sliderX =\n (this._currentSlider.id as SliderId) === 'slider-min'\n ? this.minSliderX\n : this.maxSliderX;\n const histogramClientX = this.getBoundingClientRect().x;\n this._dragOffset = e.clientX - histogramClientX - sliderX;\n }\n\n /**\n * @param x horizontal position of slider\n * @returns string representation of date\n */\n private translatePositionToDate(x: number): string {\n // Snap to the nearest second, fixing the case where input like 1/1/2010\n // would get translated to 12/31/2009 due to slight discrepancies from\n // pixel boundaries and floating point error.\n const milliseconds = this.snapToNextSecond(\n ((x - this.sliderWidth) * this.dateRangeMS) / this._histWidth\n );\n return this.formatDate(this._minDateMS + milliseconds);\n }\n\n /**\n * Returns slider x-position corresponding to given date\n *\n * @param date\n * @returns x-position of slider\n */\n private translateDateToPosition(date: string): number {\n const milliseconds = this.getMSFromString(date);\n return (\n this.sliderWidth +\n ((milliseconds - this._minDateMS) * this._histWidth) / this.dateRangeMS\n );\n }\n\n /** ensure that the returned value is between minValue and maxValue */\n private clamp(x: number, minValue: number, maxValue: number): number {\n return Math.min(Math.max(x, minValue), maxValue);\n }\n\n private handleInputFocus(): void {\n if (!this.updateWhileFocused) {\n this.cancelPendingUpdateEvent();\n }\n }\n\n private handleMinDateInput(e: Event): void {\n const target = e.currentTarget as HTMLInputElement;\n if (target.value !== this.minSelectedDate) {\n this.minSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n }\n\n private handleMaxDateInput(e: Event): void {\n const target = e.currentTarget as HTMLInputElement;\n if (target.value !== this.maxSelectedDate) {\n this.maxSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n }\n\n private handleKeyUp(e: KeyboardEvent): void {\n if (e.key === 'Enter') {\n const target = e.currentTarget as HTMLInputElement;\n target.blur();\n if (target.id === 'date-min') {\n this.handleMinDateInput(e);\n } else if (target.id === 'date-max') {\n this.handleMaxDateInput(e);\n }\n }\n }\n\n private get currentDateRangeString(): string {\n return `${this.minSelectedDate}:${this.maxSelectedDate}`;\n }\n\n private getMSFromString(date: unknown): number {\n // It's possible that `date` is not a string in certain situations.\n // For instance if you use LitElement bindings and the date is `2000`,\n // it will be treated as a number instead of a string. This just makes sure\n // we're dealing with a string.\n const stringified = typeof date === 'string' ? date : String(date);\n const digitGroupCount = (stringified.split(/(\\d+)/).length - 1) / 2;\n if (digitGroupCount === 1) {\n // if there's just a single set of digits, assume it's a year\n const dateObj = new Date(0, 0); // start at January 1, 1900\n dateObj.setFullYear(Number(stringified)); // override year\n return dateObj.getTime(); // get time in milliseconds\n }\n return dayjs(stringified, [this.dateFormat, DATE_FORMAT]).valueOf();\n }\n\n /**\n * expand or narrow the selected range by moving the slider nearest the\n * clicked bar to the outer edge of the clicked bar\n *\n * @param e Event click event from a histogram bar\n */\n private handleBarClick(e: Event): void {\n const dataset = (e.currentTarget as SVGRectElement).dataset as BarDataset;\n // use the midpoint of the width of the clicked bar to determine which is\n // the nearest slider\n const clickPosition =\n (this.getMSFromString(dataset.binStart) +\n this.getMSFromString(dataset.binEnd)) /\n 2;\n const distanceFromMinSlider = Math.abs(\n clickPosition - this.getMSFromString(this.minSelectedDate)\n );\n const distanceFromMaxSlider = Math.abs(\n clickPosition - this.getMSFromString(this.maxSelectedDate)\n );\n // update the selected range by moving the nearer slider\n if (distanceFromMinSlider < distanceFromMaxSlider) {\n this.minSelectedDate = dataset.binStart;\n } else {\n this.maxSelectedDate = dataset.binEnd;\n }\n this.beginEmitUpdateProcess();\n }\n\n private get minSliderTemplate(): SVGTemplateResult {\n // width/height in pixels of curved part of the sliders (like\n // border-radius); used as part of a SVG quadratic curve. see\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#curve_commands\n const cs = SLIDER_CORNER_SIZE;\n\n const sliderShape = `\n M${this.minSliderX},0\n h-${this.sliderWidth - cs}\n q-${cs},0 -${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} ${cs},${cs}\n h${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.minSliderX, 'slider-min', sliderShape);\n }\n\n private get maxSliderTemplate(): SVGTemplateResult {\n const cs = SLIDER_CORNER_SIZE;\n const sliderShape = `\n M${this.maxSliderX},0\n h${this.sliderWidth - cs}\n q${cs},0 ${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} -${cs},${cs}\n h-${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.maxSliderX, 'slider-max', sliderShape);\n }\n\n private generateSliderSVG(\n sliderPositionX: number,\n id: SliderId,\n sliderShape: string\n ): SVGTemplateResult {\n // whether the curved part of the slider is facing towards the left (1), ie\n // minimum, or facing towards the right (-1), ie maximum\n const k = id === 'slider-min' ? 1 : -1;\n\n const sliderClasses = classMap({\n slider: true,\n draggable: !this.disabled,\n dragging: this._isDragging,\n });\n\n return svg`\n <svg\n id=${id}\n class=${sliderClasses}\n @pointerdown=${this.drag}\n >\n <path d=\"${sliderShape} z\" fill=\"${sliderColor}\" />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.4 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.6 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n </svg>\n `;\n }\n\n get selectedRangeTemplate(): SVGTemplateResult {\n return svg`\n <rect\n x=\"${this.minSliderX}\"\n y=\"0\"\n width=\"${this.maxSliderX - this.minSliderX}\"\n height=\"${this.height}\"\n fill=\"${selectedRangeColor}\"\n />`;\n }\n\n get histogramTemplate(): SVGTemplateResult[] {\n const xScale = this._histWidth / this._numBins;\n const barWidth = xScale - 1;\n let x = this.sliderWidth; // start at the left edge of the histogram\n\n return this._histData.map(data => {\n const { minSelectedDate, maxSelectedDate } = this;\n const barHeight = data.height;\n\n const binIsBeforeMin = this.isBefore(data.binEnd, minSelectedDate);\n const binIsAfterMax = this.isAfter(data.binStart, maxSelectedDate);\n const barFill =\n binIsBeforeMin || binIsAfterMax ? barExcludedFill : barIncludedFill;\n\n // the stroke-dasharray style below creates a transparent border around the\n // right edge of the bar, which prevents user from encountering a gap\n // between adjacent bars (eg when viewing the tooltips or when trying to\n // extend the range by clicking on a bar)\n const barStyle = `stroke-dasharray: 0 ${barWidth} ${barHeight} ${barWidth} 0 ${barHeight}`;\n\n const bar = svg`\n <rect\n class=\"bar-pointer-target\"\n x=${x}\n y=\"0\"\n width=${barWidth}\n height=${this.height}\n @pointerenter=${this.showTooltip}\n @pointerleave=${this.hideTooltip}\n @click=${this.handleBarClick}\n fill=\"transparent\"\n data-num-items=${data.value}\n data-bin-start=${data.binStart}\n data-bin-end=${data.binEnd}\n data-tooltip=${data.tooltip}\n />\n <rect\n class=\"bar\"\n style=${barStyle}\n x=${x}\n y=${this.height - barHeight}\n width=${barWidth}\n height=${barHeight}\n fill=${barFill}\n />`;\n x += xScale;\n return bar;\n });\n }\n\n /** Whether the first arg represents a date strictly before the second arg */\n private isBefore(date1: string, date2: string): boolean {\n const date1MS = this.getMSFromString(date1);\n const date2MS = this.getMSFromString(date2);\n return date1MS < date2MS;\n }\n\n /** Whether the first arg represents a date strictly after the second arg */\n private isAfter(date1: string, date2: string): boolean {\n const date1MS = this.getMSFromString(date1);\n const date2MS = this.getMSFromString(date2);\n return date1MS > date2MS;\n }\n\n private formatDate(dateMS: number, format: string = this.dateFormat): string {\n if (Number.isNaN(dateMS)) {\n return '';\n }\n const date = dayjs(dateMS);\n if (date.year() < 1000) {\n // years before 1000 don't play well with dayjs custom formatting, so work around dayjs\n // by setting the year to a sentinel value and then replacing it instead.\n // this is a bit hacky but it does the trick for essentially all reasonable cases\n // until such time as we replace dayjs.\n const tmpDate = date.year(199999);\n return tmpDate.format(format).replace(/199999/g, date.year().toString());\n }\n return date.format(format);\n }\n\n /**\n * NOTE: we are relying on the lit `live` directive in the template to\n * ensure that the change to minSelectedDate is noticed and the input value\n * gets properly re-rendered. see\n * https://lit.dev/docs/templates/directives/#live\n */\n get minInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-min\"\n placeholder=${this.dateFormat}\n type=\"text\"\n @focus=${this.handleInputFocus}\n @blur=${this.handleMinDateInput}\n @keyup=${this.handleKeyUp}\n .value=${live(this.minSelectedDate)}\n ?disabled=${this.disabled}\n />\n `;\n }\n\n get maxInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-max\"\n placeholder=${this.dateFormat}\n type=\"text\"\n @focus=${this.handleInputFocus}\n @blur=${this.handleMaxDateInput}\n @keyup=${this.handleKeyUp}\n .value=${live(this.maxSelectedDate)}\n ?disabled=${this.disabled}\n />\n `;\n }\n\n get minLabelTemplate(): TemplateResult {\n return html`<label for=\"date-min\" class=\"sr-only\">Minimum date:</label>`;\n }\n\n get maxLabelTemplate(): TemplateResult {\n return html`<label for=\"date-max\" class=\"sr-only\">Maximum date:</label>`;\n }\n\n get tooltipTemplate(): TemplateResult {\n const styles = styleMap({\n width: `${this.tooltipWidth}px`,\n height: `${this.tooltipHeight}px`,\n top: `${this._tooltipOffsetY}px`,\n left: `${this._tooltipOffsetX}px`,\n });\n\n return html`\n <div id=\"tooltip\" style=${styles} popover>${this._tooltipContent}</div>\n `;\n }\n\n private get histogramAccessibilityTemplate(): TemplateResult {\n let rangeText: string = '';\n if (this.minSelectedDate && this.maxSelectedDate) {\n rangeText = ` from ${this.minSelectedDate} to ${this.maxSelectedDate}`;\n } else if (this.minSelectedDate) {\n rangeText = ` from ${this.minSelectedDate}`;\n } else if (this.maxSelectedDate) {\n rangeText = ` up to ${this.maxSelectedDate}`;\n }\n\n const titleText = `Filter results for dates${rangeText}`;\n const descText = `This histogram shows the distribution of dates${rangeText}`;\n\n return html`<title id=\"histogram-title\">${titleText}</title\n ><desc id=\"histogram-desc\">${descText}</desc>`;\n }\n\n private get noDataTemplate(): TemplateResult {\n return html`\n <div class=\"missing-data-message\">${this.missingDataMessage}</div>\n `;\n }\n\n private get activityIndicatorTemplate(): TemplateResult | typeof nothing {\n if (!this.loading) {\n return nothing;\n }\n return html`\n <ia-activity-indicator mode=\"processing\"> </ia-activity-indicator>\n `;\n }\n\n static styles = css`\n .missing-data-message {\n text-align: center;\n }\n #container {\n margin: 0;\n touch-action: none;\n position: relative;\n }\n .disabled {\n opacity: 0.3;\n }\n ia-activity-indicator {\n position: absolute;\n left: calc(50% - 10px);\n top: 10px;\n width: 20px;\n height: 20px;\n --activityIndicatorLoadingDotColor: rgba(0, 0, 0, 0);\n --activityIndicatorLoadingRingColor: ${activityIndicatorColor};\n }\n\n /* prevent selection from interfering with tooltip, especially on mobile */\n /* https://stackoverflow.com/a/4407335/1163042 */\n .noselect {\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Safari */\n -moz-user-select: none; /* Old versions of Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none; /* current Chrome, Edge, Opera and Firefox */\n }\n .bar,\n .bar-pointer-target {\n /* create a transparent border around the hist bars to prevent \"gaps\" and\n flickering when moving around between bars. this also helps with handling\n clicks on the bars, preventing users from being able to click in between\n bars */\n stroke: rgba(0, 0, 0, 0);\n /* ensure transparent stroke wide enough to cover gap between bars */\n stroke-width: 2px;\n }\n .bar {\n /* ensure the bar's pointer target receives events, not the bar itself */\n pointer-events: none;\n }\n .bar-pointer-target:hover + .bar {\n /* highlight currently hovered bar */\n fill-opacity: 0.7;\n }\n .disabled .bar-pointer-target:hover + .bar {\n /* ensure no visual hover interaction when disabled */\n fill-opacity: 1;\n }\n /****** histogram ********/\n #tooltip {\n position: absolute;\n background: ${tooltipBackgroundColor};\n margin: 0;\n border: 0;\n color: ${tooltipTextColor};\n text-align: center;\n border-radius: 3px;\n padding: 2px;\n font-size: ${tooltipFontSize};\n font-family: ${tooltipFontFamily};\n touch-action: none;\n pointer-events: none;\n overflow: visible;\n }\n #tooltip:after {\n content: '';\n position: absolute;\n margin-left: -5px;\n top: 100%;\n left: 50%;\n /* arrow */\n border: 5px solid ${tooltipTextColor};\n border-color: ${tooltipBackgroundColor} transparent transparent\n transparent;\n }\n /****** slider ********/\n .slider {\n shape-rendering: crispEdges; /* So the slider doesn't get blurry if dragged between pixels */\n }\n .draggable:hover {\n cursor: grab;\n }\n .dragging {\n cursor: grabbing !important;\n }\n /****** inputs ********/\n #inputs {\n display: flex;\n justify-content: center;\n margin: ${inputRowMargin};\n }\n #inputs .dash {\n position: relative;\n bottom: -1px;\n align-self: center; /* Otherwise the dash sticks to the top while the inputs grow */\n }\n input {\n width: ${inputWidth};\n margin: 0 3px;\n border: ${inputBorder};\n border-radius: 2px !important;\n text-align: center;\n font-size: ${inputFontSize};\n font-family: ${inputFontFamily};\n }\n .sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n margin: 0 !important;\n padding: 0 !important;\n border: 0 !important;\n overflow: hidden !important;\n white-space: nowrap !important;\n clip: rect(1px, 1px, 1px, 1px) !important;\n -webkit-clip-path: inset(50%) !important;\n clip-path: inset(50%) !important;\n }\n `;\n\n render(): TemplateResult {\n if (!this.hasBinData) {\n return this.noDataTemplate;\n }\n return html`\n <div\n id=\"container\"\n class=\"\n noselect\n ${this._isDragging ? 'dragging' : ''}\n \"\n style=\"width: ${this.width}px\"\n >\n ${this.activityIndicatorTemplate} ${this.tooltipTemplate}\n <div\n class=\"inner-container\n ${this.disabled ? 'disabled' : ''}\"\n >\n <svg\n width=\"${this.width}\"\n height=\"${this.height}\"\n aria-labelledby=\"histogram-title histogram-desc\"\n @pointerleave=\"${this.drop}\"\n >\n ${this.histogramAccessibilityTemplate} ${this.selectedRangeTemplate}\n <svg id=\"histogram\">${this.histogramTemplate}</svg>\n ${this.minSliderTemplate} ${this.maxSliderTemplate}\n </svg>\n <div id=\"inputs\">\n ${this.minLabelTemplate} ${this.minInputTemplate}\n <div class=\"dash\">-</div>\n ${this.maxLabelTemplate} ${this.maxInputTemplate}\n <slot name=\"inputs-right-side\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\n// help TypeScript provide strong typing when interacting with DOM APIs\n// https://stackoverflow.com/questions/65148695/lit-element-typescript-project-global-interface-declaration-necessary\ndeclare global {\n interface HTMLElementTagNameMap {\n 'histogram-date-range': HistogramDateRange;\n }\n}\n"]}
@@ -748,7 +748,7 @@ describe('HistogramDateRange', () => {
748
748
  </histogram-date-range>
749
749
  `);
750
750
  const svg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('svg');
751
- expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results distribution from 1900 to 2020');
751
+ expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results for dates from 1900 to 2020');
752
752
  });
753
753
  it('SVG accessbility - dynamic title for MIN date', async () => {
754
754
  var _a, _b;
@@ -757,7 +757,7 @@ describe('HistogramDateRange', () => {
757
757
  </histogram-date-range>
758
758
  `);
759
759
  const svg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('svg');
760
- expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results distribution from 1900');
760
+ expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results for dates from 1900');
761
761
  });
762
762
  it('SVG accessbility - dynamic title for MAX date', async () => {
763
763
  var _a, _b;
@@ -766,7 +766,7 @@ describe('HistogramDateRange', () => {
766
766
  </histogram-date-range>
767
767
  `);
768
768
  const svg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('svg');
769
- expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results distribution up to 2020');
769
+ expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results for dates up to 2020');
770
770
  });
771
771
  it('SVG accessbility - dynamic title for all dates', async () => {
772
772
  var _a, _b;
@@ -774,15 +774,16 @@ describe('HistogramDateRange', () => {
774
774
  <histogram-date-range .bins=${[33, 1, 100]}> </histogram-date-range>
775
775
  `);
776
776
  const svg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('svg');
777
- expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results distribution for all available dates');
777
+ expect((_b = svg.querySelector('title')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('Filter results for dates');
778
778
  });
779
779
  it('SVG accessibility - dynamic desc', async () => {
780
780
  var _a, _b;
781
781
  const el = await fixture(html `
782
- <histogram-date-range .bins=${[33, 1, 100]}> </histogram-date-range>
782
+ <histogram-date-range maxDate="2020" .bins=${[33, 1, 100]}>
783
+ </histogram-date-range>
783
784
  `);
784
785
  const svg = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('svg');
785
- expect((_b = svg.querySelector('desc')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('This chart shows the distribution of search results for all available dates. The bars represent result counts for each time period within the selected date range.');
786
+ expect((_b = svg.querySelector('desc')) === null || _b === void 0 ? void 0 : _b.textContent).to.equal('This histogram shows the distribution of dates up to 2020');
786
787
  });
787
788
  });
788
789
  //# sourceMappingURL=histogram-date-range.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"histogram-date-range.test.js","sourceRoot":"","sources":["../../test/histogram-date-range.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';\n\nimport { HistogramDateRange } from '../src/histogram-date-range';\nimport '../src/histogram-date-range';\n\nconst SLIDER_WIDTH = 10;\nconst WIDTH = 200;\n\nconst subject = html`\n <histogram-date-range\n width=\"${WIDTH}\"\n tooltipWidth=\"140\"\n height=\"50\"\n dateFormat=\"M/D/YYYY\"\n minDate=\"1900\"\n maxDate=\"12/4/2020\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n`;\n\nasync function createCustomElementInHTMLContainer(): Promise<HistogramDateRange> {\n document.head.insertAdjacentHTML(\n 'beforeend',\n `<style>\n html {\n font-size:10px;\n }\n .container {\n width: 400px;\n height: 400px;\n display: flex;\n background: #FFF6E1;\n justify-content: center;\n align-items: center;\n }\n </style>`\n );\n // https://open-wc.org/docs/testing/helpers/#customize-the-fixture-container\n const parentNode = document.createElement('div');\n parentNode.setAttribute('class', 'container');\n return fixture<HistogramDateRange>(subject, { parentNode });\n}\n\ndescribe('HistogramDateRange', () => {\n it('shows log-scaled histogram bars when provided with data', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([38, 7, 50]);\n });\n\n it('uses linear bar height scaling when specified', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.barScaling = 'linear';\n await el.updateComplete;\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([16, 0, 50]);\n });\n\n it('uses custom bar height scaling when specified', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.barScaling = (x: number) => Math.sqrt(x);\n await el.updateComplete;\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([28, 5, 50]);\n });\n\n it('changes the position of the sliders and standardizes date format when dates are entered', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n expect(el.minSliderX).to.eq(SLIDER_WIDTH);\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n const pressEnterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n });\n\n // valid min date\n minDateInput.value = '1950';\n minDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format\n\n // attempt to set date earlier than first item\n minDateInput.value = '10/1/1850';\n minDateInput.dispatchEvent(new Event('blur'));\n\n expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position\n // allow date value less than slider range\n expect(el.minSelectedDate).to.eq('10/1/1850');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // set valid max date\n maxDateInput.value = '3/12/1975';\n maxDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(maxDateInput.value).to.eq('3/12/1975');\n\n // attempt to set date later than last item\n maxDateInput.value = '12/31/2199';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position\n // allow date value greater than slider range\n expect(maxDateInput.value).to.eq('12/31/2199');\n });\n\n it('when updateWhileFocused option is true, updates are fired upon changing input focus', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateWhileFocused = true;\n await el.updateComplete;\n\n let updateEventFired = false;\n el.addEventListener(\n 'histogramDateRangeUpdated',\n () => (updateEventFired = true)\n );\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n minDateInput.focus();\n\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\n minDateInput.value = '1950';\n maxDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should have fired, setting the minSelectedDate prop & slider position accordingly\n expect(updateEventFired).to.be.true;\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950');\n\n updateEventFired = false;\n await el.updateComplete;\n\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\n maxDateInput.value = '3/12/1975';\n minDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should have fired, setting the maxSelectedDate prop & slider position accordingly\n expect(updateEventFired).to.be.true;\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(el.maxSelectedDate).to.eq('3/12/1975');\n });\n\n it('when updateWhileFocused option is false (default), updates are not fired while one of the inputs remains focused', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n let updateEventFired = false;\n el.addEventListener(\n 'histogramDateRangeUpdated',\n () => (updateEventFired = true)\n );\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n minDateInput.focus();\n\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\n minDateInput.value = '1950';\n maxDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should NOT have fired, because focus remains within the inputs\n expect(updateEventFired).to.be.false;\n\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\n maxDateInput.value = '3/12/1975';\n minDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should NOT have fired, because focus remains within the inputs\n expect(updateEventFired).to.be.false;\n });\n\n it('handles invalid date inputs', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n minDateInput.value = '5/17/1961';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101);\n expect(minDateInput.value).to.eq('5/17/1961');\n\n // enter invalid value\n minDateInput.value = 'invalid';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101); // does not move\n expect(minDateInput.value).to.eq('5/17/1961'); // resets back to previous date\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial values\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n expect(maxDateInput.value).to.eq('12/4/2020');\n\n // enter invalid value\n maxDateInput.value = 'Abc 12, 1YYY';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.maxSliderX)).to.eq(WIDTH - SLIDER_WIDTH); // does not move\n expect(maxDateInput.value).to.eq('12/4/2020'); // resets back to previous date\n });\n\n it('updates the date inputs when the sliders are moved', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const container = el.shadowRoot?.querySelector(\n '#container'\n ) as HTMLDivElement;\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108);\n expect(minSlider.classList.contains('draggable')).to.be.true;\n\n // pointer down\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor changes to 'grab'\n const classList = minSlider.classList;\n expect(classList.contains('draggable')).to.be.true;\n expect(classList.contains('dragging')).to.be.true;\n\n // slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 60 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(168);\n // min date is updated\n expect(minDateInput.value).to.eq('4/23/1940');\n\n // stop dragging\n window.dispatchEvent(new PointerEvent('pointerup'));\n await el.updateComplete;\n\n // cursor returns to normal\n expect(Array.from(container.classList)).not.to.include('dragging');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(maxSlider.getBoundingClientRect().x).to.eq(298);\n\n // slide to left\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 165 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268);\n // max date is updated\n expect(maxDateInput.value).to.eq('10/8/2000');\n await el.updateComplete;\n\n // try to slide min slider past max slider\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 62 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 190 }));\n await el.updateComplete;\n\n // slider moves all the way to meet the right slider\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(258);\n\n // try to slide max slider past min slider\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 50 }));\n await el.updateComplete;\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268); // max slider didn't move\n\n // try to slide max slider off the right edge\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 300 }));\n await el.updateComplete;\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // back to its initial position\n expect(el.maxSelectedDate).to.equal('12/4/2020');\n });\n\n it('does not permit sliders to select dates outside the allowed range', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.binSnapping = 'month';\n el.dateFormat = 'YYYY-MM';\n el.minDate = '2020-01';\n el.maxDate = '2021-12';\n el.minSelectedDate = '2020-01';\n el.maxSelectedDate = '2021-12';\n el.bins = [10, 20, 30, 40, 50, 60, 70, 80];\n await el.updateComplete;\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108, 'initial');\n expect(maxSlider.getBoundingClientRect().x).to.eq(298, 'initial');\n expect(minDateInput.value).to.eq('2020-01', 'initial');\n expect(maxDateInput.value).to.eq('2021-12', 'initial');\n\n // try dragging the min slider too far to the left\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 0 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: -50 }));\n await el.updateComplete;\n expect(minSlider.getBoundingClientRect().x).to.eq(108); // slider didn't move\n expect(minDateInput.value).to.eq('2020-01'); // value unchanged\n\n // try dragging the max slider too far to the right\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 250 }));\n await el.updateComplete;\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // slider didn't move\n expect(maxDateInput.value).to.eq('2021-12'); // value unchanged\n });\n\n it(\"emits a custom event when the element's date range changes\", async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateDelay = 30; // set debounce delay of 30ms\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');\n\n // simulate typing a new value into input\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n\n // will wait longer than debounce delay\n const { detail } = await updateEventPromise;\n // verify that event is emitted\n expect(detail.minDate).to.equal('1/1/1955');\n expect(detail.maxDate).to.equal('12/4/2020');\n\n let eventCount = 0;\n el.addEventListener('histogramDateRangeUpdated', () => (eventCount += 1));\n\n // events are not sent if no change since the last event that was sent\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(60); // wait longer than debounce delay\n expect(eventCount).to.equal(0);\n\n const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');\n\n // with the debounce, multiple quick changes only result in one event sent\n minDateInput.value = '1965';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10); // wait less than the debounce delay\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1975';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1985';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n const event2 = await updateEventPromise2;\n expect(event2.detail.minDate).to.equal('1/1/1985');\n expect(eventCount).to.equal(1); // only one event was fired\n });\n\n it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {\n const el = await createCustomElementInHTMLContainer();\n // include a number which will require commas (1,000,000)\n el.bins = [1000000, 1, 100];\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 items\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 item\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('uses provided tooltip label', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.bins = [1000000, 1, 100];\n el.tooltipLabel = 'foobar';\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 foobars\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 foobar\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('does not show tooltip while dragging', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n // pointer down and slide right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 100 }));\n await el.updateComplete;\n\n // hover over bar\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n // tooltip display is suppressed while dragging\n expect(tooltip.style.display).to.eq('');\n });\n\n it('passes the a11y audit', async () => {\n await fixture<HistogramDateRange>(subject).then(el =>\n expect(el).shadowDom.to.be.accessible()\n );\n });\n\n it('allows range to be pre-selected', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"Dec 4, 2020\"\n minSelectedDate=\"2012\"\n maxSelectedDate=\"2019\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('extends the selected range when the histogram is clicked outside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1950\"\n maxSelectedDate=\"1955\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[1]; // click on second bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n await el.updateComplete;\n expect(el.minSelectedDate).to.eq('1910'); // range was extended to left\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right\n });\n\n it('narrows the selected range when the histogram is clicked inside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1900\"\n maxSelectedDate=\"2020\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n ///////////////////////////////////////////////\n // NB: the slider nearest the clicked bar moves\n ///////////////////////////////////////////////\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[3]; // click on fourth bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n expect(el.minSelectedDate).to.eq('1932'); // range was extended to the right\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to the left\n });\n\n it('handles invalid pre-selected range by defaulting to overall max and min', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"2000xyz\"\n maxSelectedDate=\"5000\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n // malformed min date defaults to overall min\n expect(minDateInput.value).to.eq('1900');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n // well-formed max date is allowed\n expect(maxDateInput.value).to.eq('5000');\n });\n\n it('handles year values less than 1000 correctly', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n dateFormat=\"M/D/YYYY\"\n minDate=\"-2000\"\n maxDate=\"2000\"\n minSelectedDate=\"-500\"\n maxSelectedDate=\"500\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('1/1/-500');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('1/1/500');\n });\n\n it('handles missing data', async () => {\n let el = await fixture<HistogramDateRange>(\n html`<histogram-date-range>\n minDate=\"1900\" maxDate=\"2020\" bins=\"\"\n </histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data');\n el = await fixture<HistogramDateRange>(\n html`<histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n bins=\"[]\"\n missingDataMessage=\"no data available\"\n ></histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data available');\n });\n\n it('correctly displays data consisting of a single bin', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range minDate=\"2020\" maxDate=\"2020\" bins=\"[50]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n expect(heights).to.eql([157]);\n });\n\n it('correctly displays small diff between max and min values', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range bins=\"[1519,2643,1880,2041,1638,1441]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n expect(heights).to.eql([37, 40, 38, 38, 37, 36]);\n });\n\n it('correctly aligns bins to exact month boundaries when binSnapping=month', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"month\"\n dateFormat=\"YYYY-MM\"\n tooltipDateFormat=\"MMM YYYY\"\n minDate=\"2020-01\"\n maxDate=\"2021-12\"\n bins=\"[10,20,30,40,50,60,70,80]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'Jan 2020 - Mar 2020',\n 'Apr 2020 - Jun 2020',\n 'Jul 2020 - Sep 2020',\n 'Oct 2020 - Dec 2020',\n 'Jan 2021 - Mar 2021',\n 'Apr 2021 - Jun 2021',\n 'Jul 2021 - Sep 2021',\n 'Oct 2021 - Dec 2021',\n ]);\n });\n\n it('correctly handles month snapping for years 0-99', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"month\"\n dateFormat=\"YYYY-MM\"\n tooltipDateFormat=\"MMM YYYY\"\n minDate=\"0050-01\"\n maxDate=\"0065-12\"\n bins=\"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'Jan 50 - Jun 50',\n 'Jul 50 - Dec 50',\n 'Jan 51 - Jun 51',\n 'Jul 51 - Dec 51',\n 'Jan 52 - Jun 52',\n 'Jul 52 - Dec 52',\n 'Jan 53 - Jun 53',\n 'Jul 53 - Dec 53',\n 'Jan 54 - Jun 54',\n 'Jul 54 - Dec 54',\n 'Jan 55 - Jun 55',\n 'Jul 55 - Dec 55',\n 'Jan 56 - Jun 56',\n 'Jul 56 - Dec 56',\n 'Jan 57 - Jun 57',\n 'Jul 57 - Dec 57',\n 'Jan 58 - Jun 58',\n 'Jul 58 - Dec 58',\n 'Jan 59 - Jun 59',\n 'Jul 59 - Dec 59',\n 'Jan 60 - Jun 60',\n 'Jul 60 - Dec 60',\n 'Jan 61 - Jun 61',\n 'Jul 61 - Dec 61',\n 'Jan 62 - Jun 62',\n 'Jul 62 - Dec 62',\n 'Jan 63 - Jun 63',\n 'Jul 63 - Dec 63',\n 'Jan 64 - Jun 64',\n 'Jul 64 - Dec 64',\n 'Jan 65 - Jun 65',\n 'Jul 65 - Dec 65',\n ]);\n });\n\n it('correctly aligns bins to exact year boundaries when binSnapping=year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n minDate=\"2000\"\n maxDate=\"2019\"\n bins=\"[10,20,30,40,50,60,70,80,90,100]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n '2000 - 2001',\n '2002 - 2003',\n '2004 - 2005',\n '2006 - 2007',\n '2008 - 2009',\n '2010 - 2011',\n '2012 - 2013',\n '2014 - 2015',\n '2016 - 2017',\n '2018 - 2019',\n ]);\n });\n\n it('correctly handles year snapping for years 0-99', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n dateFormat=\"YYYY\"\n minDate=\"0020\"\n maxDate=\"0025\"\n bins=\"[1,2,3,4,5,6]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['20', '21', '22', '23', '24', '25']);\n });\n\n it('does not duplicate start/end date in tooltips when representing a single year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n dateFormat=\"YYYY\"\n minDate=\"2001\"\n maxDate=\"2005\"\n bins=\"[10,20,30,40,50]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']);\n });\n\n it('falls back to default date format for tooltips if no tooltip date format provided', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n minDate=\"2001\"\n maxDate=\"2005\"\n bins=\"[10,20,30,40,50]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n let tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']); // default YYYY date format\n\n el.dateFormat = 'YYYY/MM';\n el.minDate = '2001/01';\n el.maxDate = '2005/01';\n await el.updateComplete;\n\n // Should use dateFormat fallback for tooltips\n tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n '2001/01 - 2001/12',\n '2002/01 - 2002/12',\n '2003/01 - 2003/12',\n '2004/01 - 2004/12',\n '2005/01 - 2005/12',\n ]);\n\n el.dateFormat = 'YYYY';\n el.tooltipDateFormat = 'MMMM YYYY';\n el.minDate = '2001';\n el.maxDate = '2005';\n await el.updateComplete;\n\n // Should use defined tooltipDateFormat for tooltips\n tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'January 2001 - December 2001',\n 'January 2002 - December 2002',\n 'January 2003 - December 2003',\n 'January 2004 - December 2004',\n 'January 2005 - December 2005',\n ]);\n });\n\n it('has a disabled state', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n disabled\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('.inner-container')\n ?.classList.contains('disabled')\n ).to.eq(true);\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8); // initial state\n\n // attempt to slide to right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor is not draggable if disabled\n expect(minSlider.classList.contains('draggable')).to.be.false;\n\n // attempt to slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider does not moved if element disabled\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8);\n });\n\n it('has a loading state with an activity indicator', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n loading\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('ia-activity-indicator')\n ?.attributes?.getNamedItem('mode')?.value\n ).to.eq('processing');\n });\n\n it('can use LitElement bound properties', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n .minDate=${1900}\n .maxDate=${'Dec 4, 2020'}\n .minSelectedDate=${2012}\n .maxSelectedDate=${2019}\n .bins=${[33, 1, 100]}\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('SVG accessbility - dynamic title for MIN and MAX date', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n .bins=${[33, 1, 100]}\n >\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results distribution from 1900 to 2020'\n );\n });\n\n it('SVG accessbility - dynamic title for MIN date', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range minDate=\"1900\" .bins=${[33, 1, 100]}>\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results distribution from 1900'\n );\n });\n\n it('SVG accessbility - dynamic title for MAX date', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range maxDate=\"2020\" .bins=${[33, 1, 100]}>\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results distribution up to 2020'\n );\n });\n\n it('SVG accessbility - dynamic title for all dates', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range .bins=${[33, 1, 100]}> </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results distribution for all available dates'\n );\n });\n\n it('SVG accessibility - dynamic desc', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range .bins=${[33, 1, 100]}> </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('desc')?.textContent).to.equal(\n 'This chart shows the distribution of search results for all available dates. The bars represent result counts for each time period within the selected date range.'\n );\n });\n});\n"]}
1
+ {"version":3,"file":"histogram-date-range.test.js","sourceRoot":"","sources":["../../test/histogram-date-range.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';\n\nimport { HistogramDateRange } from '../src/histogram-date-range';\nimport '../src/histogram-date-range';\n\nconst SLIDER_WIDTH = 10;\nconst WIDTH = 200;\n\nconst subject = html`\n <histogram-date-range\n width=\"${WIDTH}\"\n tooltipWidth=\"140\"\n height=\"50\"\n dateFormat=\"M/D/YYYY\"\n minDate=\"1900\"\n maxDate=\"12/4/2020\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n`;\n\nasync function createCustomElementInHTMLContainer(): Promise<HistogramDateRange> {\n document.head.insertAdjacentHTML(\n 'beforeend',\n `<style>\n html {\n font-size:10px;\n }\n .container {\n width: 400px;\n height: 400px;\n display: flex;\n background: #FFF6E1;\n justify-content: center;\n align-items: center;\n }\n </style>`\n );\n // https://open-wc.org/docs/testing/helpers/#customize-the-fixture-container\n const parentNode = document.createElement('div');\n parentNode.setAttribute('class', 'container');\n return fixture<HistogramDateRange>(subject, { parentNode });\n}\n\ndescribe('HistogramDateRange', () => {\n it('shows log-scaled histogram bars when provided with data', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([38, 7, 50]);\n });\n\n it('uses linear bar height scaling when specified', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.barScaling = 'linear';\n await el.updateComplete;\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([16, 0, 50]);\n });\n\n it('uses custom bar height scaling when specified', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.barScaling = (x: number) => Math.sqrt(x);\n await el.updateComplete;\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n\n expect(heights).to.eql([28, 5, 50]);\n });\n\n it('changes the position of the sliders and standardizes date format when dates are entered', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n expect(el.minSliderX).to.eq(SLIDER_WIDTH);\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n const pressEnterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n });\n\n // valid min date\n minDateInput.value = '1950';\n minDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format\n\n // attempt to set date earlier than first item\n minDateInput.value = '10/1/1850';\n minDateInput.dispatchEvent(new Event('blur'));\n\n expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position\n // allow date value less than slider range\n expect(el.minSelectedDate).to.eq('10/1/1850');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // set valid max date\n maxDateInput.value = '3/12/1975';\n maxDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(maxDateInput.value).to.eq('3/12/1975');\n\n // attempt to set date later than last item\n maxDateInput.value = '12/31/2199';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position\n // allow date value greater than slider range\n expect(maxDateInput.value).to.eq('12/31/2199');\n });\n\n it('when updateWhileFocused option is true, updates are fired upon changing input focus', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateWhileFocused = true;\n await el.updateComplete;\n\n let updateEventFired = false;\n el.addEventListener(\n 'histogramDateRangeUpdated',\n () => (updateEventFired = true)\n );\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n minDateInput.focus();\n\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\n minDateInput.value = '1950';\n maxDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should have fired, setting the minSelectedDate prop & slider position accordingly\n expect(updateEventFired).to.be.true;\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950');\n\n updateEventFired = false;\n await el.updateComplete;\n\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\n maxDateInput.value = '3/12/1975';\n minDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should have fired, setting the maxSelectedDate prop & slider position accordingly\n expect(updateEventFired).to.be.true;\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(el.maxSelectedDate).to.eq('3/12/1975');\n });\n\n it('when updateWhileFocused option is false (default), updates are not fired while one of the inputs remains focused', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n let updateEventFired = false;\n el.addEventListener(\n 'histogramDateRangeUpdated',\n () => (updateEventFired = true)\n );\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n minDateInput.focus();\n\n // set valid min date, but don't hit Enter -- just switch focus to the max date input\n minDateInput.value = '1950';\n maxDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should NOT have fired, because focus remains within the inputs\n expect(updateEventFired).to.be.false;\n\n // set valid max date, but don't hit Enter -- just switch focus to the min date input\n maxDateInput.value = '3/12/1975';\n minDateInput.focus();\n await el.updateComplete;\n await aTimeout(0);\n\n // update event should NOT have fired, because focus remains within the inputs\n expect(updateEventFired).to.be.false;\n });\n\n it('handles invalid date inputs', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n minDateInput.value = '5/17/1961';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101);\n expect(minDateInput.value).to.eq('5/17/1961');\n\n // enter invalid value\n minDateInput.value = 'invalid';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101); // does not move\n expect(minDateInput.value).to.eq('5/17/1961'); // resets back to previous date\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial values\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n expect(maxDateInput.value).to.eq('12/4/2020');\n\n // enter invalid value\n maxDateInput.value = 'Abc 12, 1YYY';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.maxSliderX)).to.eq(WIDTH - SLIDER_WIDTH); // does not move\n expect(maxDateInput.value).to.eq('12/4/2020'); // resets back to previous date\n });\n\n it('updates the date inputs when the sliders are moved', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const container = el.shadowRoot?.querySelector(\n '#container'\n ) as HTMLDivElement;\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108);\n expect(minSlider.classList.contains('draggable')).to.be.true;\n\n // pointer down\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor changes to 'grab'\n const classList = minSlider.classList;\n expect(classList.contains('draggable')).to.be.true;\n expect(classList.contains('dragging')).to.be.true;\n\n // slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 60 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(168);\n // min date is updated\n expect(minDateInput.value).to.eq('4/23/1940');\n\n // stop dragging\n window.dispatchEvent(new PointerEvent('pointerup'));\n await el.updateComplete;\n\n // cursor returns to normal\n expect(Array.from(container.classList)).not.to.include('dragging');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(maxSlider.getBoundingClientRect().x).to.eq(298);\n\n // slide to left\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 165 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268);\n // max date is updated\n expect(maxDateInput.value).to.eq('10/8/2000');\n await el.updateComplete;\n\n // try to slide min slider past max slider\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 62 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 190 }));\n await el.updateComplete;\n\n // slider moves all the way to meet the right slider\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(258);\n\n // try to slide max slider past min slider\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 50 }));\n await el.updateComplete;\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268); // max slider didn't move\n\n // try to slide max slider off the right edge\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 300 }));\n await el.updateComplete;\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // back to its initial position\n expect(el.maxSelectedDate).to.equal('12/4/2020');\n });\n\n it('does not permit sliders to select dates outside the allowed range', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.binSnapping = 'month';\n el.dateFormat = 'YYYY-MM';\n el.minDate = '2020-01';\n el.maxDate = '2021-12';\n el.minSelectedDate = '2020-01';\n el.maxSelectedDate = '2021-12';\n el.bins = [10, 20, 30, 40, 50, 60, 70, 80];\n await el.updateComplete;\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108, 'initial');\n expect(maxSlider.getBoundingClientRect().x).to.eq(298, 'initial');\n expect(minDateInput.value).to.eq('2020-01', 'initial');\n expect(maxDateInput.value).to.eq('2021-12', 'initial');\n\n // try dragging the min slider too far to the left\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 0 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: -50 }));\n await el.updateComplete;\n expect(minSlider.getBoundingClientRect().x).to.eq(108); // slider didn't move\n expect(minDateInput.value).to.eq('2020-01'); // value unchanged\n\n // try dragging the max slider too far to the right\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 250 }));\n await el.updateComplete;\n expect(maxSlider.getBoundingClientRect().x).to.eq(298); // slider didn't move\n expect(maxDateInput.value).to.eq('2021-12'); // value unchanged\n });\n\n it(\"emits a custom event when the element's date range changes\", async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateDelay = 30; // set debounce delay of 30ms\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');\n\n // simulate typing a new value into input\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n\n // will wait longer than debounce delay\n const { detail } = await updateEventPromise;\n // verify that event is emitted\n expect(detail.minDate).to.equal('1/1/1955');\n expect(detail.maxDate).to.equal('12/4/2020');\n\n let eventCount = 0;\n el.addEventListener('histogramDateRangeUpdated', () => (eventCount += 1));\n\n // events are not sent if no change since the last event that was sent\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(60); // wait longer than debounce delay\n expect(eventCount).to.equal(0);\n\n const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');\n\n // with the debounce, multiple quick changes only result in one event sent\n minDateInput.value = '1965';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10); // wait less than the debounce delay\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1975';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1985';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n const event2 = await updateEventPromise2;\n expect(event2.detail.minDate).to.equal('1/1/1985');\n expect(eventCount).to.equal(1); // only one event was fired\n });\n\n it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {\n const el = await createCustomElementInHTMLContainer();\n // include a number which will require commas (1,000,000)\n el.bins = [1000000, 1, 100];\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 items\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 item\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('uses provided tooltip label', async () => {\n const el = await createCustomElementInHTMLContainer();\n el.bins = [1000000, 1, 100];\n el.tooltipLabel = 'foobar';\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 foobars\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 foobar\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('does not show tooltip while dragging', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n // pointer down and slide right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 100 }));\n await el.updateComplete;\n\n // hover over bar\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n // tooltip display is suppressed while dragging\n expect(tooltip.style.display).to.eq('');\n });\n\n it('passes the a11y audit', async () => {\n await fixture<HistogramDateRange>(subject).then(el =>\n expect(el).shadowDom.to.be.accessible()\n );\n });\n\n it('allows range to be pre-selected', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"Dec 4, 2020\"\n minSelectedDate=\"2012\"\n maxSelectedDate=\"2019\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('extends the selected range when the histogram is clicked outside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1950\"\n maxSelectedDate=\"1955\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[1]; // click on second bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n await el.updateComplete;\n expect(el.minSelectedDate).to.eq('1910'); // range was extended to left\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right\n });\n\n it('narrows the selected range when the histogram is clicked inside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1900\"\n maxSelectedDate=\"2020\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n ///////////////////////////////////////////////\n // NB: the slider nearest the clicked bar moves\n ///////////////////////////////////////////////\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[3]; // click on fourth bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n expect(el.minSelectedDate).to.eq('1932'); // range was extended to the right\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar-pointer-target') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to the left\n });\n\n it('handles invalid pre-selected range by defaulting to overall max and min', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"2000xyz\"\n maxSelectedDate=\"5000\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n // malformed min date defaults to overall min\n expect(minDateInput.value).to.eq('1900');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n // well-formed max date is allowed\n expect(maxDateInput.value).to.eq('5000');\n });\n\n it('handles year values less than 1000 correctly', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n dateFormat=\"M/D/YYYY\"\n minDate=\"-2000\"\n maxDate=\"2000\"\n minSelectedDate=\"-500\"\n maxSelectedDate=\"500\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('1/1/-500');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('1/1/500');\n });\n\n it('handles missing data', async () => {\n let el = await fixture<HistogramDateRange>(\n html`<histogram-date-range>\n minDate=\"1900\" maxDate=\"2020\" bins=\"\"\n </histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data');\n el = await fixture<HistogramDateRange>(\n html`<histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n bins=\"[]\"\n missingDataMessage=\"no data available\"\n ></histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data available');\n });\n\n it('correctly displays data consisting of a single bin', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range minDate=\"2020\" maxDate=\"2020\" bins=\"[50]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n expect(heights).to.eql([157]);\n });\n\n it('correctly displays small diff between max and min values', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range bins=\"[1519,2643,1880,2041,1638,1441]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars, b => b.height.baseVal.value);\n expect(heights).to.eql([37, 40, 38, 38, 37, 36]);\n });\n\n it('correctly aligns bins to exact month boundaries when binSnapping=month', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"month\"\n dateFormat=\"YYYY-MM\"\n tooltipDateFormat=\"MMM YYYY\"\n minDate=\"2020-01\"\n maxDate=\"2021-12\"\n bins=\"[10,20,30,40,50,60,70,80]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'Jan 2020 - Mar 2020',\n 'Apr 2020 - Jun 2020',\n 'Jul 2020 - Sep 2020',\n 'Oct 2020 - Dec 2020',\n 'Jan 2021 - Mar 2021',\n 'Apr 2021 - Jun 2021',\n 'Jul 2021 - Sep 2021',\n 'Oct 2021 - Dec 2021',\n ]);\n });\n\n it('correctly handles month snapping for years 0-99', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"month\"\n dateFormat=\"YYYY-MM\"\n tooltipDateFormat=\"MMM YYYY\"\n minDate=\"0050-01\"\n maxDate=\"0065-12\"\n bins=\"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'Jan 50 - Jun 50',\n 'Jul 50 - Dec 50',\n 'Jan 51 - Jun 51',\n 'Jul 51 - Dec 51',\n 'Jan 52 - Jun 52',\n 'Jul 52 - Dec 52',\n 'Jan 53 - Jun 53',\n 'Jul 53 - Dec 53',\n 'Jan 54 - Jun 54',\n 'Jul 54 - Dec 54',\n 'Jan 55 - Jun 55',\n 'Jul 55 - Dec 55',\n 'Jan 56 - Jun 56',\n 'Jul 56 - Dec 56',\n 'Jan 57 - Jun 57',\n 'Jul 57 - Dec 57',\n 'Jan 58 - Jun 58',\n 'Jul 58 - Dec 58',\n 'Jan 59 - Jun 59',\n 'Jul 59 - Dec 59',\n 'Jan 60 - Jun 60',\n 'Jul 60 - Dec 60',\n 'Jan 61 - Jun 61',\n 'Jul 61 - Dec 61',\n 'Jan 62 - Jun 62',\n 'Jul 62 - Dec 62',\n 'Jan 63 - Jun 63',\n 'Jul 63 - Dec 63',\n 'Jan 64 - Jun 64',\n 'Jul 64 - Dec 64',\n 'Jan 65 - Jun 65',\n 'Jul 65 - Dec 65',\n ]);\n });\n\n it('correctly aligns bins to exact year boundaries when binSnapping=year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n minDate=\"2000\"\n maxDate=\"2019\"\n bins=\"[10,20,30,40,50,60,70,80,90,100]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n '2000 - 2001',\n '2002 - 2003',\n '2004 - 2005',\n '2006 - 2007',\n '2008 - 2009',\n '2010 - 2011',\n '2012 - 2013',\n '2014 - 2015',\n '2016 - 2017',\n '2018 - 2019',\n ]);\n });\n\n it('correctly handles year snapping for years 0-99', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n dateFormat=\"YYYY\"\n minDate=\"0020\"\n maxDate=\"0025\"\n bins=\"[1,2,3,4,5,6]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['20', '21', '22', '23', '24', '25']);\n });\n\n it('does not duplicate start/end date in tooltips when representing a single year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n dateFormat=\"YYYY\"\n minDate=\"2001\"\n maxDate=\"2005\"\n bins=\"[10,20,30,40,50]\"\n ></histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n const tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']);\n });\n\n it('falls back to default date format for tooltips if no tooltip date format provided', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n binSnapping=\"year\"\n minDate=\"2001\"\n maxDate=\"2005\"\n bins=\"[10,20,30,40,50]\"\n ></histogram-date-range>\n `\n );\n\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar-pointer-target'\n ) as unknown as SVGRectElement[];\n let tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql(['2001', '2002', '2003', '2004', '2005']); // default YYYY date format\n\n el.dateFormat = 'YYYY/MM';\n el.minDate = '2001/01';\n el.maxDate = '2005/01';\n await el.updateComplete;\n\n // Should use dateFormat fallback for tooltips\n tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n '2001/01 - 2001/12',\n '2002/01 - 2002/12',\n '2003/01 - 2003/12',\n '2004/01 - 2004/12',\n '2005/01 - 2005/12',\n ]);\n\n el.dateFormat = 'YYYY';\n el.tooltipDateFormat = 'MMMM YYYY';\n el.minDate = '2001';\n el.maxDate = '2005';\n await el.updateComplete;\n\n // Should use defined tooltipDateFormat for tooltips\n tooltips = Array.from(bars, b => b.dataset.tooltip);\n expect(tooltips).to.eql([\n 'January 2001 - December 2001',\n 'January 2002 - December 2002',\n 'January 2003 - December 2003',\n 'January 2004 - December 2004',\n 'January 2005 - December 2005',\n ]);\n });\n\n it('has a disabled state', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n disabled\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('.inner-container')\n ?.classList.contains('disabled')\n ).to.eq(true);\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8); // initial state\n\n // attempt to slide to right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor is not draggable if disabled\n expect(minSlider.classList.contains('draggable')).to.be.false;\n\n // attempt to slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider does not moved if element disabled\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8);\n });\n\n it('has a loading state with an activity indicator', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n loading\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('ia-activity-indicator')\n ?.attributes?.getNamedItem('mode')?.value\n ).to.eq('processing');\n });\n\n it('can use LitElement bound properties', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n .minDate=${1900}\n .maxDate=${'Dec 4, 2020'}\n .minSelectedDate=${2012}\n .maxSelectedDate=${2019}\n .bins=${[33, 1, 100]}\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('SVG accessbility - dynamic title for MIN and MAX date', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n .bins=${[33, 1, 100]}\n >\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results for dates from 1900 to 2020'\n );\n });\n\n it('SVG accessbility - dynamic title for MIN date', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range minDate=\"1900\" .bins=${[33, 1, 100]}>\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results for dates from 1900'\n );\n });\n\n it('SVG accessbility - dynamic title for MAX date', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range maxDate=\"2020\" .bins=${[33, 1, 100]}>\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results for dates up to 2020'\n );\n });\n\n it('SVG accessbility - dynamic title for all dates', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range .bins=${[33, 1, 100]}> </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('title')?.textContent).to.equal(\n 'Filter results for dates'\n );\n });\n\n it('SVG accessibility - dynamic desc', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range maxDate=\"2020\" .bins=${[33, 1, 100]}>\n </histogram-date-range>\n `\n );\n const svg = el.shadowRoot?.querySelector('svg') as SVGElement;\n expect(svg.querySelector('desc')?.textContent).to.equal(\n 'This histogram shows the distribution of dates up to 2020'\n );\n });\n});\n"]}
@@ -600,19 +600,17 @@ export let HistogramDateRange = class extends LitElement {
600
600
  <div id="tooltip" style=${styles} popover>${this._tooltipContent}</div>
601
601
  `;
602
602
  }
603
- get histogramAccessibility() {
604
- let rangeText;
603
+ get histogramAccessibilityTemplate() {
604
+ let rangeText = "";
605
605
  if (this.minSelectedDate && this.maxSelectedDate) {
606
- rangeText = `from ${this.minSelectedDate} to ${this.maxSelectedDate}`;
606
+ rangeText = ` from ${this.minSelectedDate} to ${this.maxSelectedDate}`;
607
607
  } else if (this.minSelectedDate) {
608
- rangeText = `from ${this.minSelectedDate}`;
608
+ rangeText = ` from ${this.minSelectedDate}`;
609
609
  } else if (this.maxSelectedDate) {
610
- rangeText = `up to ${this.maxSelectedDate}`;
611
- } else {
612
- rangeText = "for all available dates";
610
+ rangeText = ` up to ${this.maxSelectedDate}`;
613
611
  }
614
- const titleText = `Filter results distribution ${rangeText}`;
615
- const descText = `This chart shows the distribution of search results ${rangeText}. The bars represent result counts for each time period within the selected date range.`.trim();
612
+ const titleText = `Filter results for dates${rangeText}`;
613
+ const descText = `This histogram shows the distribution of dates${rangeText}`;
616
614
  return html`<title id="histogram-title">${titleText}</title
617
615
  ><desc id="histogram-desc">${descText}</desc>`;
618
616
  }
@@ -653,7 +651,7 @@ export let HistogramDateRange = class extends LitElement {
653
651
  aria-labelledby="histogram-title histogram-desc"
654
652
  @pointerleave="${this.drop}"
655
653
  >
656
- ${this.histogramAccessibility} ${this.selectedRangeTemplate}
654
+ ${this.histogramAccessibilityTemplate} ${this.selectedRangeTemplate}
657
655
  <svg id="histogram">${this.histogramTemplate}</svg>
658
656
  ${this.minSliderTemplate} ${this.maxSliderTemplate}
659
657
  </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/histogram-date-range",
3
- "version": "1.4.1-alpha1",
3
+ "version": "1.4.1",
4
4
  "description": "Internet Archive histogram date range picker",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "dist/index.js",
@@ -984,22 +984,18 @@ export class HistogramDateRange extends LitElement {
984
984
  `;
985
985
  }
986
986
 
987
- private get histogramAccessibility(): TemplateResult {
988
- let rangeText: string;
987
+ private get histogramAccessibilityTemplate(): TemplateResult {
988
+ let rangeText: string = '';
989
989
  if (this.minSelectedDate && this.maxSelectedDate) {
990
- rangeText = `from ${this.minSelectedDate} to ${this.maxSelectedDate}`;
990
+ rangeText = ` from ${this.minSelectedDate} to ${this.maxSelectedDate}`;
991
991
  } else if (this.minSelectedDate) {
992
- rangeText = `from ${this.minSelectedDate}`;
992
+ rangeText = ` from ${this.minSelectedDate}`;
993
993
  } else if (this.maxSelectedDate) {
994
- rangeText = `up to ${this.maxSelectedDate}`;
995
- } else {
996
- rangeText = 'for all available dates';
994
+ rangeText = ` up to ${this.maxSelectedDate}`;
997
995
  }
998
996
 
999
- const titleText = `Filter results distribution ${rangeText}`;
1000
-
1001
- const descText =
1002
- `This chart shows the distribution of search results ${rangeText}. The bars represent result counts for each time period within the selected date range.`.trim();
997
+ const titleText = `Filter results for dates${rangeText}`;
998
+ const descText = `This histogram shows the distribution of dates${rangeText}`;
1003
999
 
1004
1000
  return html`<title id="histogram-title">${titleText}</title
1005
1001
  ><desc id="histogram-desc">${descText}</desc>`;
@@ -1169,7 +1165,7 @@ export class HistogramDateRange extends LitElement {
1169
1165
  aria-labelledby="histogram-title histogram-desc"
1170
1166
  @pointerleave="${this.drop}"
1171
1167
  >
1172
- ${this.histogramAccessibility} ${this.selectedRangeTemplate}
1168
+ ${this.histogramAccessibilityTemplate} ${this.selectedRangeTemplate}
1173
1169
  <svg id="histogram">${this.histogramTemplate}</svg>
1174
1170
  ${this.minSliderTemplate} ${this.maxSliderTemplate}
1175
1171
  </svg>
@@ -1003,7 +1003,7 @@ describe('HistogramDateRange', () => {
1003
1003
  );
1004
1004
  const svg = el.shadowRoot?.querySelector('svg') as SVGElement;
1005
1005
  expect(svg.querySelector('title')?.textContent).to.equal(
1006
- 'Filter results distribution from 1900 to 2020'
1006
+ 'Filter results for dates from 1900 to 2020'
1007
1007
  );
1008
1008
  });
1009
1009
 
@@ -1016,7 +1016,7 @@ describe('HistogramDateRange', () => {
1016
1016
  );
1017
1017
  const svg = el.shadowRoot?.querySelector('svg') as SVGElement;
1018
1018
  expect(svg.querySelector('title')?.textContent).to.equal(
1019
- 'Filter results distribution from 1900'
1019
+ 'Filter results for dates from 1900'
1020
1020
  );
1021
1021
  });
1022
1022
 
@@ -1029,7 +1029,7 @@ describe('HistogramDateRange', () => {
1029
1029
  );
1030
1030
  const svg = el.shadowRoot?.querySelector('svg') as SVGElement;
1031
1031
  expect(svg.querySelector('title')?.textContent).to.equal(
1032
- 'Filter results distribution up to 2020'
1032
+ 'Filter results for dates up to 2020'
1033
1033
  );
1034
1034
  });
1035
1035
 
@@ -1041,19 +1041,20 @@ describe('HistogramDateRange', () => {
1041
1041
  );
1042
1042
  const svg = el.shadowRoot?.querySelector('svg') as SVGElement;
1043
1043
  expect(svg.querySelector('title')?.textContent).to.equal(
1044
- 'Filter results distribution for all available dates'
1044
+ 'Filter results for dates'
1045
1045
  );
1046
1046
  });
1047
1047
 
1048
1048
  it('SVG accessibility - dynamic desc', async () => {
1049
1049
  const el = await fixture<HistogramDateRange>(
1050
1050
  html`
1051
- <histogram-date-range .bins=${[33, 1, 100]}> </histogram-date-range>
1051
+ <histogram-date-range maxDate="2020" .bins=${[33, 1, 100]}>
1052
+ </histogram-date-range>
1052
1053
  `
1053
1054
  );
1054
1055
  const svg = el.shadowRoot?.querySelector('svg') as SVGElement;
1055
1056
  expect(svg.querySelector('desc')?.textContent).to.equal(
1056
- 'This chart shows the distribution of search results for all available dates. The bars represent result counts for each time period within the selected date range.'
1057
+ 'This histogram shows the distribution of dates up to 2020'
1057
1058
  );
1058
1059
  });
1059
1060
  });