@internetarchive/histogram-date-range 0.1.8-alpha.2 → 0.1.8-alpha.4

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.
@@ -2,10 +2,17 @@ import { __decorate } from "tslib";
2
2
  import { css, html, nothing, LitElement, svg, } from 'lit';
3
3
  import { property, state, customElement } from 'lit/decorators.js';
4
4
  import { live } from 'lit/directives/live.js';
5
- import dayjs from 'dayjs/esm/index.js';
6
- import customParseFormat from 'dayjs/esm/plugin/customParseFormat';
7
- dayjs.extend(customParseFormat);
8
5
  import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
6
+ /* eslint-disable-next-line */
7
+ /* @ts-ignore Import module -- JS, so no types */
8
+ import dayjs from 'https://esm.archive.org/dayjs@^1.10.7';
9
+ /* eslint-disable-next-line */
10
+ /* @ts-ignore Import module -- JS, so no types */
11
+ import customParseFormat from 'https://esm.archive.org/dayjs@1.9.4/esm/plugin/customParseFormat';
12
+ // NOTE: using a specific *earlier* pegged commit for the plugin ^, because esm.archive.org is has a
13
+ // problem creating later versions where the `export` of an included `utils.js` gets mangled. Eg:
14
+ // https://github.com/internetarchive/esbuild_es5/commit/ce19e8b841282c0e94d2b8e6830fd7744b2216c2#diff-4b2ed47327851d566740a30ce5f60271c059ae67eff2006bc07bb7c4fcee8b50L296
15
+ dayjs.extend(customParseFormat);
9
16
  // these values can be overridden via the component's HTML (camelCased) attributes
10
17
  const WIDTH = 180;
11
18
  const HEIGHT = 40;
@@ -91,7 +98,8 @@ let HistogramDateRange = class HistogramDateRange extends LitElement {
91
98
  * @param e PointerEvent from the slider being moved
92
99
  */
93
100
  this.move = (e) => {
94
- const newX = e.offsetX - this._dragOffset;
101
+ const histogramClientX = this.getBoundingClientRect().x;
102
+ const newX = e.clientX - histogramClientX - this._dragOffset;
95
103
  const slider = this._currentSlider;
96
104
  if (slider.id === 'slider-min') {
97
105
  this.minSelectedDate = this.translatePositionToDate(this.validMinSliderX(newX));
@@ -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 {\r\n css,\r\n html,\r\n nothing,\r\n LitElement,\r\n PropertyValues,\r\n svg,\r\n SVGTemplateResult,\r\n TemplateResult,\r\n} from 'lit';\r\nimport { property, state, customElement } from 'lit/decorators.js';\r\nimport { live } from 'lit/directives/live.js';\r\nimport dayjs from 'dayjs/esm/index.js';\r\nimport customParseFormat from 'dayjs/esm/plugin/customParseFormat';\r\ndayjs.extend(customParseFormat);\r\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\r\n\r\n// these values can be overridden via the component's HTML (camelCased) attributes\r\nconst WIDTH = 180;\r\nconst HEIGHT = 40;\r\nconst SLIDER_WIDTH = 10;\r\nconst TOOLTIP_WIDTH = 125;\r\nconst TOOLTIP_HEIGHT = 30;\r\nconst DATE_FORMAT = 'YYYY';\r\nconst MISSING_DATA = 'no data';\r\nconst UPDATE_DEBOUNCE_DELAY_MS = 0;\r\n\r\n// this constant is not set up to be overridden\r\nconst SLIDER_CORNER_SIZE = 4;\r\n\r\n// these CSS custom props can be overridden from the HTML that is invoking this component\r\nconst sliderColor = css`var(--histogramDateRangeSliderColor, #4B65FE)`;\r\nconst selectedRangeColor = css`var(--histogramDateRangeSelectedRangeColor, #DBE0FF)`;\r\nconst barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;\r\nconst activityIndicatorColor = css`var(--histogramDateRangeActivityIndicator, #2C2C2C)`;\r\nconst barExcludedFill = css`var(--histogramDateRangeBarExcludedFill, #CCCCCC)`;\r\nconst inputBorder = css`var(--histogramDateRangeInputBorder, 0.5px solid #2C2C2C)`;\r\nconst inputWidth = css`var(--histogramDateRangeInputWidth, 35px)`;\r\nconst inputFontSize = css`var(--histogramDateRangeInputFontSize, 1.2rem)`;\r\nconst inputFontFamily = css`var(--histogramDateRangeInputFontFamily, sans-serif)`;\r\nconst tooltipBackgroundColor = css`var(--histogramDateRangeTooltipBackgroundColor, #2C2C2C)`;\r\nconst tooltipTextColor = css`var(--histogramDateRangeTooltipTextColor, #FFFFFF)`;\r\nconst tooltipFontSize = css`var(--histogramDateRangeTooltipFontSize, 1.1rem)`;\r\nconst tooltipFontFamily = css`var(--histogramDateRangeTooltipFontFamily, sans-serif)`;\r\n\r\ntype SliderId = 'slider-min' | 'slider-max';\r\n\r\ninterface HistogramItem {\r\n value: number;\r\n height: number;\r\n binStart: string;\r\n binEnd: string;\r\n}\r\n\r\ninterface BarDataset extends DOMStringMap {\r\n numItems: string;\r\n binStart: string;\r\n binEnd: string;\r\n}\r\n\r\n@customElement('histogram-date-range')\r\nexport class HistogramDateRange extends LitElement {\r\n /* eslint-disable lines-between-class-members */\r\n\r\n // public reactive properties that can be set via HTML attributes\r\n @property({ type: Number }) width = WIDTH;\r\n @property({ type: Number }) height = HEIGHT;\r\n @property({ type: Number }) sliderWidth = SLIDER_WIDTH;\r\n @property({ type: Number }) tooltipWidth = TOOLTIP_WIDTH;\r\n @property({ type: Number }) tooltipHeight = TOOLTIP_HEIGHT;\r\n @property({ type: Number }) updateDelay = UPDATE_DEBOUNCE_DELAY_MS;\r\n @property({ type: String }) dateFormat = DATE_FORMAT;\r\n @property({ type: String }) missingDataMessage = MISSING_DATA;\r\n @property({ type: String }) minDate = '';\r\n @property({ type: String }) maxDate = '';\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: Object }) bins: number[] = [];\r\n\r\n // internal reactive properties not exposed as attributes\r\n @state() private _tooltipOffset = 0;\r\n @state() private _tooltipContent?: TemplateResult;\r\n @state() private _tooltipVisible = false;\r\n @state() private _isDragging = false;\r\n @state() private _isLoading = false;\r\n\r\n // non-reactive properties (changes don't auto-trigger re-rendering)\r\n private _minSelectedDate = '';\r\n private _maxSelectedDate = '';\r\n private _minDateMS = 0;\r\n private _maxDateMS = 0;\r\n private _dragOffset = 0;\r\n private _histWidth = 0;\r\n private _binWidth = 0;\r\n private _currentSlider?: SVGRectElement;\r\n private _histData: HistogramItem[] = [];\r\n private _emitUpdatedEventTimer?: ReturnType<typeof setTimeout>;\r\n private _previousDateRange = '';\r\n\r\n /* eslint-enable lines-between-class-members */\r\n\r\n disconnectedCallback(): void {\r\n this.removeListeners();\r\n super.disconnectedCallback();\r\n }\r\n\r\n updated(changedProps: PropertyValues): void {\r\n // check for changes that would affect bin data calculations\r\n if (\r\n changedProps.has('bins') ||\r\n changedProps.has('minDate') ||\r\n changedProps.has('maxDate') ||\r\n changedProps.has('minSelectedDate') ||\r\n changedProps.has('maxSelectedDate')\r\n ) {\r\n this.handleDataUpdate();\r\n }\r\n }\r\n\r\n /**\r\n * Set private properties that depend on the attribute bin data\r\n *\r\n * We're caching these values and not using getters to avoid recalculating all\r\n * of the hist data every time the user drags a slider or hovers over a bar\r\n * creating a tooltip.\r\n */\r\n private handleDataUpdate(): void {\r\n if (!this.hasBinData) {\r\n return;\r\n }\r\n this._histWidth = this.width - this.sliderWidth * 2;\r\n this._minDateMS = this.getMSFromString(this.minDate);\r\n this._maxDateMS = this.getMSFromString(this.maxDate);\r\n this._binWidth = this._histWidth / this._numBins;\r\n this._previousDateRange = this.currentDateRangeString;\r\n this._histData = this.calculateHistData();\r\n this.minSelectedDate = this.minSelectedDate\r\n ? this.minSelectedDate\r\n : this.minDate;\r\n this.maxSelectedDate = this.maxSelectedDate\r\n ? this.maxSelectedDate\r\n : this.maxDate;\r\n this.requestUpdate();\r\n }\r\n\r\n private calculateHistData(): HistogramItem[] {\r\n const minValue = Math.min(...this.bins);\r\n const maxValue = Math.max(...this.bins);\r\n // if there is no difference between the min and max values, use a range of\r\n // 1 because log scaling will fail if the range is 0\r\n const valueRange = minValue === maxValue ? 1 : Math.log1p(maxValue);\r\n const valueScale = this.height / valueRange;\r\n const dateScale = this.dateRangeMS / this._numBins;\r\n return this.bins.map((v: number, i: number) => {\r\n return {\r\n value: v,\r\n // use log scaling for the height of the bar to prevent tall bars from\r\n // making the smaller ones too small to see\r\n height: Math.floor(Math.log1p(v) * valueScale),\r\n binStart: `${this.formatDate(i * dateScale + this._minDateMS)}`,\r\n binEnd: `${this.formatDate((i + 1) * dateScale + this._minDateMS)}`,\r\n };\r\n });\r\n }\r\n\r\n private get hasBinData(): boolean {\r\n return this._numBins > 0;\r\n }\r\n\r\n private get _numBins(): number {\r\n if (!this.bins || !this.bins.length) {\r\n return 0;\r\n }\r\n return this.bins.length;\r\n }\r\n\r\n private get histogramLeftEdgeX(): number {\r\n return this.sliderWidth;\r\n }\r\n\r\n private get histogramRightEdgeX(): number {\r\n return this.width - this.sliderWidth;\r\n }\r\n\r\n /** component's loading (and disabled) state */\r\n @property({ type: Boolean }) get loading(): boolean {\r\n return this._isLoading;\r\n }\r\n\r\n set loading(value: boolean) {\r\n this.disabled = value;\r\n this._isLoading = value;\r\n }\r\n\r\n /** formatted minimum date of selected date range */\r\n @property() get minSelectedDate(): string {\r\n return this.formatDate(this.getMSFromString(this._minSelectedDate));\r\n }\r\n\r\n /** updates minSelectedDate if new date is valid */\r\n set minSelectedDate(rawDate: string) {\r\n if (!this._minSelectedDate) {\r\n // because the values needed to calculate valid max/min values are not\r\n // available during the lit init when it's populating properties from\r\n // attributes, fall back to just the raw date if nothing is already set\r\n this._minSelectedDate = rawDate;\r\n return;\r\n }\r\n const proposedDateMS = this.getMSFromString(rawDate);\r\n const isValidDate = !Number.isNaN(proposedDateMS);\r\n const isNotTooRecent =\r\n proposedDateMS <= this.getMSFromString(this.maxSelectedDate);\r\n if (isValidDate && isNotTooRecent) {\r\n this._minSelectedDate = this.formatDate(proposedDateMS);\r\n }\r\n this.requestUpdate();\r\n }\r\n\r\n /** formatted maximum date of selected date range */\r\n @property() get maxSelectedDate(): string {\r\n return this.formatDate(this.getMSFromString(this._maxSelectedDate));\r\n }\r\n\r\n /** updates maxSelectedDate if new date is valid */\r\n set maxSelectedDate(rawDate: string) {\r\n if (!this._maxSelectedDate) {\r\n // because the values needed to calculate valid max/min values are not\r\n // available during the lit init when it's populating properties from\r\n // attributes, fall back to just the raw date if nothing is already set\r\n this._maxSelectedDate = rawDate;\r\n return;\r\n }\r\n const proposedDateMS = this.getMSFromString(rawDate);\r\n const isValidDate = !Number.isNaN(proposedDateMS);\r\n const isNotTooOld =\r\n proposedDateMS >= this.getMSFromString(this.minSelectedDate);\r\n if (isValidDate && isNotTooOld) {\r\n this._maxSelectedDate = this.formatDate(proposedDateMS);\r\n }\r\n this.requestUpdate();\r\n }\r\n\r\n /** horizontal position of min date slider */\r\n get minSliderX(): number {\r\n const x = this.translateDateToPosition(this.minSelectedDate);\r\n return this.validMinSliderX(x);\r\n }\r\n\r\n /** horizontal position of max date slider */\r\n get maxSliderX(): number {\r\n const x = this.translateDateToPosition(this.maxSelectedDate);\r\n return this.validMaxSliderX(x);\r\n }\r\n\r\n private get dateRangeMS(): number {\r\n return this._maxDateMS - this._minDateMS;\r\n }\r\n\r\n private showTooltip(e: PointerEvent): void {\r\n if (this._isDragging || this.disabled) {\r\n return;\r\n }\r\n const target = e.currentTarget as SVGRectElement;\r\n const x = target.x.baseVal.value + this.sliderWidth / 2;\r\n const dataset = target.dataset as BarDataset;\r\n const itemsText = `item${dataset.numItems !== '1' ? 's' : ''}`;\r\n const formattedNumItems = Number(dataset.numItems).toLocaleString();\r\n\r\n this._tooltipOffset =\r\n x + (this._binWidth - this.sliderWidth - this.tooltipWidth) / 2;\r\n\r\n this._tooltipContent = html`\r\n ${formattedNumItems} ${itemsText}<br />\r\n ${dataset.binStart} - ${dataset.binEnd}\r\n `;\r\n this._tooltipVisible = true;\r\n }\r\n\r\n private hideTooltip(): void {\r\n this._tooltipContent = undefined;\r\n this._tooltipVisible = false;\r\n }\r\n\r\n // use arrow functions (rather than standard JS class instance methods) so\r\n // that `this` is bound to the histogramDateRange object and not the event\r\n // target. for more info see\r\n // https://lit-element.polymer-project.org/guide/events#using-this-in-event-listeners\r\n private drag = (e: PointerEvent): void => {\r\n // prevent selecting text or other ranges while dragging, especially in Safari\r\n e.preventDefault();\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.setDragOffset(e);\r\n this._isDragging = true;\r\n this.addListeners();\r\n this.cancelPendingUpdateEvent();\r\n };\r\n\r\n private drop = (): void => {\r\n if (this._isDragging) {\r\n this.removeListeners();\r\n this.beginEmitUpdateProcess();\r\n }\r\n this._isDragging = false;\r\n };\r\n\r\n /**\r\n * Adjust the date range based on slider movement\r\n *\r\n * @param e PointerEvent from the slider being moved\r\n */\r\n private move = (e: PointerEvent): void => {\r\n const newX = e.offsetX - this._dragOffset;\r\n const slider = this._currentSlider as SVGRectElement;\r\n if ((slider.id as SliderId) === 'slider-min') {\r\n this.minSelectedDate = this.translatePositionToDate(\r\n this.validMinSliderX(newX)\r\n );\r\n } else {\r\n this.maxSelectedDate = this.translatePositionToDate(\r\n this.validMaxSliderX(newX)\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Constrain a proposed value for the minimum (left) slider\r\n *\r\n * If the value is less than the leftmost valid position, then set it to the\r\n * left edge of the histogram (ie the slider width). If the value is greater\r\n * than the rightmost valid position (the position of the max slider), then\r\n * set it to the position of the max slider\r\n */\r\n private validMinSliderX(newX: number): number {\r\n // allow the left slider to go right only to the right slider, even if the\r\n // max selected date is out of range\r\n const rightLimit = Math.min(\r\n this.translateDateToPosition(this.maxSelectedDate),\r\n this.histogramRightEdgeX\r\n );\r\n newX = this.clamp(newX, this.histogramLeftEdgeX, rightLimit);\r\n const isInvalid =\r\n Number.isNaN(newX) || rightLimit < this.histogramLeftEdgeX;\r\n return isInvalid ? this.histogramLeftEdgeX : newX;\r\n }\r\n\r\n /**\r\n * Constrain a proposed value for the maximum (right) slider\r\n *\r\n * If the value is greater than the rightmost valid position, then set it to\r\n * the right edge of the histogram (ie histogram width - slider width). If the\r\n * value is less than the leftmost valid position (the position of the min\r\n * slider), then set it to the position of the min slider\r\n */\r\n private validMaxSliderX(newX: number): number {\r\n // allow the right slider to go left only to the left slider, even if the\r\n // min selected date is out of range\r\n const leftLimit = Math.max(\r\n this.histogramLeftEdgeX,\r\n this.translateDateToPosition(this.minSelectedDate)\r\n );\r\n newX = this.clamp(newX, leftLimit, this.histogramRightEdgeX);\r\n const isInvalid =\r\n Number.isNaN(newX) || leftLimit > this.histogramRightEdgeX;\r\n return isInvalid ? this.histogramRightEdgeX : newX;\r\n }\r\n\r\n private addListeners(): void {\r\n window.addEventListener('pointermove', this.move);\r\n window.addEventListener('pointerup', this.drop);\r\n window.addEventListener('pointercancel', this.drop);\r\n }\r\n\r\n private removeListeners(): void {\r\n window.removeEventListener('pointermove', this.move);\r\n window.removeEventListener('pointerup', this.drop);\r\n window.removeEventListener('pointercancel', this.drop);\r\n }\r\n\r\n /**\r\n * start a timer to emit an update event. this timer can be canceled (and the\r\n * event not emitted) if user drags a slider or focuses a date input within\r\n * the update delay\r\n */\r\n private beginEmitUpdateProcess(): void {\r\n this.cancelPendingUpdateEvent();\r\n this._emitUpdatedEventTimer = setTimeout(() => {\r\n if (this.currentDateRangeString === this._previousDateRange) {\r\n // don't emit duplicate event if no change since last emitted event\r\n return;\r\n }\r\n this._previousDateRange = this.currentDateRangeString;\r\n const options = {\r\n detail: {\r\n minDate: this.minSelectedDate,\r\n maxDate: this.maxSelectedDate,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n };\r\n this.dispatchEvent(new CustomEvent('histogramDateRangeUpdated', options));\r\n }, this.updateDelay);\r\n }\r\n\r\n private cancelPendingUpdateEvent(): void {\r\n if (this._emitUpdatedEventTimer === undefined) {\r\n return;\r\n }\r\n clearTimeout(this._emitUpdatedEventTimer);\r\n this._emitUpdatedEventTimer = undefined;\r\n }\r\n\r\n /**\r\n * find position of pointer in relation to the current slider\r\n */\r\n private setDragOffset(e: PointerEvent): void {\r\n this._currentSlider = e.currentTarget as SVGRectElement;\r\n const sliderX =\r\n (this._currentSlider.id as SliderId) === 'slider-min'\r\n ? this.minSliderX\r\n : this.maxSliderX;\r\n const histogramClientX = this.getBoundingClientRect().x;\r\n this._dragOffset = e.clientX - histogramClientX - sliderX;\r\n }\r\n\r\n /**\r\n * @param x horizontal position of slider\r\n * @returns string representation of date\r\n */\r\n private translatePositionToDate(x: number): string {\r\n // use Math.ceil to round up to fix case where input like 1/1/2010 would get\r\n // translated to 12/31/2009\r\n const milliseconds = Math.ceil(\r\n ((x - this.sliderWidth) * this.dateRangeMS) / this._histWidth\r\n );\r\n return this.formatDate(this._minDateMS + milliseconds);\r\n }\r\n\r\n /**\r\n * Returns slider x-position corresponding to given date\r\n *\r\n * @param date\r\n * @returns x-position of slider\r\n */\r\n private translateDateToPosition(date: string): number {\r\n const milliseconds = this.getMSFromString(date);\r\n return (\r\n this.sliderWidth +\r\n ((milliseconds - this._minDateMS) * this._histWidth) / this.dateRangeMS\r\n );\r\n }\r\n\r\n /** ensure that the returned value is between minValue and maxValue */\r\n private clamp(x: number, minValue: number, maxValue: number): number {\r\n return Math.min(Math.max(x, minValue), maxValue);\r\n }\r\n\r\n private handleMinDateInput(e: Event): void {\r\n const target = e.currentTarget as HTMLInputElement;\r\n this.minSelectedDate = target.value;\r\n this.beginEmitUpdateProcess();\r\n }\r\n\r\n private handleMaxDateInput(e: Event): void {\r\n const target = e.currentTarget as HTMLInputElement;\r\n this.maxSelectedDate = target.value;\r\n this.beginEmitUpdateProcess();\r\n }\r\n\r\n private handleKeyUp(e: KeyboardEvent): void {\r\n if (e.key === 'Enter') {\r\n const target = e.currentTarget as HTMLInputElement;\r\n target.blur();\r\n if (target.id === 'date-min') {\r\n this.handleMinDateInput(e);\r\n } else if (target.id === 'date-max') {\r\n this.handleMaxDateInput(e);\r\n }\r\n }\r\n }\r\n\r\n private get currentDateRangeString(): string {\r\n return `${this.minSelectedDate}:${this.maxSelectedDate}`;\r\n }\r\n\r\n private getMSFromString(date: unknown): number {\r\n // It's possible that `date` is not a string in certain situations.\r\n // For instance if you use LitElement bindings and the date is `2000`,\r\n // it will be treated as a number instead of a string. This just makes sure\r\n // we're dealing with a string.\r\n const stringified = typeof date === 'string' ? date : String(date);\r\n const digitGroupCount = (stringified.split(/(\\d+)/).length - 1) / 2;\r\n if (digitGroupCount === 1) {\r\n // if there's just a single set of digits, assume it's a year\r\n const dateObj = new Date(0, 0); // start at January 1, 1900\r\n dateObj.setFullYear(Number(stringified)); // override year\r\n return dateObj.getTime(); // get time in milliseconds\r\n }\r\n return dayjs(stringified, [this.dateFormat, DATE_FORMAT]).valueOf();\r\n }\r\n\r\n /**\r\n * expand or narrow the selected range by moving the slider nearest the\r\n * clicked bar to the outer edge of the clicked bar\r\n *\r\n * @param e Event click event from a histogram bar\r\n */\r\n private handleBarClick(e: Event): void {\r\n const dataset = (e.currentTarget as SVGRectElement).dataset as BarDataset;\r\n // use the midpoint of the width of the clicked bar to determine which is\r\n // the nearest slider\r\n const clickPosition =\r\n (this.getMSFromString(dataset.binStart) +\r\n this.getMSFromString(dataset.binEnd)) /\r\n 2;\r\n const distanceFromMinSlider = Math.abs(\r\n clickPosition - this.getMSFromString(this.minSelectedDate)\r\n );\r\n const distanceFromMaxSlider = Math.abs(\r\n clickPosition - this.getMSFromString(this.maxSelectedDate)\r\n );\r\n // update the selected range by moving the nearer slider\r\n if (distanceFromMinSlider < distanceFromMaxSlider) {\r\n this.minSelectedDate = dataset.binStart;\r\n } else {\r\n this.maxSelectedDate = dataset.binEnd;\r\n }\r\n this.beginEmitUpdateProcess();\r\n }\r\n\r\n private get minSliderTemplate(): SVGTemplateResult {\r\n // width/height in pixels of curved part of the sliders (like\r\n // border-radius); used as part of a SVG quadratic curve. see\r\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#curve_commands\r\n const cs = SLIDER_CORNER_SIZE;\r\n\r\n const sliderShape = `\r\n M${this.minSliderX},0\r\n h-${this.sliderWidth - cs}\r\n q-${cs},0 -${cs},${cs}\r\n v${this.height - cs * 2}\r\n q0,${cs} ${cs},${cs}\r\n h${this.sliderWidth - cs}\r\n `;\r\n return this.generateSliderSVG(this.minSliderX, 'slider-min', sliderShape);\r\n }\r\n\r\n private get maxSliderTemplate(): SVGTemplateResult {\r\n const cs = SLIDER_CORNER_SIZE;\r\n const sliderShape = `\r\n M${this.maxSliderX},0\r\n h${this.sliderWidth - cs}\r\n q${cs},0 ${cs},${cs}\r\n v${this.height - cs * 2}\r\n q0,${cs} -${cs},${cs}\r\n h-${this.sliderWidth - cs}\r\n `;\r\n return this.generateSliderSVG(this.maxSliderX, 'slider-max', sliderShape);\r\n }\r\n\r\n private generateSliderSVG(\r\n sliderPositionX: number,\r\n id: SliderId,\r\n sliderShape: string\r\n ): SVGTemplateResult {\r\n // whether the curved part of the slider is facing towards the left (1), ie\r\n // minimum, or facing towards the right (-1), ie maximum\r\n const k = id === 'slider-min' ? 1 : -1;\r\n\r\n return svg`\r\n <svg\r\n id=\"${id}\"\r\n class=\"\r\n ${this.disabled ? '' : 'draggable'}\r\n ${this._isDragging ? 'dragging' : ''}\"\r\n @pointerdown=\"${this.drag}\"\r\n >\r\n <path d=\"${sliderShape} z\" fill=\"${sliderColor}\" />\r\n <rect\r\n x=\"${\r\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.4 * k\r\n }\"\r\n y=\"${this.height / 3}\"\r\n width=\"1\"\r\n height=\"${this.height / 3}\"\r\n fill=\"white\"\r\n />\r\n <rect\r\n x=\"${\r\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.6 * k\r\n }\"\r\n y=\"${this.height / 3}\"\r\n width=\"1\"\r\n height=\"${this.height / 3}\"\r\n fill=\"white\"\r\n />\r\n </svg>\r\n `;\r\n }\r\n\r\n get selectedRangeTemplate(): SVGTemplateResult {\r\n return svg`\r\n <rect\r\n x=\"${this.minSliderX}\"\r\n y=\"0\"\r\n width=\"${this.maxSliderX - this.minSliderX}\"\r\n height=\"${this.height}\"\r\n fill=\"${selectedRangeColor}\"\r\n />`;\r\n }\r\n\r\n get histogramTemplate(): SVGTemplateResult[] {\r\n const xScale = this._histWidth / this._numBins;\r\n const barWidth = xScale - 1;\r\n let x = this.sliderWidth; // start at the left edge of the histogram\r\n\r\n // the stroke-dasharray style below creates a transparent border around the\r\n // right edge of the bar, which prevents user from encountering a gap\r\n // between adjacent bars (eg when viewing the tooltips or when trying to\r\n // extend the range by clicking on a bar)\r\n return this._histData.map(data => {\r\n const bar = svg`\r\n <rect\r\n class=\"bar\"\r\n style='stroke-dasharray: 0 ${barWidth} ${data.height} ${barWidth} 0 ${\r\n data.height\r\n };'\r\n x=\"${x}\"\r\n y=\"${this.height - data.height}\"\r\n width=\"${barWidth}\"\r\n height=\"${data.height}\"\r\n @pointerenter=\"${this.showTooltip}\"\r\n @pointerleave=\"${this.hideTooltip}\"\r\n @click=\"${this.handleBarClick}\"\r\n fill=\"${\r\n x + barWidth >= this.minSliderX && x <= this.maxSliderX\r\n ? barIncludedFill\r\n : barExcludedFill\r\n }\"\r\n data-num-items=\"${data.value}\"\r\n data-bin-start=\"${data.binStart}\"\r\n data-bin-end=\"${data.binEnd}\"\r\n />`;\r\n x += xScale;\r\n return bar;\r\n });\r\n }\r\n\r\n private formatDate(dateMS: number): string {\r\n if (Number.isNaN(dateMS)) {\r\n return '';\r\n }\r\n const date = dayjs(dateMS);\r\n if (date.year() < 1000) {\r\n // years before 1000 don't play well with dayjs custom formatting, so fall\r\n // back to displaying only the year\r\n return String(date.year());\r\n }\r\n return date.format(this.dateFormat);\r\n }\r\n\r\n /**\r\n * NOTE: we are relying on the lit `live` directive in the template to\r\n * ensure that the change to minSelectedDate is noticed and the input value\r\n * gets properly re-rendered. see\r\n * https://lit.dev/docs/templates/directives/#live\r\n */\r\n get minInputTemplate(): TemplateResult {\r\n return html`\r\n <input\r\n id=\"date-min\"\r\n placeholder=\"${this.dateFormat}\"\r\n type=\"text\"\r\n @focus=\"${this.cancelPendingUpdateEvent}\"\r\n @blur=\"${this.handleMinDateInput}\"\r\n @keyup=\"${this.handleKeyUp}\"\r\n .value=\"${live(this.minSelectedDate)}\"\r\n ?disabled=\"${this.disabled}\"\r\n />\r\n `;\r\n }\r\n\r\n get maxInputTemplate(): TemplateResult {\r\n return html`\r\n <input\r\n id=\"date-max\"\r\n placeholder=\"${this.dateFormat}\"\r\n type=\"text\"\r\n @focus=\"${this.cancelPendingUpdateEvent}\"\r\n @blur=\"${this.handleMaxDateInput}\"\r\n @keyup=\"${this.handleKeyUp}\"\r\n .value=\"${live(this.maxSelectedDate)}\"\r\n ?disabled=\"${this.disabled}\"\r\n />\r\n `;\r\n }\r\n\r\n get tooltipTemplate(): TemplateResult {\r\n return html`\r\n <style>\r\n #tooltip {\r\n width: ${this.tooltipWidth}px;\r\n height: ${this.tooltipHeight}px;\r\n top: ${-9 - this.tooltipHeight}px;\r\n left: ${this._tooltipOffset}px;\r\n display: ${this._tooltipVisible ? 'block' : 'none'};\r\n }\r\n #tooltip:after {\r\n left: ${this.tooltipWidth / 2}px;\r\n }\r\n </style>\r\n <div id=\"tooltip\">${this._tooltipContent}</div>\r\n `;\r\n }\r\n\r\n private get noDataTemplate(): TemplateResult {\r\n return html`\r\n <div class=\"missing-data-message\">${this.missingDataMessage}</div>\r\n `;\r\n }\r\n\r\n private get activityIndicatorTemplate(): TemplateResult | typeof nothing {\r\n if (!this.loading) {\r\n return nothing;\r\n }\r\n return html`\r\n <ia-activity-indicator mode=\"processing\"> </ia-activity-indicator>\r\n `;\r\n }\r\n\r\n static styles = css`\r\n .missing-data-message {\r\n text-align: center;\r\n }\r\n #container {\r\n margin: 0;\r\n touch-action: none;\r\n position: relative;\r\n }\r\n .disabled {\r\n opacity: 0.3;\r\n }\r\n ia-activity-indicator {\r\n position: absolute;\r\n left: calc(50% - 10px);\r\n top: 10px;\r\n width: 20px;\r\n height: 20px;\r\n --activityIndicatorLoadingDotColor: rgba(0, 0, 0, 0);\r\n --activityIndicatorLoadingRingColor: ${activityIndicatorColor};\r\n }\r\n\r\n /* prevent selection from interfering with tooltip, especially on mobile */\r\n /* https://stackoverflow.com/a/4407335/1163042 */\r\n .noselect {\r\n -webkit-touch-callout: none; /* iOS Safari */\r\n -webkit-user-select: none; /* Safari */\r\n -moz-user-select: none; /* Old versions of Firefox */\r\n -ms-user-select: none; /* Internet Explorer/Edge */\r\n user-select: none; /* current Chrome, Edge, Opera and Firefox */\r\n }\r\n .bar {\r\n /* create a transparent border around the hist bars to prevent \"gaps\" and\r\n flickering when moving around between bars. this also helps with handling\r\n clicks on the bars, preventing users from being able to click in between\r\n bars */\r\n stroke: rgba(0, 0, 0, 0);\r\n /* ensure transparent stroke wide enough to cover gap between bars */\r\n stroke-width: 2px;\r\n }\r\n .bar:hover {\r\n /* highlight currently hovered bar */\r\n fill-opacity: 0.7;\r\n }\r\n .disabled .bar:hover {\r\n /* ensure no visual hover interaction when disabled */\r\n fill-opacity: 1;\r\n }\r\n /****** histogram ********/\r\n #tooltip {\r\n position: absolute;\r\n background: ${tooltipBackgroundColor};\r\n color: ${tooltipTextColor};\r\n text-align: center;\r\n border-radius: 3px;\r\n padding: 2px;\r\n font-size: ${tooltipFontSize};\r\n font-family: ${tooltipFontFamily};\r\n touch-action: none;\r\n pointer-events: none;\r\n }\r\n #tooltip:after {\r\n content: '';\r\n position: absolute;\r\n margin-left: -5px;\r\n top: 100%;\r\n /* arrow */\r\n border: 5px solid ${tooltipTextColor};\r\n border-color: ${tooltipBackgroundColor} transparent transparent\r\n transparent;\r\n }\r\n /****** slider ********/\r\n .draggable:hover {\r\n cursor: grab;\r\n }\r\n .dragging {\r\n cursor: grabbing !important;\r\n }\r\n /****** inputs ********/\r\n #inputs {\r\n display: flex;\r\n justify-content: center;\r\n }\r\n #inputs .dash {\r\n position: relative;\r\n bottom: -1px;\r\n }\r\n input {\r\n width: ${inputWidth};\r\n margin: 0 3px;\r\n border: ${inputBorder};\r\n border-radius: 2px !important;\r\n text-align: center;\r\n font-size: ${inputFontSize};\r\n font-family: ${inputFontFamily};\r\n }\r\n `;\r\n\r\n render(): TemplateResult {\r\n if (!this.hasBinData) {\r\n return this.noDataTemplate;\r\n }\r\n return html`\r\n <div\r\n id=\"container\"\r\n class=\"\r\n noselect\r\n ${this._isDragging ? 'dragging' : ''}\r\n \"\r\n style=\"width: ${this.width}px\"\r\n >\r\n ${this.activityIndicatorTemplate} ${this.tooltipTemplate}\r\n <div\r\n class=\"inner-container\r\n ${this.disabled ? 'disabled' : ''}\"\r\n >\r\n <svg\r\n width=\"${this.width}\"\r\n height=\"${this.height}\"\r\n @pointerleave=\"${this.drop}\"\r\n >\r\n ${this.selectedRangeTemplate}\r\n <svg id=\"histogram\">${this.histogramTemplate}</svg>\r\n ${this.minSliderTemplate} ${this.maxSliderTemplate}\r\n </svg>\r\n <div id=\"inputs\">\r\n ${this.minInputTemplate}\r\n <div class=\"dash\">-</div>\r\n ${this.maxInputTemplate}\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n// help TypeScript provide strong typing when interacting with DOM APIs\r\n// https://stackoverflow.com/questions/65148695/lit-element-typescript-project-global-interface-declaration-necessary\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'histogram-date-range': HistogramDateRange;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"histogram-date-range.js","sourceRoot":"","sources":["../../src/histogram-date-range.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n css,\r\n html,\r\n nothing,\r\n LitElement,\r\n PropertyValues,\r\n svg,\r\n SVGTemplateResult,\r\n TemplateResult,\r\n} from 'lit';\r\nimport { property, state, customElement } from 'lit/decorators.js';\r\nimport { live } from 'lit/directives/live.js';\r\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\r\n\r\n/* eslint-disable-next-line */\r\n/* @ts-ignore Import module -- JS, so no types */\r\nimport dayjs from 'https://esm.archive.org/dayjs@^1.10.7';\r\n/* eslint-disable-next-line */\r\n/* @ts-ignore Import module -- JS, so no types */\r\nimport customParseFormat from 'https://esm.archive.org/dayjs@1.9.4/esm/plugin/customParseFormat';\r\n// NOTE: using a specific *earlier* pegged commit for the plugin ^, because esm.archive.org is has a\r\n// problem creating later versions where the `export` of an included `utils.js` gets mangled. Eg:\r\n// https://github.com/internetarchive/esbuild_es5/commit/ce19e8b841282c0e94d2b8e6830fd7744b2216c2#diff-4b2ed47327851d566740a30ce5f60271c059ae67eff2006bc07bb7c4fcee8b50L296\r\n\r\ndayjs.extend(customParseFormat);\r\n\r\n// these values can be overridden via the component's HTML (camelCased) attributes\r\nconst WIDTH = 180;\r\nconst HEIGHT = 40;\r\nconst SLIDER_WIDTH = 10;\r\nconst TOOLTIP_WIDTH = 125;\r\nconst TOOLTIP_HEIGHT = 30;\r\nconst DATE_FORMAT = 'YYYY';\r\nconst MISSING_DATA = 'no data';\r\nconst UPDATE_DEBOUNCE_DELAY_MS = 0;\r\n\r\n// this constant is not set up to be overridden\r\nconst SLIDER_CORNER_SIZE = 4;\r\n\r\n// these CSS custom props can be overridden from the HTML that is invoking this component\r\nconst sliderColor = css`var(--histogramDateRangeSliderColor, #4B65FE)`;\r\nconst selectedRangeColor = css`var(--histogramDateRangeSelectedRangeColor, #DBE0FF)`;\r\nconst barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;\r\nconst activityIndicatorColor = css`var(--histogramDateRangeActivityIndicator, #2C2C2C)`;\r\nconst barExcludedFill = css`var(--histogramDateRangeBarExcludedFill, #CCCCCC)`;\r\nconst inputBorder = css`var(--histogramDateRangeInputBorder, 0.5px solid #2C2C2C)`;\r\nconst inputWidth = css`var(--histogramDateRangeInputWidth, 35px)`;\r\nconst inputFontSize = css`var(--histogramDateRangeInputFontSize, 1.2rem)`;\r\nconst inputFontFamily = css`var(--histogramDateRangeInputFontFamily, sans-serif)`;\r\nconst tooltipBackgroundColor = css`var(--histogramDateRangeTooltipBackgroundColor, #2C2C2C)`;\r\nconst tooltipTextColor = css`var(--histogramDateRangeTooltipTextColor, #FFFFFF)`;\r\nconst tooltipFontSize = css`var(--histogramDateRangeTooltipFontSize, 1.1rem)`;\r\nconst tooltipFontFamily = css`var(--histogramDateRangeTooltipFontFamily, sans-serif)`;\r\n\r\ntype SliderId = 'slider-min' | 'slider-max';\r\n\r\ninterface HistogramItem {\r\n value: number;\r\n height: number;\r\n binStart: string;\r\n binEnd: string;\r\n}\r\n\r\ninterface BarDataset extends DOMStringMap {\r\n numItems: string;\r\n binStart: string;\r\n binEnd: string;\r\n}\r\n\r\n@customElement('histogram-date-range')\r\nexport class HistogramDateRange extends LitElement {\r\n /* eslint-disable lines-between-class-members */\r\n\r\n // public reactive properties that can be set via HTML attributes\r\n @property({ type: Number }) width = WIDTH;\r\n @property({ type: Number }) height = HEIGHT;\r\n @property({ type: Number }) sliderWidth = SLIDER_WIDTH;\r\n @property({ type: Number }) tooltipWidth = TOOLTIP_WIDTH;\r\n @property({ type: Number }) tooltipHeight = TOOLTIP_HEIGHT;\r\n @property({ type: Number }) updateDelay = UPDATE_DEBOUNCE_DELAY_MS;\r\n @property({ type: String }) dateFormat = DATE_FORMAT;\r\n @property({ type: String }) missingDataMessage = MISSING_DATA;\r\n @property({ type: String }) minDate = '';\r\n @property({ type: String }) maxDate = '';\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: Object }) bins: number[] = [];\r\n\r\n // internal reactive properties not exposed as attributes\r\n @state() private _tooltipOffset = 0;\r\n @state() private _tooltipContent?: TemplateResult;\r\n @state() private _tooltipVisible = false;\r\n @state() private _isDragging = false;\r\n @state() private _isLoading = false;\r\n\r\n // non-reactive properties (changes don't auto-trigger re-rendering)\r\n private _minSelectedDate = '';\r\n private _maxSelectedDate = '';\r\n private _minDateMS = 0;\r\n private _maxDateMS = 0;\r\n private _dragOffset = 0;\r\n private _histWidth = 0;\r\n private _binWidth = 0;\r\n private _currentSlider?: SVGRectElement;\r\n private _histData: HistogramItem[] = [];\r\n private _emitUpdatedEventTimer?: ReturnType<typeof setTimeout>;\r\n private _previousDateRange = '';\r\n\r\n /* eslint-enable lines-between-class-members */\r\n\r\n disconnectedCallback(): void {\r\n this.removeListeners();\r\n super.disconnectedCallback();\r\n }\r\n\r\n updated(changedProps: PropertyValues): void {\r\n // check for changes that would affect bin data calculations\r\n if (\r\n changedProps.has('bins') ||\r\n changedProps.has('minDate') ||\r\n changedProps.has('maxDate') ||\r\n changedProps.has('minSelectedDate') ||\r\n changedProps.has('maxSelectedDate')\r\n ) {\r\n this.handleDataUpdate();\r\n }\r\n }\r\n\r\n /**\r\n * Set private properties that depend on the attribute bin data\r\n *\r\n * We're caching these values and not using getters to avoid recalculating all\r\n * of the hist data every time the user drags a slider or hovers over a bar\r\n * creating a tooltip.\r\n */\r\n private handleDataUpdate(): void {\r\n if (!this.hasBinData) {\r\n return;\r\n }\r\n this._histWidth = this.width - this.sliderWidth * 2;\r\n this._minDateMS = this.getMSFromString(this.minDate);\r\n this._maxDateMS = this.getMSFromString(this.maxDate);\r\n this._binWidth = this._histWidth / this._numBins;\r\n this._previousDateRange = this.currentDateRangeString;\r\n this._histData = this.calculateHistData();\r\n this.minSelectedDate = this.minSelectedDate\r\n ? this.minSelectedDate\r\n : this.minDate;\r\n this.maxSelectedDate = this.maxSelectedDate\r\n ? this.maxSelectedDate\r\n : this.maxDate;\r\n this.requestUpdate();\r\n }\r\n\r\n private calculateHistData(): HistogramItem[] {\r\n const minValue = Math.min(...this.bins);\r\n const maxValue = Math.max(...this.bins);\r\n // if there is no difference between the min and max values, use a range of\r\n // 1 because log scaling will fail if the range is 0\r\n const valueRange = minValue === maxValue ? 1 : Math.log1p(maxValue);\r\n const valueScale = this.height / valueRange;\r\n const dateScale = this.dateRangeMS / this._numBins;\r\n return this.bins.map((v: number, i: number) => {\r\n return {\r\n value: v,\r\n // use log scaling for the height of the bar to prevent tall bars from\r\n // making the smaller ones too small to see\r\n height: Math.floor(Math.log1p(v) * valueScale),\r\n binStart: `${this.formatDate(i * dateScale + this._minDateMS)}`,\r\n binEnd: `${this.formatDate((i + 1) * dateScale + this._minDateMS)}`,\r\n };\r\n });\r\n }\r\n\r\n private get hasBinData(): boolean {\r\n return this._numBins > 0;\r\n }\r\n\r\n private get _numBins(): number {\r\n if (!this.bins || !this.bins.length) {\r\n return 0;\r\n }\r\n return this.bins.length;\r\n }\r\n\r\n private get histogramLeftEdgeX(): number {\r\n return this.sliderWidth;\r\n }\r\n\r\n private get histogramRightEdgeX(): number {\r\n return this.width - this.sliderWidth;\r\n }\r\n\r\n /** component's loading (and disabled) state */\r\n @property({ type: Boolean }) get loading(): boolean {\r\n return this._isLoading;\r\n }\r\n\r\n set loading(value: boolean) {\r\n this.disabled = value;\r\n this._isLoading = value;\r\n }\r\n\r\n /** formatted minimum date of selected date range */\r\n @property() get minSelectedDate(): string {\r\n return this.formatDate(this.getMSFromString(this._minSelectedDate));\r\n }\r\n\r\n /** updates minSelectedDate if new date is valid */\r\n set minSelectedDate(rawDate: string) {\r\n if (!this._minSelectedDate) {\r\n // because the values needed to calculate valid max/min values are not\r\n // available during the lit init when it's populating properties from\r\n // attributes, fall back to just the raw date if nothing is already set\r\n this._minSelectedDate = rawDate;\r\n return;\r\n }\r\n const proposedDateMS = this.getMSFromString(rawDate);\r\n const isValidDate = !Number.isNaN(proposedDateMS);\r\n const isNotTooRecent =\r\n proposedDateMS <= this.getMSFromString(this.maxSelectedDate);\r\n if (isValidDate && isNotTooRecent) {\r\n this._minSelectedDate = this.formatDate(proposedDateMS);\r\n }\r\n this.requestUpdate();\r\n }\r\n\r\n /** formatted maximum date of selected date range */\r\n @property() get maxSelectedDate(): string {\r\n return this.formatDate(this.getMSFromString(this._maxSelectedDate));\r\n }\r\n\r\n /** updates maxSelectedDate if new date is valid */\r\n set maxSelectedDate(rawDate: string) {\r\n if (!this._maxSelectedDate) {\r\n // because the values needed to calculate valid max/min values are not\r\n // available during the lit init when it's populating properties from\r\n // attributes, fall back to just the raw date if nothing is already set\r\n this._maxSelectedDate = rawDate;\r\n return;\r\n }\r\n const proposedDateMS = this.getMSFromString(rawDate);\r\n const isValidDate = !Number.isNaN(proposedDateMS);\r\n const isNotTooOld =\r\n proposedDateMS >= this.getMSFromString(this.minSelectedDate);\r\n if (isValidDate && isNotTooOld) {\r\n this._maxSelectedDate = this.formatDate(proposedDateMS);\r\n }\r\n this.requestUpdate();\r\n }\r\n\r\n /** horizontal position of min date slider */\r\n get minSliderX(): number {\r\n const x = this.translateDateToPosition(this.minSelectedDate);\r\n return this.validMinSliderX(x);\r\n }\r\n\r\n /** horizontal position of max date slider */\r\n get maxSliderX(): number {\r\n const x = this.translateDateToPosition(this.maxSelectedDate);\r\n return this.validMaxSliderX(x);\r\n }\r\n\r\n private get dateRangeMS(): number {\r\n return this._maxDateMS - this._minDateMS;\r\n }\r\n\r\n private showTooltip(e: PointerEvent): void {\r\n if (this._isDragging || this.disabled) {\r\n return;\r\n }\r\n const target = e.currentTarget as SVGRectElement;\r\n const x = target.x.baseVal.value + this.sliderWidth / 2;\r\n const dataset = target.dataset as BarDataset;\r\n const itemsText = `item${dataset.numItems !== '1' ? 's' : ''}`;\r\n const formattedNumItems = Number(dataset.numItems).toLocaleString();\r\n\r\n this._tooltipOffset =\r\n x + (this._binWidth - this.sliderWidth - this.tooltipWidth) / 2;\r\n\r\n this._tooltipContent = html`\r\n ${formattedNumItems} ${itemsText}<br />\r\n ${dataset.binStart} - ${dataset.binEnd}\r\n `;\r\n this._tooltipVisible = true;\r\n }\r\n\r\n private hideTooltip(): void {\r\n this._tooltipContent = undefined;\r\n this._tooltipVisible = false;\r\n }\r\n\r\n // use arrow functions (rather than standard JS class instance methods) so\r\n // that `this` is bound to the histogramDateRange object and not the event\r\n // target. for more info see\r\n // https://lit-element.polymer-project.org/guide/events#using-this-in-event-listeners\r\n private drag = (e: PointerEvent): void => {\r\n // prevent selecting text or other ranges while dragging, especially in Safari\r\n e.preventDefault();\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.setDragOffset(e);\r\n this._isDragging = true;\r\n this.addListeners();\r\n this.cancelPendingUpdateEvent();\r\n };\r\n\r\n private drop = (): void => {\r\n if (this._isDragging) {\r\n this.removeListeners();\r\n this.beginEmitUpdateProcess();\r\n }\r\n this._isDragging = false;\r\n };\r\n\r\n /**\r\n * Adjust the date range based on slider movement\r\n *\r\n * @param e PointerEvent from the slider being moved\r\n */\r\n private move = (e: PointerEvent): void => {\r\n const histogramClientX = this.getBoundingClientRect().x;\r\n const newX = e.clientX - histogramClientX - this._dragOffset;\r\n const slider = this._currentSlider as SVGRectElement;\r\n if ((slider.id as SliderId) === 'slider-min') {\r\n this.minSelectedDate = this.translatePositionToDate(\r\n this.validMinSliderX(newX)\r\n );\r\n } else {\r\n this.maxSelectedDate = this.translatePositionToDate(\r\n this.validMaxSliderX(newX)\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Constrain a proposed value for the minimum (left) slider\r\n *\r\n * If the value is less than the leftmost valid position, then set it to the\r\n * left edge of the histogram (ie the slider width). If the value is greater\r\n * than the rightmost valid position (the position of the max slider), then\r\n * set it to the position of the max slider\r\n */\r\n private validMinSliderX(newX: number): number {\r\n // allow the left slider to go right only to the right slider, even if the\r\n // max selected date is out of range\r\n const rightLimit = Math.min(\r\n this.translateDateToPosition(this.maxSelectedDate),\r\n this.histogramRightEdgeX\r\n );\r\n newX = this.clamp(newX, this.histogramLeftEdgeX, rightLimit);\r\n const isInvalid =\r\n Number.isNaN(newX) || rightLimit < this.histogramLeftEdgeX;\r\n return isInvalid ? this.histogramLeftEdgeX : newX;\r\n }\r\n\r\n /**\r\n * Constrain a proposed value for the maximum (right) slider\r\n *\r\n * If the value is greater than the rightmost valid position, then set it to\r\n * the right edge of the histogram (ie histogram width - slider width). If the\r\n * value is less than the leftmost valid position (the position of the min\r\n * slider), then set it to the position of the min slider\r\n */\r\n private validMaxSliderX(newX: number): number {\r\n // allow the right slider to go left only to the left slider, even if the\r\n // min selected date is out of range\r\n const leftLimit = Math.max(\r\n this.histogramLeftEdgeX,\r\n this.translateDateToPosition(this.minSelectedDate)\r\n );\r\n newX = this.clamp(newX, leftLimit, this.histogramRightEdgeX);\r\n const isInvalid =\r\n Number.isNaN(newX) || leftLimit > this.histogramRightEdgeX;\r\n return isInvalid ? this.histogramRightEdgeX : newX;\r\n }\r\n\r\n private addListeners(): void {\r\n window.addEventListener('pointermove', this.move);\r\n window.addEventListener('pointerup', this.drop);\r\n window.addEventListener('pointercancel', this.drop);\r\n }\r\n\r\n private removeListeners(): void {\r\n window.removeEventListener('pointermove', this.move);\r\n window.removeEventListener('pointerup', this.drop);\r\n window.removeEventListener('pointercancel', this.drop);\r\n }\r\n\r\n /**\r\n * start a timer to emit an update event. this timer can be canceled (and the\r\n * event not emitted) if user drags a slider or focuses a date input within\r\n * the update delay\r\n */\r\n private beginEmitUpdateProcess(): void {\r\n this.cancelPendingUpdateEvent();\r\n this._emitUpdatedEventTimer = setTimeout(() => {\r\n if (this.currentDateRangeString === this._previousDateRange) {\r\n // don't emit duplicate event if no change since last emitted event\r\n return;\r\n }\r\n this._previousDateRange = this.currentDateRangeString;\r\n const options = {\r\n detail: {\r\n minDate: this.minSelectedDate,\r\n maxDate: this.maxSelectedDate,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n };\r\n this.dispatchEvent(new CustomEvent('histogramDateRangeUpdated', options));\r\n }, this.updateDelay);\r\n }\r\n\r\n private cancelPendingUpdateEvent(): void {\r\n if (this._emitUpdatedEventTimer === undefined) {\r\n return;\r\n }\r\n clearTimeout(this._emitUpdatedEventTimer);\r\n this._emitUpdatedEventTimer = undefined;\r\n }\r\n\r\n /**\r\n * find position of pointer in relation to the current slider\r\n */\r\n private setDragOffset(e: PointerEvent): void {\r\n this._currentSlider = e.currentTarget as SVGRectElement;\r\n const sliderX =\r\n (this._currentSlider.id as SliderId) === 'slider-min'\r\n ? this.minSliderX\r\n : this.maxSliderX;\r\n const histogramClientX = this.getBoundingClientRect().x;\r\n this._dragOffset = e.clientX - histogramClientX - sliderX;\r\n }\r\n\r\n /**\r\n * @param x horizontal position of slider\r\n * @returns string representation of date\r\n */\r\n private translatePositionToDate(x: number): string {\r\n // use Math.ceil to round up to fix case where input like 1/1/2010 would get\r\n // translated to 12/31/2009\r\n const milliseconds = Math.ceil(\r\n ((x - this.sliderWidth) * this.dateRangeMS) / this._histWidth\r\n );\r\n return this.formatDate(this._minDateMS + milliseconds);\r\n }\r\n\r\n /**\r\n * Returns slider x-position corresponding to given date\r\n *\r\n * @param date\r\n * @returns x-position of slider\r\n */\r\n private translateDateToPosition(date: string): number {\r\n const milliseconds = this.getMSFromString(date);\r\n return (\r\n this.sliderWidth +\r\n ((milliseconds - this._minDateMS) * this._histWidth) / this.dateRangeMS\r\n );\r\n }\r\n\r\n /** ensure that the returned value is between minValue and maxValue */\r\n private clamp(x: number, minValue: number, maxValue: number): number {\r\n return Math.min(Math.max(x, minValue), maxValue);\r\n }\r\n\r\n private handleMinDateInput(e: Event): void {\r\n const target = e.currentTarget as HTMLInputElement;\r\n this.minSelectedDate = target.value;\r\n this.beginEmitUpdateProcess();\r\n }\r\n\r\n private handleMaxDateInput(e: Event): void {\r\n const target = e.currentTarget as HTMLInputElement;\r\n this.maxSelectedDate = target.value;\r\n this.beginEmitUpdateProcess();\r\n }\r\n\r\n private handleKeyUp(e: KeyboardEvent): void {\r\n if (e.key === 'Enter') {\r\n const target = e.currentTarget as HTMLInputElement;\r\n target.blur();\r\n if (target.id === 'date-min') {\r\n this.handleMinDateInput(e);\r\n } else if (target.id === 'date-max') {\r\n this.handleMaxDateInput(e);\r\n }\r\n }\r\n }\r\n\r\n private get currentDateRangeString(): string {\r\n return `${this.minSelectedDate}:${this.maxSelectedDate}`;\r\n }\r\n\r\n private getMSFromString(date: unknown): number {\r\n // It's possible that `date` is not a string in certain situations.\r\n // For instance if you use LitElement bindings and the date is `2000`,\r\n // it will be treated as a number instead of a string. This just makes sure\r\n // we're dealing with a string.\r\n const stringified = typeof date === 'string' ? date : String(date);\r\n const digitGroupCount = (stringified.split(/(\\d+)/).length - 1) / 2;\r\n if (digitGroupCount === 1) {\r\n // if there's just a single set of digits, assume it's a year\r\n const dateObj = new Date(0, 0); // start at January 1, 1900\r\n dateObj.setFullYear(Number(stringified)); // override year\r\n return dateObj.getTime(); // get time in milliseconds\r\n }\r\n return dayjs(stringified, [this.dateFormat, DATE_FORMAT]).valueOf();\r\n }\r\n\r\n /**\r\n * expand or narrow the selected range by moving the slider nearest the\r\n * clicked bar to the outer edge of the clicked bar\r\n *\r\n * @param e Event click event from a histogram bar\r\n */\r\n private handleBarClick(e: Event): void {\r\n const dataset = (e.currentTarget as SVGRectElement).dataset as BarDataset;\r\n // use the midpoint of the width of the clicked bar to determine which is\r\n // the nearest slider\r\n const clickPosition =\r\n (this.getMSFromString(dataset.binStart) +\r\n this.getMSFromString(dataset.binEnd)) /\r\n 2;\r\n const distanceFromMinSlider = Math.abs(\r\n clickPosition - this.getMSFromString(this.minSelectedDate)\r\n );\r\n const distanceFromMaxSlider = Math.abs(\r\n clickPosition - this.getMSFromString(this.maxSelectedDate)\r\n );\r\n // update the selected range by moving the nearer slider\r\n if (distanceFromMinSlider < distanceFromMaxSlider) {\r\n this.minSelectedDate = dataset.binStart;\r\n } else {\r\n this.maxSelectedDate = dataset.binEnd;\r\n }\r\n this.beginEmitUpdateProcess();\r\n }\r\n\r\n private get minSliderTemplate(): SVGTemplateResult {\r\n // width/height in pixels of curved part of the sliders (like\r\n // border-radius); used as part of a SVG quadratic curve. see\r\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#curve_commands\r\n const cs = SLIDER_CORNER_SIZE;\r\n\r\n const sliderShape = `\r\n M${this.minSliderX},0\r\n h-${this.sliderWidth - cs}\r\n q-${cs},0 -${cs},${cs}\r\n v${this.height - cs * 2}\r\n q0,${cs} ${cs},${cs}\r\n h${this.sliderWidth - cs}\r\n `;\r\n return this.generateSliderSVG(this.minSliderX, 'slider-min', sliderShape);\r\n }\r\n\r\n private get maxSliderTemplate(): SVGTemplateResult {\r\n const cs = SLIDER_CORNER_SIZE;\r\n const sliderShape = `\r\n M${this.maxSliderX},0\r\n h${this.sliderWidth - cs}\r\n q${cs},0 ${cs},${cs}\r\n v${this.height - cs * 2}\r\n q0,${cs} -${cs},${cs}\r\n h-${this.sliderWidth - cs}\r\n `;\r\n return this.generateSliderSVG(this.maxSliderX, 'slider-max', sliderShape);\r\n }\r\n\r\n private generateSliderSVG(\r\n sliderPositionX: number,\r\n id: SliderId,\r\n sliderShape: string\r\n ): SVGTemplateResult {\r\n // whether the curved part of the slider is facing towards the left (1), ie\r\n // minimum, or facing towards the right (-1), ie maximum\r\n const k = id === 'slider-min' ? 1 : -1;\r\n\r\n return svg`\r\n <svg\r\n id=\"${id}\"\r\n class=\"\r\n ${this.disabled ? '' : 'draggable'}\r\n ${this._isDragging ? 'dragging' : ''}\"\r\n @pointerdown=\"${this.drag}\"\r\n >\r\n <path d=\"${sliderShape} z\" fill=\"${sliderColor}\" />\r\n <rect\r\n x=\"${\r\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.4 * k\r\n }\"\r\n y=\"${this.height / 3}\"\r\n width=\"1\"\r\n height=\"${this.height / 3}\"\r\n fill=\"white\"\r\n />\r\n <rect\r\n x=\"${\r\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.6 * k\r\n }\"\r\n y=\"${this.height / 3}\"\r\n width=\"1\"\r\n height=\"${this.height / 3}\"\r\n fill=\"white\"\r\n />\r\n </svg>\r\n `;\r\n }\r\n\r\n get selectedRangeTemplate(): SVGTemplateResult {\r\n return svg`\r\n <rect\r\n x=\"${this.minSliderX}\"\r\n y=\"0\"\r\n width=\"${this.maxSliderX - this.minSliderX}\"\r\n height=\"${this.height}\"\r\n fill=\"${selectedRangeColor}\"\r\n />`;\r\n }\r\n\r\n get histogramTemplate(): SVGTemplateResult[] {\r\n const xScale = this._histWidth / this._numBins;\r\n const barWidth = xScale - 1;\r\n let x = this.sliderWidth; // start at the left edge of the histogram\r\n\r\n // the stroke-dasharray style below creates a transparent border around the\r\n // right edge of the bar, which prevents user from encountering a gap\r\n // between adjacent bars (eg when viewing the tooltips or when trying to\r\n // extend the range by clicking on a bar)\r\n return this._histData.map(data => {\r\n const bar = svg`\r\n <rect\r\n class=\"bar\"\r\n style='stroke-dasharray: 0 ${barWidth} ${data.height} ${barWidth} 0 ${\r\n data.height\r\n };'\r\n x=\"${x}\"\r\n y=\"${this.height - data.height}\"\r\n width=\"${barWidth}\"\r\n height=\"${data.height}\"\r\n @pointerenter=\"${this.showTooltip}\"\r\n @pointerleave=\"${this.hideTooltip}\"\r\n @click=\"${this.handleBarClick}\"\r\n fill=\"${\r\n x + barWidth >= this.minSliderX && x <= this.maxSliderX\r\n ? barIncludedFill\r\n : barExcludedFill\r\n }\"\r\n data-num-items=\"${data.value}\"\r\n data-bin-start=\"${data.binStart}\"\r\n data-bin-end=\"${data.binEnd}\"\r\n />`;\r\n x += xScale;\r\n return bar;\r\n });\r\n }\r\n\r\n private formatDate(dateMS: number): string {\r\n if (Number.isNaN(dateMS)) {\r\n return '';\r\n }\r\n const date = dayjs(dateMS);\r\n if (date.year() < 1000) {\r\n // years before 1000 don't play well with dayjs custom formatting, so fall\r\n // back to displaying only the year\r\n return String(date.year());\r\n }\r\n return date.format(this.dateFormat);\r\n }\r\n\r\n /**\r\n * NOTE: we are relying on the lit `live` directive in the template to\r\n * ensure that the change to minSelectedDate is noticed and the input value\r\n * gets properly re-rendered. see\r\n * https://lit.dev/docs/templates/directives/#live\r\n */\r\n get minInputTemplate(): TemplateResult {\r\n return html`\r\n <input\r\n id=\"date-min\"\r\n placeholder=\"${this.dateFormat}\"\r\n type=\"text\"\r\n @focus=\"${this.cancelPendingUpdateEvent}\"\r\n @blur=\"${this.handleMinDateInput}\"\r\n @keyup=\"${this.handleKeyUp}\"\r\n .value=\"${live(this.minSelectedDate)}\"\r\n ?disabled=\"${this.disabled}\"\r\n />\r\n `;\r\n }\r\n\r\n get maxInputTemplate(): TemplateResult {\r\n return html`\r\n <input\r\n id=\"date-max\"\r\n placeholder=\"${this.dateFormat}\"\r\n type=\"text\"\r\n @focus=\"${this.cancelPendingUpdateEvent}\"\r\n @blur=\"${this.handleMaxDateInput}\"\r\n @keyup=\"${this.handleKeyUp}\"\r\n .value=\"${live(this.maxSelectedDate)}\"\r\n ?disabled=\"${this.disabled}\"\r\n />\r\n `;\r\n }\r\n\r\n get tooltipTemplate(): TemplateResult {\r\n return html`\r\n <style>\r\n #tooltip {\r\n width: ${this.tooltipWidth}px;\r\n height: ${this.tooltipHeight}px;\r\n top: ${-9 - this.tooltipHeight}px;\r\n left: ${this._tooltipOffset}px;\r\n display: ${this._tooltipVisible ? 'block' : 'none'};\r\n }\r\n #tooltip:after {\r\n left: ${this.tooltipWidth / 2}px;\r\n }\r\n </style>\r\n <div id=\"tooltip\">${this._tooltipContent}</div>\r\n `;\r\n }\r\n\r\n private get noDataTemplate(): TemplateResult {\r\n return html`\r\n <div class=\"missing-data-message\">${this.missingDataMessage}</div>\r\n `;\r\n }\r\n\r\n private get activityIndicatorTemplate(): TemplateResult | typeof nothing {\r\n if (!this.loading) {\r\n return nothing;\r\n }\r\n return html`\r\n <ia-activity-indicator mode=\"processing\"> </ia-activity-indicator>\r\n `;\r\n }\r\n\r\n static styles = css`\r\n .missing-data-message {\r\n text-align: center;\r\n }\r\n #container {\r\n margin: 0;\r\n touch-action: none;\r\n position: relative;\r\n }\r\n .disabled {\r\n opacity: 0.3;\r\n }\r\n ia-activity-indicator {\r\n position: absolute;\r\n left: calc(50% - 10px);\r\n top: 10px;\r\n width: 20px;\r\n height: 20px;\r\n --activityIndicatorLoadingDotColor: rgba(0, 0, 0, 0);\r\n --activityIndicatorLoadingRingColor: ${activityIndicatorColor};\r\n }\r\n\r\n /* prevent selection from interfering with tooltip, especially on mobile */\r\n /* https://stackoverflow.com/a/4407335/1163042 */\r\n .noselect {\r\n -webkit-touch-callout: none; /* iOS Safari */\r\n -webkit-user-select: none; /* Safari */\r\n -moz-user-select: none; /* Old versions of Firefox */\r\n -ms-user-select: none; /* Internet Explorer/Edge */\r\n user-select: none; /* current Chrome, Edge, Opera and Firefox */\r\n }\r\n .bar {\r\n /* create a transparent border around the hist bars to prevent \"gaps\" and\r\n flickering when moving around between bars. this also helps with handling\r\n clicks on the bars, preventing users from being able to click in between\r\n bars */\r\n stroke: rgba(0, 0, 0, 0);\r\n /* ensure transparent stroke wide enough to cover gap between bars */\r\n stroke-width: 2px;\r\n }\r\n .bar:hover {\r\n /* highlight currently hovered bar */\r\n fill-opacity: 0.7;\r\n }\r\n .disabled .bar:hover {\r\n /* ensure no visual hover interaction when disabled */\r\n fill-opacity: 1;\r\n }\r\n /****** histogram ********/\r\n #tooltip {\r\n position: absolute;\r\n background: ${tooltipBackgroundColor};\r\n color: ${tooltipTextColor};\r\n text-align: center;\r\n border-radius: 3px;\r\n padding: 2px;\r\n font-size: ${tooltipFontSize};\r\n font-family: ${tooltipFontFamily};\r\n touch-action: none;\r\n pointer-events: none;\r\n }\r\n #tooltip:after {\r\n content: '';\r\n position: absolute;\r\n margin-left: -5px;\r\n top: 100%;\r\n /* arrow */\r\n border: 5px solid ${tooltipTextColor};\r\n border-color: ${tooltipBackgroundColor} transparent transparent\r\n transparent;\r\n }\r\n /****** slider ********/\r\n .draggable:hover {\r\n cursor: grab;\r\n }\r\n .dragging {\r\n cursor: grabbing !important;\r\n }\r\n /****** inputs ********/\r\n #inputs {\r\n display: flex;\r\n justify-content: center;\r\n }\r\n #inputs .dash {\r\n position: relative;\r\n bottom: -1px;\r\n }\r\n input {\r\n width: ${inputWidth};\r\n margin: 0 3px;\r\n border: ${inputBorder};\r\n border-radius: 2px !important;\r\n text-align: center;\r\n font-size: ${inputFontSize};\r\n font-family: ${inputFontFamily};\r\n }\r\n `;\r\n\r\n render(): TemplateResult {\r\n if (!this.hasBinData) {\r\n return this.noDataTemplate;\r\n }\r\n return html`\r\n <div\r\n id=\"container\"\r\n class=\"\r\n noselect\r\n ${this._isDragging ? 'dragging' : ''}\r\n \"\r\n style=\"width: ${this.width}px\"\r\n >\r\n ${this.activityIndicatorTemplate} ${this.tooltipTemplate}\r\n <div\r\n class=\"inner-container\r\n ${this.disabled ? 'disabled' : ''}\"\r\n >\r\n <svg\r\n width=\"${this.width}\"\r\n height=\"${this.height}\"\r\n @pointerleave=\"${this.drop}\"\r\n >\r\n ${this.selectedRangeTemplate}\r\n <svg id=\"histogram\">${this.histogramTemplate}</svg>\r\n ${this.minSliderTemplate} ${this.maxSliderTemplate}\r\n </svg>\r\n <div id=\"inputs\">\r\n ${this.minInputTemplate}\r\n <div class=\"dash\">-</div>\r\n ${this.maxInputTemplate}\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n// help TypeScript provide strong typing when interacting with DOM APIs\r\n// https://stackoverflow.com/questions/65148695/lit-element-typescript-project-global-interface-declaration-necessary\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'histogram-date-range': HistogramDateRange;\r\n }\r\n}\r\n"]}
@@ -1,8 +1,6 @@
1
1
  {
2
2
  "imports": {
3
3
  "@internetarchive/ia-activity-indicator/ia-activity-indicator": "./@internetarchive/ia-activity-indicator/ia-activity-indicator.js",
4
- "dayjs/esm/index.js": "./dayjs/esm/index.js",
5
- "dayjs/esm/plugin/customParseFormat": "./dayjs/esm/plugin/customParseFormat.js",
6
4
  "lit": "./lit.js",
7
5
  "lit/decorators.js": "./lit/decorators.js",
8
6
  "lit/directives/live.js": "./lit/directives/live.js"
@@ -18,10 +18,10 @@ import {
18
18
  } from "../../_snowpack/pkg/lit.js";
19
19
  import {property, state, customElement} from "../../_snowpack/pkg/lit/decorators.js";
20
20
  import {live} from "../../_snowpack/pkg/lit/directives/live.js";
21
- import dayjs from "../../_snowpack/pkg/dayjs/esm/index.js";
22
- import customParseFormat from "../../_snowpack/pkg/dayjs/esm/plugin/customParseFormat.js";
23
- dayjs.extend(customParseFormat);
24
21
  import "../../_snowpack/pkg/@internetarchive/ia-activity-indicator/ia-activity-indicator.js";
22
+ import dayjs from "https://esm.archive.org/dayjs@^1.10.7";
23
+ import customParseFormat from "https://esm.archive.org/dayjs@1.9.4/esm/plugin/customParseFormat";
24
+ dayjs.extend(customParseFormat);
25
25
  const WIDTH = 180;
26
26
  const HEIGHT = 40;
27
27
  const SLIDER_WIDTH = 10;
@@ -90,7 +90,8 @@ export let HistogramDateRange = class extends LitElement {
90
90
  this._isDragging = false;
91
91
  };
92
92
  this.move = (e) => {
93
- const newX = e.offsetX - this._dragOffset;
93
+ const histogramClientX = this.getBoundingClientRect().x;
94
+ const newX = e.clientX - histogramClientX - this._dragOffset;
94
95
  const slider = this._currentSlider;
95
96
  if (slider.id === "slider-min") {
96
97
  this.minSelectedDate = this.translatePositionToDate(this.validMinSliderX(newX));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/histogram-date-range",
3
- "version": "0.1.8-alpha.2",
3
+ "version": "0.1.8-alpha.4",
4
4
  "description": "Internet Archive histogram date range picker",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "dist/index.js",
@@ -10,11 +10,20 @@ import {
10
10
  } from 'lit';
11
11
  import { property, state, customElement } from 'lit/decorators.js';
12
12
  import { live } from 'lit/directives/live.js';
13
- import dayjs from 'dayjs/esm/index.js';
14
- import customParseFormat from 'dayjs/esm/plugin/customParseFormat';
15
- dayjs.extend(customParseFormat);
16
13
  import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
17
14
 
15
+ /* eslint-disable-next-line */
16
+ /* @ts-ignore Import module -- JS, so no types */
17
+ import dayjs from 'https://esm.archive.org/dayjs@^1.10.7';
18
+ /* eslint-disable-next-line */
19
+ /* @ts-ignore Import module -- JS, so no types */
20
+ import customParseFormat from 'https://esm.archive.org/dayjs@1.9.4/esm/plugin/customParseFormat';
21
+ // NOTE: using a specific *earlier* pegged commit for the plugin ^, because esm.archive.org is has a
22
+ // problem creating later versions where the `export` of an included `utils.js` gets mangled. Eg:
23
+ // https://github.com/internetarchive/esbuild_es5/commit/ce19e8b841282c0e94d2b8e6830fd7744b2216c2#diff-4b2ed47327851d566740a30ce5f60271c059ae67eff2006bc07bb7c4fcee8b50L296
24
+
25
+ dayjs.extend(customParseFormat);
26
+
18
27
  // these values can be overridden via the component's HTML (camelCased) attributes
19
28
  const WIDTH = 180;
20
29
  const HEIGHT = 40;
@@ -310,7 +319,8 @@ export class HistogramDateRange extends LitElement {
310
319
  * @param e PointerEvent from the slider being moved
311
320
  */
312
321
  private move = (e: PointerEvent): void => {
313
- const newX = e.offsetX - this._dragOffset;
322
+ const histogramClientX = this.getBoundingClientRect().x;
323
+ const newX = e.clientX - histogramClientX - this._dragOffset;
314
324
  const slider = this._currentSlider as SVGRectElement;
315
325
  if ((slider.id as SliderId) === 'slider-min') {
316
326
  this.minSelectedDate = this.translatePositionToDate(
@@ -1,522 +0,0 @@
1
- var SECONDS_A_MINUTE = 60;
2
- var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
3
- var SECONDS_A_DAY = SECONDS_A_HOUR * 24;
4
- var SECONDS_A_WEEK = SECONDS_A_DAY * 7;
5
- var MILLISECONDS_A_SECOND = 1e3;
6
- var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
7
- var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
8
- var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
9
- var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
10
-
11
- var MS = 'millisecond';
12
- var S = 'second';
13
- var MIN = 'minute';
14
- var H = 'hour';
15
- var D = 'day';
16
- var W = 'week';
17
- var M = 'month';
18
- var Q = 'quarter';
19
- var Y = 'year';
20
- var DATE = 'date';
21
- var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';
22
- var INVALID_DATE_STRING = 'Invalid Date'; // regex
23
-
24
- var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
25
- var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
26
-
27
- // English [en]
28
- // We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale
29
- var en = {
30
- name: 'en',
31
- weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
32
- months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_')
33
- };
34
-
35
- var padStart = function padStart(string, length, pad) {
36
- var s = String(string);
37
- if (!s || s.length >= length) return string;
38
- return "" + Array(length + 1 - s.length).join(pad) + string;
39
- };
40
-
41
- var padZoneStr = function padZoneStr(instance) {
42
- var negMinutes = -instance.utcOffset();
43
- var minutes = Math.abs(negMinutes);
44
- var hourOffset = Math.floor(minutes / 60);
45
- var minuteOffset = minutes % 60;
46
- return "" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + ":" + padStart(minuteOffset, 2, '0');
47
- };
48
-
49
- var monthDiff = function monthDiff(a, b) {
50
- // function from moment.js in order to keep the same result
51
- if (a.date() < b.date()) return -monthDiff(b, a);
52
- var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());
53
- var anchor = a.clone().add(wholeMonthDiff, M);
54
- var c = b - anchor < 0;
55
- var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), M);
56
- return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);
57
- };
58
-
59
- var absFloor = function absFloor(n) {
60
- return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);
61
- };
62
-
63
- var prettyUnit = function prettyUnit(u) {
64
- var special = {
65
- M: M,
66
- y: Y,
67
- w: W,
68
- d: D,
69
- D: DATE,
70
- h: H,
71
- m: MIN,
72
- s: S,
73
- ms: MS,
74
- Q: Q
75
- };
76
- return special[u] || String(u || '').toLowerCase().replace(/s$/, '');
77
- };
78
-
79
- var isUndefined = function isUndefined(s) {
80
- return s === undefined;
81
- };
82
-
83
- var U = {
84
- s: padStart,
85
- z: padZoneStr,
86
- m: monthDiff,
87
- a: absFloor,
88
- p: prettyUnit,
89
- u: isUndefined
90
- };
91
-
92
- var L = 'en'; // global locale
93
-
94
- var Ls = {}; // global loaded locale
95
-
96
- Ls[L] = en;
97
-
98
- var isDayjs = function isDayjs(d) {
99
- return d instanceof Dayjs;
100
- }; // eslint-disable-line no-use-before-define
101
-
102
-
103
- var parseLocale = function parseLocale(preset, object, isLocal) {
104
- var l;
105
- if (!preset) return L;
106
-
107
- if (typeof preset === 'string') {
108
- if (Ls[preset]) {
109
- l = preset;
110
- }
111
-
112
- if (object) {
113
- Ls[preset] = object;
114
- l = preset;
115
- }
116
- } else {
117
- var name = preset.name;
118
- Ls[name] = preset;
119
- l = name;
120
- }
121
-
122
- if (!isLocal && l) L = l;
123
- return l || !isLocal && L;
124
- };
125
-
126
- var dayjs = function dayjs(date, c) {
127
- if (isDayjs(date)) {
128
- return date.clone();
129
- } // eslint-disable-next-line no-nested-ternary
130
-
131
-
132
- var cfg = typeof c === 'object' ? c : {};
133
- cfg.date = date;
134
- cfg.args = arguments; // eslint-disable-line prefer-rest-params
135
-
136
- return new Dayjs(cfg); // eslint-disable-line no-use-before-define
137
- };
138
-
139
- var wrapper = function wrapper(date, instance) {
140
- return dayjs(date, {
141
- locale: instance.$L,
142
- utc: instance.$u,
143
- x: instance.$x,
144
- $offset: instance.$offset // todo: refactor; do not use this.$offset in you code
145
-
146
- });
147
- };
148
-
149
- var Utils = U; // for plugin use
150
-
151
- Utils.l = parseLocale;
152
- Utils.i = isDayjs;
153
- Utils.w = wrapper;
154
-
155
- var parseDate = function parseDate(cfg) {
156
- var date = cfg.date,
157
- utc = cfg.utc;
158
- if (date === null) return new Date(NaN); // null is invalid
159
-
160
- if (Utils.u(date)) return new Date(); // today
161
-
162
- if (date instanceof Date) return new Date(date);
163
-
164
- if (typeof date === 'string' && !/Z$/i.test(date)) {
165
- var d = date.match(REGEX_PARSE);
166
-
167
- if (d) {
168
- var m = d[2] - 1 || 0;
169
- var ms = (d[7] || '0').substring(0, 3);
170
-
171
- if (utc) {
172
- return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));
173
- }
174
-
175
- return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);
176
- }
177
- }
178
-
179
- return new Date(date); // everything else
180
- };
181
-
182
- var Dayjs = /*#__PURE__*/function () {
183
- function Dayjs(cfg) {
184
- this.$L = parseLocale(cfg.locale, null, true);
185
- this.parse(cfg); // for plugin
186
- }
187
-
188
- var _proto = Dayjs.prototype;
189
-
190
- _proto.parse = function parse(cfg) {
191
- this.$d = parseDate(cfg);
192
- this.$x = cfg.x || {};
193
- this.init();
194
- };
195
-
196
- _proto.init = function init() {
197
- var $d = this.$d;
198
- this.$y = $d.getFullYear();
199
- this.$M = $d.getMonth();
200
- this.$D = $d.getDate();
201
- this.$W = $d.getDay();
202
- this.$H = $d.getHours();
203
- this.$m = $d.getMinutes();
204
- this.$s = $d.getSeconds();
205
- this.$ms = $d.getMilliseconds();
206
- } // eslint-disable-next-line class-methods-use-this
207
- ;
208
-
209
- _proto.$utils = function $utils() {
210
- return Utils;
211
- };
212
-
213
- _proto.isValid = function isValid() {
214
- return !(this.$d.toString() === INVALID_DATE_STRING);
215
- };
216
-
217
- _proto.isSame = function isSame(that, units) {
218
- var other = dayjs(that);
219
- return this.startOf(units) <= other && other <= this.endOf(units);
220
- };
221
-
222
- _proto.isAfter = function isAfter(that, units) {
223
- return dayjs(that) < this.startOf(units);
224
- };
225
-
226
- _proto.isBefore = function isBefore(that, units) {
227
- return this.endOf(units) < dayjs(that);
228
- };
229
-
230
- _proto.$g = function $g(input, get, set) {
231
- if (Utils.u(input)) return this[get];
232
- return this.set(set, input);
233
- };
234
-
235
- _proto.unix = function unix() {
236
- return Math.floor(this.valueOf() / 1000);
237
- };
238
-
239
- _proto.valueOf = function valueOf() {
240
- // timezone(hour) * 60 * 60 * 1000 => ms
241
- return this.$d.getTime();
242
- };
243
-
244
- _proto.startOf = function startOf(units, _startOf) {
245
- var _this = this;
246
-
247
- // startOf -> endOf
248
- var isStartOf = !Utils.u(_startOf) ? _startOf : true;
249
- var unit = Utils.p(units);
250
-
251
- var instanceFactory = function instanceFactory(d, m) {
252
- var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);
253
- return isStartOf ? ins : ins.endOf(D);
254
- };
255
-
256
- var instanceFactorySet = function instanceFactorySet(method, slice) {
257
- var argumentStart = [0, 0, 0, 0];
258
- var argumentEnd = [23, 59, 59, 999];
259
- return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread
260
- _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);
261
- };
262
-
263
- var $W = this.$W,
264
- $M = this.$M,
265
- $D = this.$D;
266
- var utcPad = "set" + (this.$u ? 'UTC' : '');
267
-
268
- switch (unit) {
269
- case Y:
270
- return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);
271
-
272
- case M:
273
- return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);
274
-
275
- case W:
276
- {
277
- var weekStart = this.$locale().weekStart || 0;
278
- var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;
279
- return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);
280
- }
281
-
282
- case D:
283
- case DATE:
284
- return instanceFactorySet(utcPad + "Hours", 0);
285
-
286
- case H:
287
- return instanceFactorySet(utcPad + "Minutes", 1);
288
-
289
- case MIN:
290
- return instanceFactorySet(utcPad + "Seconds", 2);
291
-
292
- case S:
293
- return instanceFactorySet(utcPad + "Milliseconds", 3);
294
-
295
- default:
296
- return this.clone();
297
- }
298
- };
299
-
300
- _proto.endOf = function endOf(arg) {
301
- return this.startOf(arg, false);
302
- };
303
-
304
- _proto.$set = function $set(units, _int) {
305
- var _C$D$C$DATE$C$M$C$Y$C;
306
-
307
- // private set
308
- var unit = Utils.p(units);
309
- var utcPad = "set" + (this.$u ? 'UTC' : '');
310
- var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[D] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[DATE] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[M] = utcPad + "Month", _C$D$C$DATE$C$M$C$Y$C[Y] = utcPad + "FullYear", _C$D$C$DATE$C$M$C$Y$C[H] = utcPad + "Hours", _C$D$C$DATE$C$M$C$Y$C[MIN] = utcPad + "Minutes", _C$D$C$DATE$C$M$C$Y$C[S] = utcPad + "Seconds", _C$D$C$DATE$C$M$C$Y$C[MS] = utcPad + "Milliseconds", _C$D$C$DATE$C$M$C$Y$C)[unit];
311
- var arg = unit === D ? this.$D + (_int - this.$W) : _int;
312
-
313
- if (unit === M || unit === Y) {
314
- // clone is for badMutable plugin
315
- var date = this.clone().set(DATE, 1);
316
- date.$d[name](arg);
317
- date.init();
318
- this.$d = date.set(DATE, Math.min(this.$D, date.daysInMonth())).$d;
319
- } else if (name) this.$d[name](arg);
320
-
321
- this.init();
322
- return this;
323
- };
324
-
325
- _proto.set = function set(string, _int2) {
326
- return this.clone().$set(string, _int2);
327
- };
328
-
329
- _proto.get = function get(unit) {
330
- return this[Utils.p(unit)]();
331
- };
332
-
333
- _proto.add = function add(number, units) {
334
- var _this2 = this,
335
- _C$MIN$C$H$C$S$unit;
336
-
337
- number = Number(number); // eslint-disable-line no-param-reassign
338
-
339
- var unit = Utils.p(units);
340
-
341
- var instanceFactorySet = function instanceFactorySet(n) {
342
- var d = dayjs(_this2);
343
- return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);
344
- };
345
-
346
- if (unit === M) {
347
- return this.set(M, this.$M + number);
348
- }
349
-
350
- if (unit === Y) {
351
- return this.set(Y, this.$y + number);
352
- }
353
-
354
- if (unit === D) {
355
- return instanceFactorySet(1);
356
- }
357
-
358
- if (unit === W) {
359
- return instanceFactorySet(7);
360
- }
361
-
362
- var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[MIN] = MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[H] = MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[S] = MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms
363
-
364
- var nextTimeStamp = this.$d.getTime() + number * step;
365
- return Utils.w(nextTimeStamp, this);
366
- };
367
-
368
- _proto.subtract = function subtract(number, string) {
369
- return this.add(number * -1, string);
370
- };
371
-
372
- _proto.format = function format(formatStr) {
373
- var _this3 = this;
374
-
375
- var locale = this.$locale();
376
- if (!this.isValid()) return locale.invalidDate || INVALID_DATE_STRING;
377
- var str = formatStr || FORMAT_DEFAULT;
378
- var zoneStr = Utils.z(this);
379
- var $H = this.$H,
380
- $m = this.$m,
381
- $M = this.$M;
382
- var weekdays = locale.weekdays,
383
- months = locale.months,
384
- meridiem = locale.meridiem;
385
-
386
- var getShort = function getShort(arr, index, full, length) {
387
- return arr && (arr[index] || arr(_this3, str)) || full[index].substr(0, length);
388
- };
389
-
390
- var get$H = function get$H(num) {
391
- return Utils.s($H % 12 || 12, num, '0');
392
- };
393
-
394
- var meridiemFunc = meridiem || function (hour, minute, isLowercase) {
395
- var m = hour < 12 ? 'AM' : 'PM';
396
- return isLowercase ? m.toLowerCase() : m;
397
- };
398
-
399
- var matches = {
400
- YY: String(this.$y).slice(-2),
401
- YYYY: this.$y,
402
- M: $M + 1,
403
- MM: Utils.s($M + 1, 2, '0'),
404
- MMM: getShort(locale.monthsShort, $M, months, 3),
405
- MMMM: getShort(months, $M),
406
- D: this.$D,
407
- DD: Utils.s(this.$D, 2, '0'),
408
- d: String(this.$W),
409
- dd: getShort(locale.weekdaysMin, this.$W, weekdays, 2),
410
- ddd: getShort(locale.weekdaysShort, this.$W, weekdays, 3),
411
- dddd: weekdays[this.$W],
412
- H: String($H),
413
- HH: Utils.s($H, 2, '0'),
414
- h: get$H(1),
415
- hh: get$H(2),
416
- a: meridiemFunc($H, $m, true),
417
- A: meridiemFunc($H, $m, false),
418
- m: String($m),
419
- mm: Utils.s($m, 2, '0'),
420
- s: String(this.$s),
421
- ss: Utils.s(this.$s, 2, '0'),
422
- SSS: Utils.s(this.$ms, 3, '0'),
423
- Z: zoneStr // 'ZZ' logic below
424
-
425
- };
426
- return str.replace(REGEX_FORMAT, function (match, $1) {
427
- return $1 || matches[match] || zoneStr.replace(':', '');
428
- }); // 'ZZ'
429
- };
430
-
431
- _proto.utcOffset = function utcOffset() {
432
- // Because a bug at FF24, we're rounding the timezone offset around 15 minutes
433
- // https://github.com/moment/moment/pull/1871
434
- return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;
435
- };
436
-
437
- _proto.diff = function diff(input, units, _float) {
438
- var _C$Y$C$M$C$Q$C$W$C$D$;
439
-
440
- var unit = Utils.p(units);
441
- var that = dayjs(input);
442
- var zoneDelta = (that.utcOffset() - this.utcOffset()) * MILLISECONDS_A_MINUTE;
443
- var diff = this - that;
444
- var result = Utils.m(this, that);
445
- result = (_C$Y$C$M$C$Q$C$W$C$D$ = {}, _C$Y$C$M$C$Q$C$W$C$D$[Y] = result / 12, _C$Y$C$M$C$Q$C$W$C$D$[M] = result, _C$Y$C$M$C$Q$C$W$C$D$[Q] = result / 3, _C$Y$C$M$C$Q$C$W$C$D$[W] = (diff - zoneDelta) / MILLISECONDS_A_WEEK, _C$Y$C$M$C$Q$C$W$C$D$[D] = (diff - zoneDelta) / MILLISECONDS_A_DAY, _C$Y$C$M$C$Q$C$W$C$D$[H] = diff / MILLISECONDS_A_HOUR, _C$Y$C$M$C$Q$C$W$C$D$[MIN] = diff / MILLISECONDS_A_MINUTE, _C$Y$C$M$C$Q$C$W$C$D$[S] = diff / MILLISECONDS_A_SECOND, _C$Y$C$M$C$Q$C$W$C$D$)[unit] || diff; // milliseconds
446
-
447
- return _float ? result : Utils.a(result);
448
- };
449
-
450
- _proto.daysInMonth = function daysInMonth() {
451
- return this.endOf(M).$D;
452
- };
453
-
454
- _proto.$locale = function $locale() {
455
- // get locale object
456
- return Ls[this.$L];
457
- };
458
-
459
- _proto.locale = function locale(preset, object) {
460
- if (!preset) return this.$L;
461
- var that = this.clone();
462
- var nextLocaleName = parseLocale(preset, object, true);
463
- if (nextLocaleName) that.$L = nextLocaleName;
464
- return that;
465
- };
466
-
467
- _proto.clone = function clone() {
468
- return Utils.w(this.$d, this);
469
- };
470
-
471
- _proto.toDate = function toDate() {
472
- return new Date(this.valueOf());
473
- };
474
-
475
- _proto.toJSON = function toJSON() {
476
- return this.isValid() ? this.toISOString() : null;
477
- };
478
-
479
- _proto.toISOString = function toISOString() {
480
- // ie 8 return
481
- // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)
482
- // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')
483
- return this.$d.toISOString();
484
- };
485
-
486
- _proto.toString = function toString() {
487
- return this.$d.toUTCString();
488
- };
489
-
490
- return Dayjs;
491
- }();
492
-
493
- var proto = Dayjs.prototype;
494
- dayjs.prototype = proto;
495
- [['$ms', MS], ['$s', S], ['$m', MIN], ['$H', H], ['$W', D], ['$M', M], ['$y', Y], ['$D', DATE]].forEach(function (g) {
496
- proto[g[1]] = function (input) {
497
- return this.$g(input, g[0], g[1]);
498
- };
499
- });
500
-
501
- dayjs.extend = function (plugin, option) {
502
- if (!plugin.$i) {
503
- // install plugin only once
504
- plugin(option, Dayjs, dayjs);
505
- plugin.$i = true;
506
- }
507
-
508
- return dayjs;
509
- };
510
-
511
- dayjs.locale = parseLocale;
512
- dayjs.isDayjs = isDayjs;
513
-
514
- dayjs.unix = function (timestamp) {
515
- return dayjs(timestamp * 1e3);
516
- };
517
-
518
- dayjs.en = Ls[L];
519
- dayjs.Ls = Ls;
520
- dayjs.p = {};
521
-
522
- export default dayjs;
@@ -1,342 +0,0 @@
1
- // eslint-disable-next-line import/prefer-default-export
2
- var t = function t(format) {
3
- return format.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function (_, a, b) {
4
- return a || b.slice(1);
5
- });
6
- };
7
- var englishFormats = {
8
- LTS: 'h:mm:ss A',
9
- LT: 'h:mm A',
10
- L: 'MM/DD/YYYY',
11
- LL: 'MMMM D, YYYY',
12
- LLL: 'MMMM D, YYYY h:mm A',
13
- LLLL: 'dddd, MMMM D, YYYY h:mm A'
14
- };
15
- var u = function u(formatStr, formats) {
16
- return formatStr.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function (_, a, b) {
17
- var B = b && b.toUpperCase();
18
- return a || formats[b] || englishFormats[b] || t(formats[B]);
19
- });
20
- };
21
-
22
- var formattingTokens = /(\[[^[]*\])|([-:/.()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g;
23
- var match1 = /\d/; // 0 - 9
24
-
25
- var match2 = /\d\d/; // 00 - 99
26
-
27
- var match3 = /\d{3}/; // 000 - 999
28
-
29
- var match4 = /\d{4}/; // 0000 - 9999
30
-
31
- var match1to2 = /\d\d?/; // 0 - 99
32
-
33
- var matchSigned = /[+-]?\d+/; // -inf - inf
34
-
35
- var matchOffset = /[+-]\d\d:?(\d\d)?|Z/; // +00:00 -00:00 +0000 or -0000 +00 or Z
36
-
37
- var matchWord = /\d*[^\s\d-_:/()]+/; // Word
38
-
39
- var locale = {};
40
-
41
- var parseTwoDigitYear = function parseTwoDigitYear(input) {
42
- input = +input;
43
- return input + (input > 68 ? 1900 : 2000);
44
- };
45
-
46
- function offsetFromString(string) {
47
- if (!string) return 0;
48
- if (string === 'Z') return 0;
49
- var parts = string.match(/([+-]|\d\d)/g);
50
- var minutes = +(parts[1] * 60) + (+parts[2] || 0);
51
- return minutes === 0 ? 0 : parts[0] === '+' ? -minutes : minutes; // eslint-disable-line no-nested-ternary
52
- }
53
-
54
- var addInput = function addInput(property) {
55
- return function (input) {
56
- this[property] = +input;
57
- };
58
- };
59
-
60
- var zoneExpressions = [matchOffset, function (input) {
61
- var zone = this.zone || (this.zone = {});
62
- zone.offset = offsetFromString(input);
63
- }];
64
-
65
- var getLocalePart = function getLocalePart(name) {
66
- var part = locale[name];
67
- return part && (part.indexOf ? part : part.s.concat(part.f));
68
- };
69
-
70
- var meridiemMatch = function meridiemMatch(input, isLowerCase) {
71
- var isAfternoon;
72
- var _locale = locale,
73
- meridiem = _locale.meridiem;
74
-
75
- if (!meridiem) {
76
- isAfternoon = input === (isLowerCase ? 'pm' : 'PM');
77
- } else {
78
- for (var i = 1; i <= 24; i += 1) {
79
- // todo: fix input === meridiem(i, 0, isLowerCase)
80
- if (input.indexOf(meridiem(i, 0, isLowerCase)) > -1) {
81
- isAfternoon = i > 12;
82
- break;
83
- }
84
- }
85
- }
86
-
87
- return isAfternoon;
88
- };
89
-
90
- var expressions = {
91
- A: [matchWord, function (input) {
92
- this.afternoon = meridiemMatch(input, false);
93
- }],
94
- a: [matchWord, function (input) {
95
- this.afternoon = meridiemMatch(input, true);
96
- }],
97
- S: [match1, function (input) {
98
- this.milliseconds = +input * 100;
99
- }],
100
- SS: [match2, function (input) {
101
- this.milliseconds = +input * 10;
102
- }],
103
- SSS: [match3, function (input) {
104
- this.milliseconds = +input;
105
- }],
106
- s: [match1to2, addInput('seconds')],
107
- ss: [match1to2, addInput('seconds')],
108
- m: [match1to2, addInput('minutes')],
109
- mm: [match1to2, addInput('minutes')],
110
- H: [match1to2, addInput('hours')],
111
- h: [match1to2, addInput('hours')],
112
- HH: [match1to2, addInput('hours')],
113
- hh: [match1to2, addInput('hours')],
114
- D: [match1to2, addInput('day')],
115
- DD: [match2, addInput('day')],
116
- Do: [matchWord, function (input) {
117
- var _locale2 = locale,
118
- ordinal = _locale2.ordinal;
119
-
120
- var _input$match = input.match(/\d+/);
121
-
122
- this.day = _input$match[0];
123
- if (!ordinal) return;
124
-
125
- for (var i = 1; i <= 31; i += 1) {
126
- if (ordinal(i).replace(/\[|\]/g, '') === input) {
127
- this.day = i;
128
- }
129
- }
130
- }],
131
- M: [match1to2, addInput('month')],
132
- MM: [match2, addInput('month')],
133
- MMM: [matchWord, function (input) {
134
- var months = getLocalePart('months');
135
- var monthsShort = getLocalePart('monthsShort');
136
- var matchIndex = (monthsShort || months.map(function (_) {
137
- return _.substr(0, 3);
138
- })).indexOf(input) + 1;
139
-
140
- if (matchIndex < 1) {
141
- throw new Error();
142
- }
143
-
144
- this.month = matchIndex % 12 || matchIndex;
145
- }],
146
- MMMM: [matchWord, function (input) {
147
- var months = getLocalePart('months');
148
- var matchIndex = months.indexOf(input) + 1;
149
-
150
- if (matchIndex < 1) {
151
- throw new Error();
152
- }
153
-
154
- this.month = matchIndex % 12 || matchIndex;
155
- }],
156
- Y: [matchSigned, addInput('year')],
157
- YY: [match2, function (input) {
158
- this.year = parseTwoDigitYear(input);
159
- }],
160
- YYYY: [match4, addInput('year')],
161
- Z: zoneExpressions,
162
- ZZ: zoneExpressions
163
- };
164
-
165
- function correctHours(time) {
166
- var afternoon = time.afternoon;
167
-
168
- if (afternoon !== undefined) {
169
- var hours = time.hours;
170
-
171
- if (afternoon) {
172
- if (hours < 12) {
173
- time.hours += 12;
174
- }
175
- } else if (hours === 12) {
176
- time.hours = 0;
177
- }
178
-
179
- delete time.afternoon;
180
- }
181
- }
182
-
183
- function makeParser(format) {
184
- format = u(format, locale && locale.formats);
185
- var array = format.match(formattingTokens);
186
- var length = array.length;
187
-
188
- for (var i = 0; i < length; i += 1) {
189
- var token = array[i];
190
- var parseTo = expressions[token];
191
- var regex = parseTo && parseTo[0];
192
- var parser = parseTo && parseTo[1];
193
-
194
- if (parser) {
195
- array[i] = {
196
- regex: regex,
197
- parser: parser
198
- };
199
- } else {
200
- array[i] = token.replace(/^\[|\]$/g, '');
201
- }
202
- }
203
-
204
- return function (input) {
205
- var time = {};
206
-
207
- for (var _i = 0, start = 0; _i < length; _i += 1) {
208
- var _token = array[_i];
209
-
210
- if (typeof _token === 'string') {
211
- start += _token.length;
212
- } else {
213
- var _regex = _token.regex,
214
- _parser = _token.parser;
215
- var part = input.substr(start);
216
-
217
- var match = _regex.exec(part);
218
-
219
- var value = match[0];
220
-
221
- _parser.call(time, value);
222
-
223
- input = input.replace(value, '');
224
- }
225
- }
226
-
227
- correctHours(time);
228
- return time;
229
- };
230
- }
231
-
232
- var parseFormattedInput = function parseFormattedInput(input, format, utc) {
233
- try {
234
- if (['x', 'X'].indexOf(format) > -1) return new Date((format === 'X' ? 1000 : 1) * input);
235
- var parser = makeParser(format);
236
-
237
- var _parser2 = parser(input),
238
- year = _parser2.year,
239
- month = _parser2.month,
240
- day = _parser2.day,
241
- hours = _parser2.hours,
242
- minutes = _parser2.minutes,
243
- seconds = _parser2.seconds,
244
- milliseconds = _parser2.milliseconds,
245
- zone = _parser2.zone;
246
-
247
- var now = new Date();
248
- var d = day || (!year && !month ? now.getDate() : 1);
249
- var y = year || now.getFullYear();
250
- var M = 0;
251
-
252
- if (!(year && !month)) {
253
- M = month > 0 ? month - 1 : now.getMonth();
254
- }
255
-
256
- var h = hours || 0;
257
- var m = minutes || 0;
258
- var s = seconds || 0;
259
- var ms = milliseconds || 0;
260
-
261
- if (zone) {
262
- return new Date(Date.UTC(y, M, d, h, m, s, ms + zone.offset * 60 * 1000));
263
- }
264
-
265
- if (utc) {
266
- return new Date(Date.UTC(y, M, d, h, m, s, ms));
267
- }
268
-
269
- return new Date(y, M, d, h, m, s, ms);
270
- } catch (e) {
271
- return new Date(''); // Invalid Date
272
- }
273
- };
274
-
275
- var __pika_web_default_export_for_treeshaking__ = (function (o, C, d) {
276
- d.p.customParseFormat = true;
277
-
278
- if (o && o.parseTwoDigitYear) {
279
- parseTwoDigitYear = o.parseTwoDigitYear;
280
- }
281
-
282
- var proto = C.prototype;
283
- var oldParse = proto.parse;
284
-
285
- proto.parse = function (cfg) {
286
- var date = cfg.date,
287
- utc = cfg.utc,
288
- args = cfg.args;
289
- this.$u = utc;
290
- var format = args[1];
291
-
292
- if (typeof format === 'string') {
293
- var isStrictWithoutLocale = args[2] === true;
294
- var isStrictWithLocale = args[3] === true;
295
- var isStrict = isStrictWithoutLocale || isStrictWithLocale;
296
- var pl = args[2];
297
-
298
- if (isStrictWithLocale) {
299
- pl = args[2];
300
- }
301
-
302
- locale = this.$locale();
303
-
304
- if (!isStrictWithoutLocale && pl) {
305
- locale = d.Ls[pl];
306
- }
307
-
308
- this.$d = parseFormattedInput(date, format, utc);
309
- this.init();
310
- if (pl && pl !== true) this.$L = this.locale(pl).$L; // use != to treat
311
- // input number 1410715640579 and format string '1410715640579' equal
312
- // eslint-disable-next-line eqeqeq
313
-
314
- if (isStrict && date != this.format(format)) {
315
- this.$d = new Date('');
316
- } // reset global locale to make parallel unit test
317
-
318
-
319
- locale = {};
320
- } else if (format instanceof Array) {
321
- var len = format.length;
322
-
323
- for (var i = 1; i <= len; i += 1) {
324
- args[1] = format[i - 1];
325
- var result = d.apply(this, args);
326
-
327
- if (result.isValid()) {
328
- this.$d = result.$d;
329
- this.$L = result.$L;
330
- this.init();
331
- break;
332
- }
333
-
334
- if (i === len) this.$d = new Date('');
335
- }
336
- } else {
337
- oldParse.call(this, cfg);
338
- }
339
- };
340
- });
341
-
342
- export default __pika_web_default_export_for_treeshaking__;