@embeddable.com/remarkable-ui 0.1.12 → 0.1.13
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.
- package/dist/BarChartDefaultHorizontalPro.js +3 -3
- package/dist/BarChartDefaultPro.js +3 -3
- package/dist/BarChartGroupedHorizontalPro.js +3 -3
- package/dist/BarChartGroupedPro.js +3 -3
- package/dist/BarChartStackedHorizontalPro.js +3 -3
- package/dist/BarChartStackedPro.js +3 -3
- package/dist/{BaseButton-8lCm-nHV.js → BaseButton-BbhHQD9t.js} +2 -2
- package/dist/{BaseButton-8lCm-nHV.js.map → BaseButton-BbhHQD9t.js.map} +1 -1
- package/dist/ChartCard-11lQWjXq.js +106 -0
- package/dist/ChartCard-11lQWjXq.js.map +1 -0
- package/dist/ComparisonPeriod.type.emb-D51Sg3wt.js +15 -0
- package/dist/ComparisonPeriod.type.emb-D51Sg3wt.js.map +1 -0
- package/dist/ComparisonPeriodSelectFieldPro.js +45 -53
- package/dist/ComparisonPeriodSelectFieldPro.js.map +1 -1
- package/dist/DateRangeSelectFieldPro.js +3 -3
- package/dist/DonutChartPro.js +2 -2
- package/dist/DonutLabelChartPro.js +2 -2
- package/dist/{EditorCard-_U0it3Eb.js → EditorCard-BriyqUva.js} +17 -17
- package/dist/{EditorCard-_U0it3Eb.js.map → EditorCard-BriyqUva.js.map} +1 -1
- package/dist/KpiChart-BLMULQMh.js +77 -0
- package/dist/KpiChart-BLMULQMh.js.map +1 -0
- package/dist/KpiChartNumberComparisonPro.js +156 -0
- package/dist/KpiChartNumberComparisonPro.js.map +1 -0
- package/dist/KpiChartNumberPro.js +47 -0
- package/dist/KpiChartNumberPro.js.map +1 -0
- package/dist/MultiSelectFieldPro.js +2 -3
- package/dist/MultiSelectFieldPro.js.map +1 -1
- package/dist/PieChartPro.js +2 -2
- package/dist/{SingleSelectField-Coqlrz4l.js → SingleSelectField-D1E9OJxC.js} +3 -3
- package/dist/{SingleSelectField-Coqlrz4l.js.map → SingleSelectField-D1E9OJxC.js.map} +1 -1
- package/dist/SingleSelectFieldPro.js +2 -2
- package/dist/{charts.fillGaps.hooks-dHYClR1D.js → charts.fillGaps.hooks-lZwsRfDF.js} +4 -4
- package/dist/{charts.fillGaps.hooks-dHYClR1D.js.map → charts.fillGaps.hooks-lZwsRfDF.js.map} +1 -1
- package/dist/{component.constants-6skM25Z_.js → component.constants-DIhZCTG3.js} +120 -84
- package/dist/component.constants-DIhZCTG3.js.map +1 -0
- package/dist/{editors.timeRange.utils-Dv6T01Ys.js → date.utils-CNVHSCO8.js} +18 -31
- package/dist/date.utils-CNVHSCO8.js.map +1 -0
- package/dist/editors.timeRange.utils-CG333N7U.js +18 -0
- package/dist/editors.timeRange.utils-CG333N7U.js.map +1 -0
- package/dist/embeddable-components.json +7 -5
- package/dist/embeddable-theme-2b917.js +974 -966
- package/dist/{formatter.utils-DMMBiLDD.js → formatter.utils-CuZlh4EL.js} +2 -2
- package/dist/{formatter.utils-DMMBiLDD.js.map → formatter.utils-CuZlh4EL.js.map} +1 -1
- package/dist/{index-rQcWoTcg.js → index-B7KNswsW.js} +8 -8
- package/dist/{index-rQcWoTcg.js.map → index-B7KNswsW.js.map} +1 -1
- package/dist/{index-j6OFGLY6.js → index-B_4rK6tI.js} +12 -11
- package/dist/{index-j6OFGLY6.js.map → index-B_4rK6tI.js.map} +1 -1
- package/dist/{index-DUWz6JXu.js → index-Bgj2EBb8.js} +10 -10
- package/dist/{index-DUWz6JXu.js.map → index-Bgj2EBb8.js.map} +1 -1
- package/dist/{index-B3vcfrrk.js → index-C-zjH8iP.js} +5 -5
- package/dist/{index-B3vcfrrk.js.map → index-C-zjH8iP.js.map} +1 -1
- package/dist/{index-Btli_FdH.js → index-C8pGCEGw.js} +5 -5
- package/dist/{index-Btli_FdH.js.map → index-C8pGCEGw.js.map} +1 -1
- package/dist/{index-B9XcOUp_.js → index-DqKfDjMs.js} +25 -25
- package/dist/{index-B9XcOUp_.js.map → index-DqKfDjMs.js.map} +1 -1
- package/dist/index.js +190 -247
- package/dist/index.js.map +1 -1
- package/dist/{object.utils-B52mECQg.js → object.utils-CMJleY-P.js} +2511 -2604
- package/dist/object.utils-CMJleY-P.js.map +1 -0
- package/dist/{pies.utils-BpooJ8CU.js → pies.utils-DluC4GlY.js} +4 -4
- package/dist/{pies.utils-BpooJ8CU.js.map → pies.utils-DluC4GlY.js.map} +1 -1
- package/dist/remarkable-pro/components/charts/kpis/KpiChartNumberComparisonPro/index.d.ts +19 -0
- package/dist/remarkable-pro/components/charts/kpis/KpiChartNumberComparisonPro/index.d.ts.map +1 -0
- package/dist/remarkable-pro/components/charts/kpis/KpiChartNumberPro/index.d.ts +11 -0
- package/dist/remarkable-pro/components/charts/kpis/KpiChartNumberPro/index.d.ts.map +1 -0
- package/dist/remarkable-pro/components/component.constants.d.ts +35 -0
- package/dist/remarkable-pro/components/component.constants.d.ts.map +1 -1
- package/dist/remarkable-pro/components/utils/timeRange.utils.d.ts +5 -0
- package/dist/remarkable-pro/components/utils/timeRange.utils.d.ts.map +1 -0
- package/dist/remarkable-pro/theme/defaults/defaults.ComparisonPeriods.constants.d.ts +9 -0
- package/dist/remarkable-pro/theme/defaults/defaults.ComparisonPeriods.constants.d.ts.map +1 -0
- package/dist/remarkable-pro/theme/defaults/defaults.DateRanges.constants.d.ts +9 -0
- package/dist/remarkable-pro/theme/defaults/defaults.DateRanges.constants.d.ts.map +1 -0
- package/dist/remarkable-pro/theme/i18n/translations/de.d.ts.map +1 -1
- package/dist/remarkable-pro/theme/i18n/translations/en.d.ts.map +1 -1
- package/dist/remarkable-pro/theme/theme.constants.d.ts.map +1 -1
- package/dist/remarkable-pro/theme/theme.types.d.ts +7 -0
- package/dist/remarkable-pro/theme/theme.types.d.ts.map +1 -1
- package/dist/remarkable-ui/charts/kpis/KpiChart.d.ts.map +1 -1
- package/dist/remarkable-ui/charts/kpis/KpiChart.stories.d.ts +7 -0
- package/dist/remarkable-ui/charts/kpis/KpiChart.stories.d.ts.map +1 -1
- package/dist/remarkable-ui/charts/kpis/KpiChart.types.d.ts +4 -0
- package/dist/remarkable-ui/charts/kpis/KpiChart.types.d.ts.map +1 -1
- package/dist/remarkable-ui/charts/kpis/components/KpiChartChange.d.ts.map +1 -1
- package/dist/remarkable-ui/shared/Typography/Typography.d.ts +2 -1
- package/dist/remarkable-ui/shared/Typography/Typography.d.ts.map +1 -1
- package/dist/remarkable-ui/types/css.types.d.ts +2 -0
- package/dist/remarkable-ui/types/css.types.d.ts.map +1 -0
- package/dist/remarkable-ui.css +1 -1
- package/package.json +1 -1
- package/dist/component.constants-6skM25Z_.js.map +0 -1
- package/dist/editors.timeRange.utils-Dv6T01Ys.js.map +0 -1
- package/dist/object.utils-B52mECQg.js.map +0 -1
- package/dist/remarkable-pro/components/editors/ComparisonPeriodSelectFieldPro/ComparisonPeriodSelectFieldPro.constants.d.ts +0 -3
- package/dist/remarkable-pro/components/editors/ComparisonPeriodSelectFieldPro/ComparisonPeriodSelectFieldPro.constants.d.ts.map +0 -1
- package/dist/remarkable-pro/components/editors/DateRangeSelectFieldPro/DateRangeSelectFieldPro.constants.d.ts +0 -3
- package/dist/remarkable-pro/components/editors/DateRangeSelectFieldPro/DateRangeSelectFieldPro.constants.d.ts.map +0 -1
package/dist/{charts.fillGaps.hooks-dHYClR1D.js.map → charts.fillGaps.hooks-lZwsRfDF.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts.fillGaps.hooks-dHYClR1D.js","sources":["../src/remarkable-ui/charts/bars/bars.constants.ts","../src/remarkable-ui/charts/bars/bars.utils.ts","../src/remarkable-ui/charts/bars/BarChart.tsx","../src/remarkable-pro/components/charts/bars/bars.utils.ts","../src/remarkable-pro/components/charts/charts.fillGaps.utils.ts","../src/remarkable-pro/components/charts/charts.fillGaps.hooks.ts"],"sourcesContent":["import { ChartOptions } from 'chart.js';\nimport { getStyle, getStyleNumber } from '../../styles/styles.utils';\nimport { chartjsOptions } from '../chartjs.constants';\n\nexport const defaultBarChartOptions: Partial<ChartOptions<'bar'>> = {\n ...chartjsOptions,\n scales: {\n x: {\n title: {\n display: true,\n color: getStyle('--em-chart-grid-font-color-default'),\n font: {\n size: getStyleNumber('--em-chart-grid-font-title-size'),\n weight: getStyleNumber('--em-chart-grid-font-title-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n ticks: {\n font: {\n size: getStyleNumber('--em-chart-grid-font-subtitle-size'),\n weight: getStyleNumber('--em-chart-grid-font-label-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n grid: {\n display: false,\n color: getStyle('--em-chart-grid-line-color-light'),\n lineWidth: getStyleNumber('--em-chart-grid-line-width-default'),\n },\n border: {\n display: false,\n },\n },\n y: {\n title: {\n display: true,\n color: getStyle('--em-chart-grid-font-color-default'),\n font: {\n size: getStyleNumber('--em-chart-grid-font-title-size'),\n weight: getStyleNumber('--em-chart-grid-font-title-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n ticks: {\n font: {\n size: getStyleNumber('--em-chart-grid-font-subtitle-size'),\n weight: getStyleNumber('--em-chart-grid-font-label-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n grid: {\n display: false,\n color: getStyle('--em-chart-grid-line-color-light'),\n lineWidth: getStyleNumber('--em-chart-grid-line-width-default'),\n },\n border: {\n display: false,\n },\n },\n },\n};\n","import { ChartData, ChartOptions } from 'chart.js';\nimport { chartContrastColors } from '../charts.constants';\nimport { getStyle, getStyleNumber } from '../../styles/styles.utils';\nimport { mergician } from 'mergician';\nimport { BarChartConfigurationProps, BarChartHorizontalConfigurationProps } from './bars.types';\nimport { defaultBarChartOptions } from './bars.constants';\nimport { Context } from 'chartjs-plugin-datalabels';\n\nexport const getBarChartData = (data: ChartData<'bar'>): ChartData<'bar'> => {\n return {\n ...data,\n datasets: data.datasets?.map((dataset, index) => {\n const colors = chartContrastColors[index % chartContrastColors.length];\n const defaultDataset = {\n ...dataset,\n backgroundColor: colors,\n borderColor: colors,\n };\n\n return mergician(defaultDataset, dataset) as typeof dataset;\n }),\n };\n};\n\nconst getDatalabelTotalDisplay = (context: Context, showTotalLabels: boolean | undefined) =>\n showTotalLabels && context.datasetIndex === context.chart.data.datasets.length - 1\n ? 'auto'\n : false;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst getDatalabelTotalFormatter = (_value: any, context: Context) => {\n const { datasets } = context.chart.data;\n const i = context.dataIndex;\n\n const total = datasets.reduce((sum, ds) => {\n const val = ds.data[i] as number;\n return sum + (val || 0);\n }, 0);\n\n return total > 0 ? total : '';\n};\n\nconst getBarVerticalChartOptions = (\n config: BarChartConfigurationProps,\n): Partial<ChartOptions<'bar'>> => {\n return mergician(defaultBarChartOptions, {\n indexAxis: 'x',\n plugins: {\n datalabels: {\n labels: {\n total: {\n anchor: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'top' : 'bottom';\n },\n display: (context) => getDatalabelTotalDisplay(context, config.showTotalLabels),\n formatter: getDatalabelTotalFormatter,\n },\n value: {\n anchor: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'top' : 'bottom';\n },\n },\n },\n },\n },\n scales: {\n y: {\n stacked: config.stacked,\n grid: { display: true },\n ticks: {\n color: getStyle('--em-chart-grid-font-color-muted'),\n // ...(config.stacked === 'percentage' && {\n // callback: (value: number | string) => value + '%',\n // }),\n },\n min: config.yAxisRangeMin,\n // max: config.stacked === 'percentage' ? 100 : config.yAxisRangeMax,\n max: config.yAxisRangeMax,\n type: config.showLogarithmicScale ? 'logarithmic' : 'linear',\n title: {\n text: config.yAxisLabel ?? '',\n },\n },\n x: {\n stacked: config.stacked,\n ticks: {\n color: getStyle('--em-chart-grid-font-color-default'),\n },\n reverse: config.reverseXAxis,\n title: {\n text: config.xAxisLabel ?? '',\n },\n },\n },\n } as Partial<ChartOptions<'bar'>>);\n};\n\nconst getBarHorizontalChartOptions = (\n config: BarChartHorizontalConfigurationProps,\n): Partial<ChartOptions<'bar'>> => {\n return mergician(defaultBarChartOptions, {\n indexAxis: 'y',\n plugins: {\n datalabels: {\n labels: {\n total: {\n anchor: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'right' : 'left';\n },\n display: (context) => getDatalabelTotalDisplay(context, config.showTotalLabels),\n formatter: getDatalabelTotalFormatter,\n },\n value: {\n anchor: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'right' : 'left';\n },\n },\n },\n },\n },\n scales: {\n x: {\n stacked: config.stacked,\n grid: { display: true },\n ticks: {\n color: getStyle('--em-chart-grid-font-color-muted'),\n // ...(config.stacked === 'percentage' && {\n // callback: (value: number | string) => value + '%',\n // }),\n },\n min: config.xAxisRangeMin,\n // max: config.stacked === 'percentage' ? 100 : config.xAxisRangeMax,\n max: config.xAxisRangeMax,\n type: config.showLogarithmicScale ? 'logarithmic' : 'linear',\n title: {\n text: config.xAxisLabel ?? '',\n },\n },\n y: {\n stacked: config.stacked,\n ticks: {\n color: getStyle('--em-chart-grid-font-color-default'),\n },\n reverse: config.reverseYAxis,\n title: {\n text: config.yAxisLabel ?? '',\n },\n },\n },\n } as Partial<ChartOptions<'bar'>>);\n};\n\nexport const getBarChartOptions = (\n props: BarChartConfigurationProps,\n): Partial<ChartOptions<'bar'>> => {\n const {\n horizontal = false,\n showLegend = false,\n showTooltips = true,\n showValueLabels = false,\n showTotalLabels = false,\n } = props;\n\n const getOptions = horizontal ? getBarHorizontalChartOptions : getBarVerticalChartOptions;\n const options = getOptions(props);\n\n return mergician(options, {\n layout: {\n padding: {\n // Hack: dataLabels can get cut off if they are at the edge of the chart\n top: !horizontal && (showValueLabels || showTotalLabels) ? 30 : 0,\n right: horizontal && (showValueLabels || showTotalLabels) ? 30 : 0,\n },\n },\n elements: {\n bar: {\n borderRadius: getStyleNumber('--em-chart-style-border-radius-default'),\n // stacked === 'percentage' ? 0 : getStyleNumber('--em-chart-style-border-radius-default'),\n },\n },\n plugins: {\n legend: { display: showLegend },\n datalabels: {\n display: (context) => {\n return showValueLabels && context.dataset.data[context.dataIndex] !== 0 ? 'auto' : false;\n },\n },\n tooltip: {\n enabled: showTooltips,\n },\n },\n } as Partial<ChartOptions<'bar'>>);\n};\n","import { FC, useRef } from 'react';\nimport { Bar } from 'react-chartjs-2';\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n LogarithmicScale,\n} from 'chart.js';\nimport { BaseBarChartProps } from './bars.types';\nimport { getSegmentIndexClicked } from '../chartjs.utils';\nimport { getBarChartData, getBarChartOptions } from './bars.utils';\nimport styles from '../charts.module.css';\nimport { mergician } from 'mergician';\n\nChartJS.register(CategoryScale, LinearScale, BarElement, LogarithmicScale, Title, Tooltip, Legend);\n\nexport type BarChartProps = BaseBarChartProps;\n\nexport const BarChart: FC<BarChartProps> = ({ data, onSegmentClick, options = {}, ...props }) => {\n const chartRef = useRef(null);\n\n const barChartOptions = mergician(getBarChartOptions(props), options);\n\n const handleSegmentClick = (event: React.MouseEvent<HTMLCanvasElement>) => {\n const indexClicked = getSegmentIndexClicked(event, chartRef);\n onSegmentClick?.(indexClicked);\n };\n\n return (\n <div className={styles.chartContainer}>\n <Bar\n ref={chartRef}\n data={getBarChartData(data)}\n options={barChartOptions}\n onClick={handleSegmentClick}\n />\n </div>\n );\n};\n","import { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { Theme } from '../../../theme/theme.types';\nimport { remarkableTheme } from '../../../theme/theme.constants';\nimport { ChartData, ChartOptions } from 'chart.js';\nimport { getThemeFormatter } from '../../../theme/formatter/formatter.utils';\nimport { groupTailAsOther } from '../charts.utils';\nimport { i18n } from '../../../theme/i18n/i18n';\nimport { getColor } from '../../../theme/styles/styles.utils';\nimport { chartColors } from '../../../../remarkable-ui';\nimport { getObjectStableKey } from '../../../utils.ts/object.utils';\nimport { chartContrastColors } from '../../../../remarkable-ui/charts/charts.constants';\n\nexport const getBarStackedChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n groupDimension: Dimension;\n measure: Measure;\n },\n theme: Theme,\n): ChartData<'bar'> => {\n const themeFormatter = getThemeFormatter(theme);\n const { data = [], dimension, groupDimension, measure } = props;\n\n const axis = [...new Set(data.map((d) => d[dimension.name]).filter(Boolean))].sort();\n\n const groupBy = [...new Set(data.map((d) => d[groupDimension.name]))];\n\n const themeKey = getObjectStableKey(theme);\n\n const datasets = groupBy.map((groupByItem, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n groupByItem,\n theme.charts.backgroundColors ?? chartContrastColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n groupByItem,\n theme.charts.borderColors ?? chartContrastColors,\n index,\n );\n\n return {\n label: themeFormatter.data(groupDimension, groupByItem),\n backgroundColor,\n borderColor,\n data: axis.map((axisItem) => {\n const record = data.find(\n (d) => d[groupDimension.name] === groupByItem && d[dimension.name] === axisItem,\n );\n return record ? Number(record[measure.name]) : 0;\n }),\n };\n });\n\n return {\n labels: axis.map((axisItem) => themeFormatter.data(dimension, axisItem)),\n datasets,\n };\n};\nexport const getBarChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n measures: Measure[];\n maxItems?: number;\n },\n theme: Theme = remarkableTheme,\n): ChartData<'bar'> => {\n const themeFormatter = getThemeFormatter(theme);\n\n if (!props.data) {\n return {\n labels: [],\n datasets: [{ data: [] }],\n };\n }\n\n const themeKey = getObjectStableKey(theme);\n const groupedData = groupTailAsOther(props.data, props.dimension, props.measures, props.maxItems);\n\n return {\n labels: groupedData.map((item) => {\n const value = item[props.dimension.name];\n const formattedValue = themeFormatter.data(props.dimension, value);\n\n // If formatter did not work, try i18n translation\n if (value === formattedValue) {\n return i18n.t(value);\n }\n return formattedValue;\n }),\n datasets: props.measures.map((measure, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n measure.name,\n theme.charts.backgroundColors ?? chartColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n measure.name,\n theme.charts.borderColors ?? chartColors,\n index,\n );\n\n return {\n label: themeFormatter.dimensionOrMeasureTitle(measure),\n data: groupedData.map((item) => item[measure.name]),\n backgroundColor,\n borderColor,\n };\n }),\n };\n};\n\nexport const getBarChartProOptions = (\n options: {\n onBarClicked: (args: {\n axisDimensionValue: string | null;\n groupingDimensionValue: string | null;\n }) => void;\n measure: Measure;\n horizontal: boolean;\n },\n theme: Theme,\n): Partial<ChartOptions<'bar'>> => {\n const { onBarClicked, measure, horizontal } = options;\n\n const themeFormatter = getThemeFormatter(theme);\n return {\n plugins: {\n legend: { position: theme.charts.legendPosition ?? 'bottom' },\n datalabels: {\n formatter: (value: string | number) => themeFormatter.data(options.measure, value),\n },\n tooltip: {\n callbacks: {\n label(context) {\n const raw = context.raw as number;\n return `${context.dataset.label || ''}: ${themeFormatter.data(measure, raw)}`;\n },\n },\n },\n },\n scales: {\n x: {\n ticks: {\n ...(horizontal && {\n callback: (value) => themeFormatter.data(measure, value),\n }),\n },\n },\n y: {\n ticks: {\n ...(!horizontal && {\n callback: (value) => themeFormatter.data(measure, value),\n }),\n },\n },\n },\n onClick: (_event, elements, chart) => {\n const element = elements[0];\n const axisDimensionValue = (element ? chart.data.labels![element.index] : null) as\n | string\n | null;\n const groupingDimensionValue = (\n element ? chart.data.datasets[element.datasetIndex]!.label : null\n ) as string | null;\n\n onBarClicked({\n axisDimensionValue,\n groupingDimensionValue,\n });\n },\n };\n};\n","import dayjs from 'dayjs';\nimport {\n DataResponse,\n Dimension,\n Granularity,\n TimeRange,\n TimeRangeDeserializedValue,\n} from '@embeddable.com/core';\nimport { Theme } from '../../theme/theme.types';\n\ntype DataResponseDataRecord = NonNullable<DataResponse['data']>[number];\n\nconst DATE_FORMATS = {\n DEFAULT: 'YYYY-MM-DDTHH:mm:ss.SSS',\n WITH_TIMEZONE: 'YYYY-MM-DDTHH:mm:ss.SSS[Z]',\n WITHOUT_TIMEZONE: 'YYYY-MM-DDTHH:mm:ss.SSS',\n WITHOUT_MILLISECONDS: 'YYYY-MM-DDTHH:mm:ss',\n};\n\n/**\n * Maps granularity to dayjs unit for date manipulation\n */\nconst granularityToDayjsUnitMap: Record<Granularity, dayjs.ManipulateType> = {\n second: 'second',\n minute: 'minute',\n hour: 'hour',\n day: 'day',\n week: 'week',\n month: 'month',\n quarter: 'month', // Will be handled specially\n year: 'year',\n};\n\n/**\n * Formats a Date object as YYYY-MM-DD string in local timezone\n */\nconst formatDateAsString = (date: Date): string => {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n};\n\n/**\n * Formats a Date object as YYYY-MM-DD string in UTC timezone\n */\nconst formatDateAsStringUTC = (date: Date): string => {\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`;\n};\n\n/**\n * Checks if a date is in UTC format (contains 'Z')\n */\nconst isUTCDate = (date: Date): boolean => {\n return date.toISOString().includes('Z');\n};\n\n/**\n * Formats a date string based on whether it's UTC or local\n */\nconst formatDateString = (date: Date): string => {\n return isUTCDate(date) ? formatDateAsStringUTC(date) : formatDateAsString(date);\n};\n\n/**\n * Gets the quarter start date for a given dayjs date\n */\nconst getQuarterStart = (date: dayjs.Dayjs): dayjs.Dayjs => {\n return date\n .startOf('month')\n .month(Math.floor(date.month() / 3) * 3)\n .startOf('month');\n};\n\n/**\n * Applies granularity-specific start/end logic to dates\n */\nconst applyGranularityBounds = (date: dayjs.Dayjs, granularity: Granularity): dayjs.Dayjs => {\n const unit = granularityToDayjsUnit(granularity);\n\n if (granularity === 'week') {\n return date.startOf('week');\n } else if (granularity === 'quarter') {\n return getQuarterStart(date);\n } else {\n return date.startOf(unit);\n }\n};\n\n/**\n * Resolves date bounds from dimension inputs, handling relative time strings\n */\nconst resolveDateBounds = (dimension: Dimension, theme?: Theme): TimeRange => {\n const dateBounds = dimension.inputs?.dateBounds;\n if (!dateBounds) return undefined;\n\n // If it already has from/to dates, use them directly\n if (dateBounds.from && dateBounds.to) {\n return dateBounds;\n }\n\n // If it has a relativeTimeString, resolve it using theme options\n const relativeTimeString = dateBounds.relativeTimeString;\n if (relativeTimeString) {\n const dateRangeOptions = theme?.editors?.dateRangeSelectFieldPro?.options ?? [];\n const matchedOption = dateRangeOptions.find((option) => option.value === relativeTimeString);\n\n if (matchedOption) {\n const range = matchedOption.getRange() as TimeRangeDeserializedValue;\n return {\n from: range.from,\n to: range.to,\n relativeTimeString: relativeTimeString,\n };\n }\n }\n\n return undefined;\n};\n\nexport type FillGapsOptions = {\n dimension: Dimension;\n granularity?: Granularity;\n sortOrder?: 'asc' | 'desc';\n dateBounds?: TimeRangeDeserializedValue;\n theme?: Theme;\n};\n\n/**\n * Fills missing time buckets in a date-series based on granularity and sorting\n *\n * @param data - Array of date records to process\n * @param options - Configuration options for gap filling\n * @returns Array with missing time buckets filled in\n *\n * @example\n * ```typescript\n * const data = [\n * { date: '2024-01-01', value: 10 },\n * { date: '2024-01-03', value: 20 }\n * ];\n * const result = fillGaps(data, {\n * dimension: { name: 'date' },\n * granularity: 'day'\n * });\n * // Result: [{ date: '2024-01-01', value: 10 }, { date: '2024-01-02', value: null }, { date: '2024-01-03', value: 20 }]\n * ```\n */\nexport const fillGaps = (\n data: DataResponse['data'],\n options: FillGapsOptions,\n): DataResponse['data'] => {\n const { dimension, granularity = 'day', sortOrder = 'asc', dateBounds, theme } = options;\n\n // Resolve date bounds from dimension inputs if not provided directly\n const resolvedDateBounds = dateBounds || resolveDateBounds(dimension, theme);\n\n if (!data || data.length === 0) {\n return data;\n }\n\n if (!dimension?.name) {\n throw new Error('dimension.name is required');\n }\n\n // Get the dimension name - use granularity-specific name if available\n const dimensionName = getGranularityDimensionName(dimension.name, granularity, data);\n\n // Parse dates and filter valid ones\n const validData = data\n .map((record) => {\n const dateValue = record[dimensionName];\n if (typeof dateValue !== 'string') {\n return null;\n }\n const parsedDate = dayjs(dateValue);\n return parsedDate.isValid() ? { ...record, _parsedDate: parsedDate } : null;\n })\n .filter(\n (record): record is DataResponseDataRecord & { _parsedDate: dayjs.Dayjs } => record !== null,\n );\n\n if (validData.length === 0) {\n console.warn('fillGaps: No valid dates found in data');\n return data;\n }\n\n // Determine date range\n let minDate: dayjs.Dayjs;\n let maxDate: dayjs.Dayjs;\n\n if (resolvedDateBounds) {\n // Parse dates with timezone-safe approach\n const fromDate =\n resolvedDateBounds.from instanceof Date\n ? resolvedDateBounds.from\n : new Date(resolvedDateBounds.from!);\n const toDate =\n resolvedDateBounds.to instanceof Date\n ? resolvedDateBounds.to\n : new Date(resolvedDateBounds.to!);\n\n // For sub-day granularities, preserve time component\n if (granularity === 'second' || granularity === 'minute' || granularity === 'hour') {\n minDate = dayjs(fromDate);\n maxDate = dayjs(toDate);\n } else {\n // For day+ granularities, extract date only to avoid timezone issues\n const fromDateStr = formatDateString(fromDate);\n const toDateStr = formatDateString(toDate);\n\n minDate = dayjs(fromDateStr);\n maxDate = dayjs(toDateStr);\n }\n\n // Apply granularity-specific start/end logic\n minDate = applyGranularityBounds(minDate, granularity);\n maxDate = applyGranularityBounds(maxDate, granularity);\n } else {\n // Use data range - more efficient single pass\n const firstRecord = validData[0];\n if (!firstRecord) {\n return data;\n }\n\n let min = firstRecord._parsedDate;\n let max = firstRecord._parsedDate;\n\n for (let i = 1; i < validData.length; i++) {\n const record = validData[i];\n if (record) {\n const date = record._parsedDate;\n if (date.isBefore(min)) min = date;\n if (date.isAfter(max)) max = date;\n }\n }\n\n minDate = min;\n maxDate = max;\n }\n\n // Generate all possible dates in the range\n const allDates: dayjs.Dayjs[] = [];\n\n // Normalize both dates to the start of their respective granularity units\n const dayjsUnit = granularityToDayjsUnit(granularity);\n const minDateStart = minDate.startOf(dayjsUnit);\n const maxDateStart = maxDate.startOf(dayjsUnit);\n\n if (granularity === 'week') {\n // For week granularity, start from the first day and add exactly 7 days\n let currentDate = minDateStart;\n while (currentDate.isBefore(maxDateStart) || currentDate.isSame(maxDateStart, 'day')) {\n allDates.push(currentDate);\n currentDate = currentDate.add(7, 'day'); // Add exactly 7 days\n }\n } else {\n // For other granularities, use the standard approach\n let currentDate = minDateStart;\n\n while (currentDate.isBefore(maxDateStart) || currentDate.isSame(maxDateStart, dayjsUnit)) {\n allDates.push(currentDate);\n\n if (granularity === 'quarter') {\n currentDate = currentDate.add(3, 'month');\n } else {\n currentDate = currentDate.add(1, dayjsUnit);\n }\n }\n }\n\n // Create a map of existing data by date\n const existingDataMap = new Map<string, DataResponseDataRecord>();\n validData.forEach((record) => {\n const dateKey = generateDateKey(record._parsedDate);\n existingDataMap.set(dateKey, record);\n });\n\n // Fill gaps\n const result: DataResponse['data'] = [];\n allDates.forEach((date) => {\n const dateKey = generateDateKey(date);\n const existingRecord = existingDataMap.get(dateKey);\n\n if (existingRecord) {\n // Use existing data - exclude internal _parsedDate field\n const cleanRecord = { ...existingRecord };\n delete cleanRecord._parsedDate;\n result.push(cleanRecord);\n } else {\n // Create gap record with zero/null values\n // Use the same date format as the original data\n const dateFormat = getDateFormatFromSample(data);\n const formattedDate = formatDateForGapRecord(date, dateFormat);\n\n const gapRecord: DataResponseDataRecord = {\n [dimensionName]: formattedDate,\n };\n\n // Set all other dimensions to null/zero, but preserve date fields\n const baseDimensionName = dimension.name;\n const sampleRecord = data[0];\n if (sampleRecord) {\n for (const key of Object.keys(sampleRecord)) {\n if (key !== dimensionName) {\n // If this is another date dimension (same base name), use the same date\n if (key.startsWith(baseDimensionName) && key !== dimensionName) {\n gapRecord[key] = formattedDate;\n } else {\n gapRecord[key] = null;\n }\n }\n }\n }\n\n result.push(gapRecord);\n }\n });\n\n // Sort the result\n if (sortOrder === 'desc') {\n result.sort(\n (a, b) =>\n dayjs(b[dimensionName] as string).valueOf() - dayjs(a[dimensionName] as string).valueOf(),\n );\n } else {\n result.sort(\n (a, b) =>\n dayjs(a[dimensionName] as string).valueOf() - dayjs(b[dimensionName] as string).valueOf(),\n );\n }\n\n return result;\n};\n\n/**\n * Generates a consistent date key for mapping\n * Includes time component to support second/minute granularities\n */\nconst generateDateKey = (date: dayjs.Dayjs): string => {\n return date.format('YYYY-MM-DDTHH:mm:ss');\n};\n\n/**\n * Gets the correct dimension name based on granularity\n */\nconst getGranularityDimensionName = (\n baseDimensionName: string,\n granularity: Granularity,\n data: DataResponse['data'],\n): string => {\n if (!data || data.length === 0) return baseDimensionName;\n\n const sampleRecord = data[0];\n if (!sampleRecord) return baseDimensionName;\n\n const granularityKey = `${baseDimensionName}.${granularity}`;\n\n // Check if granularity-specific dimension exists in the data\n if (granularityKey in sampleRecord) {\n return granularityKey;\n }\n\n // Fallback to base dimension name\n return baseDimensionName;\n};\n\n/**\n * Detects the date format from sample data\n */\nconst getDateFormatFromSample = (data: DataResponse['data']): string => {\n if (!data?.length) return DATE_FORMATS.DEFAULT;\n\n const sampleRecord = data[0];\n if (!sampleRecord) return DATE_FORMATS.DEFAULT;\n\n // Look for any date field to determine format\n for (const value of Object.values(sampleRecord)) {\n if (typeof value === 'string' && value.includes('T') && value.includes(':')) {\n if (value.endsWith('Z')) {\n return DATE_FORMATS.WITH_TIMEZONE;\n }\n if (value.includes('.')) {\n return DATE_FORMATS.WITHOUT_TIMEZONE;\n }\n return DATE_FORMATS.WITHOUT_MILLISECONDS;\n }\n }\n\n return DATE_FORMATS.DEFAULT;\n};\n\n/**\n * Formats a date for gap records using the detected format\n */\nconst formatDateForGapRecord = (date: dayjs.Dayjs, dateFormat: string): string => {\n if (dateFormat.includes('[Z]')) {\n return date.format(DATE_FORMATS.WITH_TIMEZONE);\n } else if (dateFormat.includes('.SSS')) {\n return date.format(DATE_FORMATS.WITHOUT_TIMEZONE);\n } else {\n return date.format(DATE_FORMATS.WITHOUT_MILLISECONDS);\n }\n};\n\n/**\n * Maps granularity to dayjs unit\n */\nconst granularityToDayjsUnit = (granularity: Granularity): dayjs.ManipulateType => {\n return granularityToDayjsUnitMap[granularity] || granularityToDayjsUnitMap.day;\n};\n","import { useMemo } from 'react';\nimport { DataResponse, Dimension, Granularity } from '@embeddable.com/core';\nimport { fillGaps, type FillGapsOptions } from './charts.fillGaps.utils';\nimport { useTheme } from '@embeddable.com/react';\nimport { Theme } from '../../theme/theme.types';\n\n/**\n * Hook that automatically applies fillGaps to chart data when beneficial.\n *\n * This hook intelligently fills missing time buckets in date-series data based on:\n * - The granularity from dimension inputs or auto-detected granularity from data\n * - Date bounds from dimension inputs (including relative time strings)\n * - Data sparsity analysis to determine if gap filling is needed\n *\n * @param results - The data response containing the chart data\n * @param dimension - The dimension being used for the chart axis (includes granularity in inputs)\n * @returns Enhanced data with filled time gaps, or original data if no gaps need filling\n */\nexport const useChartDataWithFillGaps = (\n results: DataResponse,\n dimension: Dimension,\n): DataResponse => {\n const theme = useTheme() as Theme;\n\n const data = useMemo(() => {\n const data = results.data;\n\n // Only apply fillGaps if:\n // 1. The dimension is a date/time dimension\n // 2. We have data to process\n if (dimension.nativeType !== 'time' || !data || data.length === 0) {\n return data;\n }\n\n // Get granularity from dimension inputs or auto-detect from data\n const effectiveGranularity =\n dimension.inputs?.granularity || detectGranularityFromData(data, dimension);\n\n if (!effectiveGranularity) {\n return data;\n }\n\n // Check if this looks like a sparse time series that would benefit from fillGaps\n // If dimension has date bounds, always apply fillGaps to ensure the specified range is filled\n const hasDateBounds = dimension.inputs?.dateBounds;\n const shouldApply = hasDateBounds ?? shouldApplyFillGaps(data, dimension, effectiveGranularity);\n\n if (!shouldApply) {\n return data;\n }\n\n // Use the effective granularity\n const options: FillGapsOptions = {\n dimension: dimension,\n granularity: effectiveGranularity,\n sortOrder: 'asc',\n theme: theme,\n };\n\n try {\n return fillGaps(data, options);\n } catch (error) {\n console.warn('Failed to apply fillGaps to chart data:', error);\n return data;\n }\n }, [results.data, dimension, theme]);\n return {\n ...results,\n data,\n };\n};\n\n/**\n * Determines if fillGaps should be applied based on data characteristics.\n *\n * Analyzes the time series data to detect if there are significant gaps that would\n * benefit from gap filling. Uses the expected step size for the given granularity\n * to determine if the data appears sparse.\n *\n * @param data - The chart data to analyze\n * @param dimension - The dimension being used for the time axis\n * @param granularity - The granularity to use for gap analysis (e.g., 'day', 'week')\n * @returns True if gap filling should be applied, false otherwise\n */\nconst shouldApplyFillGaps = (\n data: DataResponse['data'],\n dimension: Dimension,\n granularity: string,\n): boolean => {\n if (!data || data.length < 2) {\n return false; // Too few data points\n }\n\n const dimensionName = dimension.name;\n const dates = data\n .map((record) => record[dimensionName])\n .filter(Boolean)\n .map((dateStr) => new Date(dateStr as string))\n .filter((date) => !isNaN(date.getTime()))\n .sort((a, b) => a.getTime() - b.getTime());\n\n if (dates.length < 2) {\n return false; // Not enough valid dates\n }\n\n // Calculate expected step size based on granularity\n const expectedStepMs = getGranularityStepMs(granularity);\n\n // Check if there are gaps larger than expected step\n for (let i = 1; i < dates.length; i++) {\n const currentDate = dates[i];\n const previousDate = dates[i - 1];\n if (currentDate && previousDate) {\n const actualStep = currentDate.getTime() - previousDate.getTime();\n // If actual step is more than 1.5x the expected step, we have a gap\n if (actualStep > expectedStepMs * 1.5) {\n return true;\n }\n }\n }\n\n return false;\n};\n\n/**\n * Detects granularity from data by examining dimension names in the data.\n *\n * Looks for granularity-specific dimension names (e.g., 'events.date.week')\n * to infer the appropriate granularity for gap filling. Falls back to the\n * base dimension name if no granularity-specific dimension is found.\n *\n * @param data - The chart data to analyze\n * @param dimension - The base dimension being used\n * @returns Detected granularity or null if none can be determined\n */\nconst detectGranularityFromData = (\n data: DataResponse['data'],\n dimension: Dimension,\n): Granularity | null => {\n if (!data || data.length === 0) return null;\n\n const sampleRecord = data[0];\n if (!sampleRecord) return null;\n\n const baseDimensionName = dimension.name;\n\n // Look for granularity-specific dimension names in the data\n const granularityKeys = Object.keys(sampleRecord).filter(\n (key) => key.startsWith(baseDimensionName) && key !== baseDimensionName,\n );\n\n // Check for common granularity patterns\n for (const key of granularityKeys) {\n if (key.includes('.second')) return 'second';\n if (key.includes('.minute')) return 'minute';\n if (key.includes('.hour')) return 'hour';\n if (key.includes('.day')) return 'day';\n if (key.includes('.week')) return 'week';\n if (key.includes('.month')) return 'month';\n if (key.includes('.quarter')) return 'quarter';\n if (key.includes('.year')) return 'year';\n }\n\n // If no granularity-specific dimension found, return null\n return null;\n};\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\nexport const TIME_CONSTANTS = {\n SECOND,\n MINUTE,\n HOUR,\n DAY,\n WEEK: 7 * DAY,\n MONTH: 30 * DAY, // Approximate\n QUARTER: 90 * DAY, // Approximate\n YEAR: 365 * DAY, // Approximate\n} as const;\n\n/**\n * Gets the expected step size in milliseconds for a given granularity.\n *\n * Returns the expected time interval between consecutive data points for\n * the specified granularity. Used to detect if there are gaps in the\n * time series data that would benefit from gap filling.\n *\n * @param granularity - The time granularity (e.g., 'day', 'week', 'month')\n * @returns Expected step size in milliseconds\n */\nconst getGranularityStepMs = (granularity: string): number => {\n switch (granularity) {\n case 'second':\n return TIME_CONSTANTS.SECOND;\n case 'minute':\n return TIME_CONSTANTS.MINUTE;\n case 'hour':\n return TIME_CONSTANTS.HOUR;\n case 'day':\n return TIME_CONSTANTS.DAY;\n case 'week':\n return TIME_CONSTANTS.WEEK;\n case 'month':\n return TIME_CONSTANTS.MONTH;\n case 'quarter':\n return TIME_CONSTANTS.QUARTER;\n case 'year':\n return TIME_CONSTANTS.YEAR;\n default:\n return TIME_CONSTANTS.DAY; // Default fallback\n }\n};\n"],"names":["defaultBarChartOptions","chartjsOptions","getStyle","getStyleNumber","getBarChartData","data","_a","dataset","index","colors","chartContrastColors","defaultDataset","mergician","getDatalabelTotalDisplay","context","showTotalLabels","getDatalabelTotalFormatter","_value","datasets","i","total","sum","ds","val","getBarVerticalChartOptions","config","getBarHorizontalChartOptions","getBarChartOptions","props","horizontal","showLegend","showTooltips","showValueLabels","options","ChartJS","CategoryScale","LinearScale","BarElement","LogarithmicScale","Title","Tooltip","Legend","BarChart","onSegmentClick","chartRef","useRef","barChartOptions","handleSegmentClick","event","indexClicked","getSegmentIndexClicked","jsx","styles","Bar","getBarStackedChartProData","theme","themeFormatter","getThemeFormatter","dimension","groupDimension","measure","axis","d","groupBy","themeKey","getObjectStableKey","groupByItem","backgroundColor","getColor","borderColor","axisItem","record","getBarChartProData","remarkableTheme","groupedData","groupTailAsOther","item","value","formattedValue","i18n","chartColors","getBarChartProOptions","onBarClicked","raw","_event","elements","chart","element","axisDimensionValue","groupingDimensionValue","DATE_FORMATS","granularityToDayjsUnitMap","formatDateAsString","date","formatDateAsStringUTC","isUTCDate","formatDateString","getQuarterStart","applyGranularityBounds","granularity","unit","granularityToDayjsUnit","resolveDateBounds","dateBounds","relativeTimeString","matchedOption","_c","_b","option","range","fillGaps","sortOrder","resolvedDateBounds","dimensionName","getGranularityDimensionName","validData","dateValue","parsedDate","dayjs","minDate","maxDate","fromDate","toDate","fromDateStr","toDateStr","firstRecord","min","max","allDates","dayjsUnit","minDateStart","maxDateStart","currentDate","existingDataMap","dateKey","generateDateKey","result","existingRecord","cleanRecord","dateFormat","getDateFormatFromSample","formattedDate","formatDateForGapRecord","gapRecord","baseDimensionName","sampleRecord","key","a","b","granularityKey","useChartDataWithFillGaps","results","useTheme","useMemo","effectiveGranularity","detectGranularityFromData","shouldApplyFillGaps","error","dates","dateStr","expectedStepMs","getGranularityStepMs","previousDate","granularityKeys","SECOND","MINUTE","HOUR","DAY","TIME_CONSTANTS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts.fillGaps.hooks-lZwsRfDF.js","sources":["../src/remarkable-ui/charts/bars/bars.constants.ts","../src/remarkable-ui/charts/bars/bars.utils.ts","../src/remarkable-ui/charts/bars/BarChart.tsx","../src/remarkable-pro/components/charts/bars/bars.utils.ts","../src/remarkable-pro/components/charts/charts.fillGaps.utils.ts","../src/remarkable-pro/components/charts/charts.fillGaps.hooks.ts"],"sourcesContent":["import { ChartOptions } from 'chart.js';\nimport { getStyle, getStyleNumber } from '../../styles/styles.utils';\nimport { chartjsOptions } from '../chartjs.constants';\n\nexport const defaultBarChartOptions: Partial<ChartOptions<'bar'>> = {\n ...chartjsOptions,\n scales: {\n x: {\n title: {\n display: true,\n color: getStyle('--em-chart-grid-font-color-default'),\n font: {\n size: getStyleNumber('--em-chart-grid-font-title-size'),\n weight: getStyleNumber('--em-chart-grid-font-title-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n ticks: {\n font: {\n size: getStyleNumber('--em-chart-grid-font-subtitle-size'),\n weight: getStyleNumber('--em-chart-grid-font-label-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n grid: {\n display: false,\n color: getStyle('--em-chart-grid-line-color-light'),\n lineWidth: getStyleNumber('--em-chart-grid-line-width-default'),\n },\n border: {\n display: false,\n },\n },\n y: {\n title: {\n display: true,\n color: getStyle('--em-chart-grid-font-color-default'),\n font: {\n size: getStyleNumber('--em-chart-grid-font-title-size'),\n weight: getStyleNumber('--em-chart-grid-font-title-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n ticks: {\n font: {\n size: getStyleNumber('--em-chart-grid-font-subtitle-size'),\n weight: getStyleNumber('--em-chart-grid-font-label-weight'),\n // TODO: fix family on dedicated ticket\n // family: getStyle('--em-chart-grid-font-font-family'),\n lineHeight: `${getStyleNumber('--em-chart-grid-font-line-height')}px`,\n },\n },\n grid: {\n display: false,\n color: getStyle('--em-chart-grid-line-color-light'),\n lineWidth: getStyleNumber('--em-chart-grid-line-width-default'),\n },\n border: {\n display: false,\n },\n },\n },\n};\n","import { ChartData, ChartOptions } from 'chart.js';\nimport { chartContrastColors } from '../charts.constants';\nimport { getStyle, getStyleNumber } from '../../styles/styles.utils';\nimport { mergician } from 'mergician';\nimport { BarChartConfigurationProps, BarChartHorizontalConfigurationProps } from './bars.types';\nimport { defaultBarChartOptions } from './bars.constants';\nimport { Context } from 'chartjs-plugin-datalabels';\n\nexport const getBarChartData = (data: ChartData<'bar'>): ChartData<'bar'> => {\n return {\n ...data,\n datasets: data.datasets?.map((dataset, index) => {\n const colors = chartContrastColors[index % chartContrastColors.length];\n const defaultDataset = {\n ...dataset,\n backgroundColor: colors,\n borderColor: colors,\n };\n\n return mergician(defaultDataset, dataset) as typeof dataset;\n }),\n };\n};\n\nconst getDatalabelTotalDisplay = (context: Context, showTotalLabels: boolean | undefined) =>\n showTotalLabels && context.datasetIndex === context.chart.data.datasets.length - 1\n ? 'auto'\n : false;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst getDatalabelTotalFormatter = (_value: any, context: Context) => {\n const { datasets } = context.chart.data;\n const i = context.dataIndex;\n\n const total = datasets.reduce((sum, ds) => {\n const val = ds.data[i] as number;\n return sum + (val || 0);\n }, 0);\n\n return total > 0 ? total : '';\n};\n\nconst getBarVerticalChartOptions = (\n config: BarChartConfigurationProps,\n): Partial<ChartOptions<'bar'>> => {\n return mergician(defaultBarChartOptions, {\n indexAxis: 'x',\n plugins: {\n datalabels: {\n labels: {\n total: {\n anchor: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'top' : 'bottom';\n },\n display: (context) => getDatalabelTotalDisplay(context, config.showTotalLabels),\n formatter: getDatalabelTotalFormatter,\n },\n value: {\n anchor: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'top' : 'bottom';\n },\n },\n },\n },\n },\n scales: {\n y: {\n stacked: config.stacked,\n grid: { display: true },\n ticks: {\n color: getStyle('--em-chart-grid-font-color-muted'),\n // ...(config.stacked === 'percentage' && {\n // callback: (value: number | string) => value + '%',\n // }),\n },\n min: config.yAxisRangeMin,\n // max: config.stacked === 'percentage' ? 100 : config.yAxisRangeMax,\n max: config.yAxisRangeMax,\n type: config.showLogarithmicScale ? 'logarithmic' : 'linear',\n title: {\n text: config.yAxisLabel ?? '',\n },\n },\n x: {\n stacked: config.stacked,\n ticks: {\n color: getStyle('--em-chart-grid-font-color-default'),\n },\n reverse: config.reverseXAxis,\n title: {\n text: config.xAxisLabel ?? '',\n },\n },\n },\n } as Partial<ChartOptions<'bar'>>);\n};\n\nconst getBarHorizontalChartOptions = (\n config: BarChartHorizontalConfigurationProps,\n): Partial<ChartOptions<'bar'>> => {\n return mergician(defaultBarChartOptions, {\n indexAxis: 'y',\n plugins: {\n datalabels: {\n labels: {\n total: {\n anchor: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'right' : 'left';\n },\n display: (context) => getDatalabelTotalDisplay(context, config.showTotalLabels),\n formatter: getDatalabelTotalFormatter,\n },\n value: {\n anchor: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'end' : 'start';\n },\n align: (context) => {\n if (config.stacked) {\n return 'center';\n }\n const value = context.dataset.data[context.dataIndex] as number;\n return value >= 0 ? 'right' : 'left';\n },\n },\n },\n },\n },\n scales: {\n x: {\n stacked: config.stacked,\n grid: { display: true },\n ticks: {\n color: getStyle('--em-chart-grid-font-color-muted'),\n // ...(config.stacked === 'percentage' && {\n // callback: (value: number | string) => value + '%',\n // }),\n },\n min: config.xAxisRangeMin,\n // max: config.stacked === 'percentage' ? 100 : config.xAxisRangeMax,\n max: config.xAxisRangeMax,\n type: config.showLogarithmicScale ? 'logarithmic' : 'linear',\n title: {\n text: config.xAxisLabel ?? '',\n },\n },\n y: {\n stacked: config.stacked,\n ticks: {\n color: getStyle('--em-chart-grid-font-color-default'),\n },\n reverse: config.reverseYAxis,\n title: {\n text: config.yAxisLabel ?? '',\n },\n },\n },\n } as Partial<ChartOptions<'bar'>>);\n};\n\nexport const getBarChartOptions = (\n props: BarChartConfigurationProps,\n): Partial<ChartOptions<'bar'>> => {\n const {\n horizontal = false,\n showLegend = false,\n showTooltips = true,\n showValueLabels = false,\n showTotalLabels = false,\n } = props;\n\n const getOptions = horizontal ? getBarHorizontalChartOptions : getBarVerticalChartOptions;\n const options = getOptions(props);\n\n return mergician(options, {\n layout: {\n padding: {\n // Hack: dataLabels can get cut off if they are at the edge of the chart\n top: !horizontal && (showValueLabels || showTotalLabels) ? 30 : 0,\n right: horizontal && (showValueLabels || showTotalLabels) ? 30 : 0,\n },\n },\n elements: {\n bar: {\n borderRadius: getStyleNumber('--em-chart-style-border-radius-default'),\n // stacked === 'percentage' ? 0 : getStyleNumber('--em-chart-style-border-radius-default'),\n },\n },\n plugins: {\n legend: { display: showLegend },\n datalabels: {\n display: (context) => {\n return showValueLabels && context.dataset.data[context.dataIndex] !== 0 ? 'auto' : false;\n },\n },\n tooltip: {\n enabled: showTooltips,\n },\n },\n } as Partial<ChartOptions<'bar'>>);\n};\n","import { FC, useRef } from 'react';\nimport { Bar } from 'react-chartjs-2';\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n LogarithmicScale,\n} from 'chart.js';\nimport { BaseBarChartProps } from './bars.types';\nimport { getSegmentIndexClicked } from '../chartjs.utils';\nimport { getBarChartData, getBarChartOptions } from './bars.utils';\nimport styles from '../charts.module.css';\nimport { mergician } from 'mergician';\n\nChartJS.register(CategoryScale, LinearScale, BarElement, LogarithmicScale, Title, Tooltip, Legend);\n\nexport type BarChartProps = BaseBarChartProps;\n\nexport const BarChart: FC<BarChartProps> = ({ data, onSegmentClick, options = {}, ...props }) => {\n const chartRef = useRef(null);\n\n const barChartOptions = mergician(getBarChartOptions(props), options);\n\n const handleSegmentClick = (event: React.MouseEvent<HTMLCanvasElement>) => {\n const indexClicked = getSegmentIndexClicked(event, chartRef);\n onSegmentClick?.(indexClicked);\n };\n\n return (\n <div className={styles.chartContainer}>\n <Bar\n ref={chartRef}\n data={getBarChartData(data)}\n options={barChartOptions}\n onClick={handleSegmentClick}\n />\n </div>\n );\n};\n","import { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { Theme } from '../../../theme/theme.types';\nimport { remarkableTheme } from '../../../theme/theme.constants';\nimport { ChartData, ChartOptions } from 'chart.js';\nimport { getThemeFormatter } from '../../../theme/formatter/formatter.utils';\nimport { groupTailAsOther } from '../charts.utils';\nimport { i18n } from '../../../theme/i18n/i18n';\nimport { getColor } from '../../../theme/styles/styles.utils';\nimport { chartColors } from '../../../../remarkable-ui';\nimport { getObjectStableKey } from '../../../utils.ts/object.utils';\nimport { chartContrastColors } from '../../../../remarkable-ui/charts/charts.constants';\n\nexport const getBarStackedChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n groupDimension: Dimension;\n measure: Measure;\n },\n theme: Theme,\n): ChartData<'bar'> => {\n const themeFormatter = getThemeFormatter(theme);\n const { data = [], dimension, groupDimension, measure } = props;\n\n const axis = [...new Set(data.map((d) => d[dimension.name]).filter(Boolean))].sort();\n\n const groupBy = [...new Set(data.map((d) => d[groupDimension.name]))];\n\n const themeKey = getObjectStableKey(theme);\n\n const datasets = groupBy.map((groupByItem, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n groupByItem,\n theme.charts.backgroundColors ?? chartContrastColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n groupByItem,\n theme.charts.borderColors ?? chartContrastColors,\n index,\n );\n\n return {\n label: themeFormatter.data(groupDimension, groupByItem),\n backgroundColor,\n borderColor,\n data: axis.map((axisItem) => {\n const record = data.find(\n (d) => d[groupDimension.name] === groupByItem && d[dimension.name] === axisItem,\n );\n return record ? Number(record[measure.name]) : 0;\n }),\n };\n });\n\n return {\n labels: axis.map((axisItem) => themeFormatter.data(dimension, axisItem)),\n datasets,\n };\n};\nexport const getBarChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n measures: Measure[];\n maxItems?: number;\n },\n theme: Theme = remarkableTheme,\n): ChartData<'bar'> => {\n const themeFormatter = getThemeFormatter(theme);\n\n if (!props.data) {\n return {\n labels: [],\n datasets: [{ data: [] }],\n };\n }\n\n const themeKey = getObjectStableKey(theme);\n const groupedData = groupTailAsOther(props.data, props.dimension, props.measures, props.maxItems);\n\n return {\n labels: groupedData.map((item) => {\n const value = item[props.dimension.name];\n const formattedValue = themeFormatter.data(props.dimension, value);\n\n // If formatter did not work, try i18n translation\n if (value === formattedValue) {\n return i18n.t(value);\n }\n return formattedValue;\n }),\n datasets: props.measures.map((measure, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n measure.name,\n theme.charts.backgroundColors ?? chartColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n measure.name,\n theme.charts.borderColors ?? chartColors,\n index,\n );\n\n return {\n label: themeFormatter.dimensionOrMeasureTitle(measure),\n data: groupedData.map((item) => item[measure.name]),\n backgroundColor,\n borderColor,\n };\n }),\n };\n};\n\nexport const getBarChartProOptions = (\n options: {\n onBarClicked: (args: {\n axisDimensionValue: string | null;\n groupingDimensionValue: string | null;\n }) => void;\n measure: Measure;\n horizontal: boolean;\n },\n theme: Theme,\n): Partial<ChartOptions<'bar'>> => {\n const { onBarClicked, measure, horizontal } = options;\n\n const themeFormatter = getThemeFormatter(theme);\n return {\n plugins: {\n legend: { position: theme.charts.legendPosition ?? 'bottom' },\n datalabels: {\n formatter: (value: string | number) => themeFormatter.data(options.measure, value),\n },\n tooltip: {\n callbacks: {\n label(context) {\n const raw = context.raw as number;\n return `${context.dataset.label || ''}: ${themeFormatter.data(measure, raw)}`;\n },\n },\n },\n },\n scales: {\n x: {\n ticks: {\n ...(horizontal && {\n callback: (value) => themeFormatter.data(measure, value),\n }),\n },\n },\n y: {\n ticks: {\n ...(!horizontal && {\n callback: (value) => themeFormatter.data(measure, value),\n }),\n },\n },\n },\n onClick: (_event, elements, chart) => {\n const element = elements[0];\n const axisDimensionValue = (element ? chart.data.labels![element.index] : null) as\n | string\n | null;\n const groupingDimensionValue = (\n element ? chart.data.datasets[element.datasetIndex]!.label : null\n ) as string | null;\n\n onBarClicked({\n axisDimensionValue,\n groupingDimensionValue,\n });\n },\n };\n};\n","import dayjs from 'dayjs';\nimport {\n DataResponse,\n Dimension,\n Granularity,\n TimeRange,\n TimeRangeDeserializedValue,\n} from '@embeddable.com/core';\nimport { Theme } from '../../theme/theme.types';\n\ntype DataResponseDataRecord = NonNullable<DataResponse['data']>[number];\n\nconst DATE_FORMATS = {\n DEFAULT: 'YYYY-MM-DDTHH:mm:ss.SSS',\n WITH_TIMEZONE: 'YYYY-MM-DDTHH:mm:ss.SSS[Z]',\n WITHOUT_TIMEZONE: 'YYYY-MM-DDTHH:mm:ss.SSS',\n WITHOUT_MILLISECONDS: 'YYYY-MM-DDTHH:mm:ss',\n};\n\n/**\n * Maps granularity to dayjs unit for date manipulation\n */\nconst granularityToDayjsUnitMap: Record<Granularity, dayjs.ManipulateType> = {\n second: 'second',\n minute: 'minute',\n hour: 'hour',\n day: 'day',\n week: 'week',\n month: 'month',\n quarter: 'month', // Will be handled specially\n year: 'year',\n};\n\n/**\n * Formats a Date object as YYYY-MM-DD string in local timezone\n */\nconst formatDateAsString = (date: Date): string => {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n};\n\n/**\n * Formats a Date object as YYYY-MM-DD string in UTC timezone\n */\nconst formatDateAsStringUTC = (date: Date): string => {\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`;\n};\n\n/**\n * Checks if a date is in UTC format (contains 'Z')\n */\nconst isUTCDate = (date: Date): boolean => {\n return date.toISOString().includes('Z');\n};\n\n/**\n * Formats a date string based on whether it's UTC or local\n */\nconst formatDateString = (date: Date): string => {\n return isUTCDate(date) ? formatDateAsStringUTC(date) : formatDateAsString(date);\n};\n\n/**\n * Gets the quarter start date for a given dayjs date\n */\nconst getQuarterStart = (date: dayjs.Dayjs): dayjs.Dayjs => {\n return date\n .startOf('month')\n .month(Math.floor(date.month() / 3) * 3)\n .startOf('month');\n};\n\n/**\n * Applies granularity-specific start/end logic to dates\n */\nconst applyGranularityBounds = (date: dayjs.Dayjs, granularity: Granularity): dayjs.Dayjs => {\n const unit = granularityToDayjsUnit(granularity);\n\n if (granularity === 'week') {\n return date.startOf('week');\n } else if (granularity === 'quarter') {\n return getQuarterStart(date);\n } else {\n return date.startOf(unit);\n }\n};\n\n/**\n * Resolves date bounds from dimension inputs, handling relative time strings\n */\nconst resolveDateBounds = (dimension: Dimension, theme?: Theme): TimeRange => {\n const dateBounds = dimension.inputs?.dateBounds;\n if (!dateBounds) return undefined;\n\n // If it already has from/to dates, use them directly\n if (dateBounds.from && dateBounds.to) {\n return dateBounds;\n }\n\n // If it has a relativeTimeString, resolve it using theme options\n const relativeTimeString = dateBounds.relativeTimeString;\n if (relativeTimeString) {\n const dateRangeOptions = theme?.editors?.dateRangeSelectFieldPro?.options ?? [];\n const matchedOption = dateRangeOptions.find((option) => option.value === relativeTimeString);\n\n if (matchedOption) {\n const range = matchedOption.getRange() as TimeRangeDeserializedValue;\n return {\n from: range.from,\n to: range.to,\n relativeTimeString: relativeTimeString,\n };\n }\n }\n\n return undefined;\n};\n\nexport type FillGapsOptions = {\n dimension: Dimension;\n granularity?: Granularity;\n sortOrder?: 'asc' | 'desc';\n dateBounds?: TimeRangeDeserializedValue;\n theme?: Theme;\n};\n\n/**\n * Fills missing time buckets in a date-series based on granularity and sorting\n *\n * @param data - Array of date records to process\n * @param options - Configuration options for gap filling\n * @returns Array with missing time buckets filled in\n *\n * @example\n * ```typescript\n * const data = [\n * { date: '2024-01-01', value: 10 },\n * { date: '2024-01-03', value: 20 }\n * ];\n * const result = fillGaps(data, {\n * dimension: { name: 'date' },\n * granularity: 'day'\n * });\n * // Result: [{ date: '2024-01-01', value: 10 }, { date: '2024-01-02', value: null }, { date: '2024-01-03', value: 20 }]\n * ```\n */\nexport const fillGaps = (\n data: DataResponse['data'],\n options: FillGapsOptions,\n): DataResponse['data'] => {\n const { dimension, granularity = 'day', sortOrder = 'asc', dateBounds, theme } = options;\n\n // Resolve date bounds from dimension inputs if not provided directly\n const resolvedDateBounds = dateBounds || resolveDateBounds(dimension, theme);\n\n if (!data || data.length === 0) {\n return data;\n }\n\n if (!dimension?.name) {\n throw new Error('dimension.name is required');\n }\n\n // Get the dimension name - use granularity-specific name if available\n const dimensionName = getGranularityDimensionName(dimension.name, granularity, data);\n\n // Parse dates and filter valid ones\n const validData = data\n .map((record) => {\n const dateValue = record[dimensionName];\n if (typeof dateValue !== 'string') {\n return null;\n }\n const parsedDate = dayjs(dateValue);\n return parsedDate.isValid() ? { ...record, _parsedDate: parsedDate } : null;\n })\n .filter(\n (record): record is DataResponseDataRecord & { _parsedDate: dayjs.Dayjs } => record !== null,\n );\n\n if (validData.length === 0) {\n console.warn('fillGaps: No valid dates found in data');\n return data;\n }\n\n // Determine date range\n let minDate: dayjs.Dayjs;\n let maxDate: dayjs.Dayjs;\n\n if (resolvedDateBounds) {\n // Parse dates with timezone-safe approach\n const fromDate =\n resolvedDateBounds.from instanceof Date\n ? resolvedDateBounds.from\n : new Date(resolvedDateBounds.from!);\n const toDate =\n resolvedDateBounds.to instanceof Date\n ? resolvedDateBounds.to\n : new Date(resolvedDateBounds.to!);\n\n // For sub-day granularities, preserve time component\n if (granularity === 'second' || granularity === 'minute' || granularity === 'hour') {\n minDate = dayjs(fromDate);\n maxDate = dayjs(toDate);\n } else {\n // For day+ granularities, extract date only to avoid timezone issues\n const fromDateStr = formatDateString(fromDate);\n const toDateStr = formatDateString(toDate);\n\n minDate = dayjs(fromDateStr);\n maxDate = dayjs(toDateStr);\n }\n\n // Apply granularity-specific start/end logic\n minDate = applyGranularityBounds(minDate, granularity);\n maxDate = applyGranularityBounds(maxDate, granularity);\n } else {\n // Use data range - more efficient single pass\n const firstRecord = validData[0];\n if (!firstRecord) {\n return data;\n }\n\n let min = firstRecord._parsedDate;\n let max = firstRecord._parsedDate;\n\n for (let i = 1; i < validData.length; i++) {\n const record = validData[i];\n if (record) {\n const date = record._parsedDate;\n if (date.isBefore(min)) min = date;\n if (date.isAfter(max)) max = date;\n }\n }\n\n minDate = min;\n maxDate = max;\n }\n\n // Generate all possible dates in the range\n const allDates: dayjs.Dayjs[] = [];\n\n // Normalize both dates to the start of their respective granularity units\n const dayjsUnit = granularityToDayjsUnit(granularity);\n const minDateStart = minDate.startOf(dayjsUnit);\n const maxDateStart = maxDate.startOf(dayjsUnit);\n\n if (granularity === 'week') {\n // For week granularity, start from the first day and add exactly 7 days\n let currentDate = minDateStart;\n while (currentDate.isBefore(maxDateStart) || currentDate.isSame(maxDateStart, 'day')) {\n allDates.push(currentDate);\n currentDate = currentDate.add(7, 'day'); // Add exactly 7 days\n }\n } else {\n // For other granularities, use the standard approach\n let currentDate = minDateStart;\n\n while (currentDate.isBefore(maxDateStart) || currentDate.isSame(maxDateStart, dayjsUnit)) {\n allDates.push(currentDate);\n\n if (granularity === 'quarter') {\n currentDate = currentDate.add(3, 'month');\n } else {\n currentDate = currentDate.add(1, dayjsUnit);\n }\n }\n }\n\n // Create a map of existing data by date\n const existingDataMap = new Map<string, DataResponseDataRecord>();\n validData.forEach((record) => {\n const dateKey = generateDateKey(record._parsedDate);\n existingDataMap.set(dateKey, record);\n });\n\n // Fill gaps\n const result: DataResponse['data'] = [];\n allDates.forEach((date) => {\n const dateKey = generateDateKey(date);\n const existingRecord = existingDataMap.get(dateKey);\n\n if (existingRecord) {\n // Use existing data - exclude internal _parsedDate field\n const cleanRecord = { ...existingRecord };\n delete cleanRecord._parsedDate;\n result.push(cleanRecord);\n } else {\n // Create gap record with zero/null values\n // Use the same date format as the original data\n const dateFormat = getDateFormatFromSample(data);\n const formattedDate = formatDateForGapRecord(date, dateFormat);\n\n const gapRecord: DataResponseDataRecord = {\n [dimensionName]: formattedDate,\n };\n\n // Set all other dimensions to null/zero, but preserve date fields\n const baseDimensionName = dimension.name;\n const sampleRecord = data[0];\n if (sampleRecord) {\n for (const key of Object.keys(sampleRecord)) {\n if (key !== dimensionName) {\n // If this is another date dimension (same base name), use the same date\n if (key.startsWith(baseDimensionName) && key !== dimensionName) {\n gapRecord[key] = formattedDate;\n } else {\n gapRecord[key] = null;\n }\n }\n }\n }\n\n result.push(gapRecord);\n }\n });\n\n // Sort the result\n if (sortOrder === 'desc') {\n result.sort(\n (a, b) =>\n dayjs(b[dimensionName] as string).valueOf() - dayjs(a[dimensionName] as string).valueOf(),\n );\n } else {\n result.sort(\n (a, b) =>\n dayjs(a[dimensionName] as string).valueOf() - dayjs(b[dimensionName] as string).valueOf(),\n );\n }\n\n return result;\n};\n\n/**\n * Generates a consistent date key for mapping\n * Includes time component to support second/minute granularities\n */\nconst generateDateKey = (date: dayjs.Dayjs): string => {\n return date.format('YYYY-MM-DDTHH:mm:ss');\n};\n\n/**\n * Gets the correct dimension name based on granularity\n */\nconst getGranularityDimensionName = (\n baseDimensionName: string,\n granularity: Granularity,\n data: DataResponse['data'],\n): string => {\n if (!data || data.length === 0) return baseDimensionName;\n\n const sampleRecord = data[0];\n if (!sampleRecord) return baseDimensionName;\n\n const granularityKey = `${baseDimensionName}.${granularity}`;\n\n // Check if granularity-specific dimension exists in the data\n if (granularityKey in sampleRecord) {\n return granularityKey;\n }\n\n // Fallback to base dimension name\n return baseDimensionName;\n};\n\n/**\n * Detects the date format from sample data\n */\nconst getDateFormatFromSample = (data: DataResponse['data']): string => {\n if (!data?.length) return DATE_FORMATS.DEFAULT;\n\n const sampleRecord = data[0];\n if (!sampleRecord) return DATE_FORMATS.DEFAULT;\n\n // Look for any date field to determine format\n for (const value of Object.values(sampleRecord)) {\n if (typeof value === 'string' && value.includes('T') && value.includes(':')) {\n if (value.endsWith('Z')) {\n return DATE_FORMATS.WITH_TIMEZONE;\n }\n if (value.includes('.')) {\n return DATE_FORMATS.WITHOUT_TIMEZONE;\n }\n return DATE_FORMATS.WITHOUT_MILLISECONDS;\n }\n }\n\n return DATE_FORMATS.DEFAULT;\n};\n\n/**\n * Formats a date for gap records using the detected format\n */\nconst formatDateForGapRecord = (date: dayjs.Dayjs, dateFormat: string): string => {\n if (dateFormat.includes('[Z]')) {\n return date.format(DATE_FORMATS.WITH_TIMEZONE);\n } else if (dateFormat.includes('.SSS')) {\n return date.format(DATE_FORMATS.WITHOUT_TIMEZONE);\n } else {\n return date.format(DATE_FORMATS.WITHOUT_MILLISECONDS);\n }\n};\n\n/**\n * Maps granularity to dayjs unit\n */\nconst granularityToDayjsUnit = (granularity: Granularity): dayjs.ManipulateType => {\n return granularityToDayjsUnitMap[granularity] || granularityToDayjsUnitMap.day;\n};\n","import { useMemo } from 'react';\nimport { DataResponse, Dimension, Granularity } from '@embeddable.com/core';\nimport { fillGaps, type FillGapsOptions } from './charts.fillGaps.utils';\nimport { useTheme } from '@embeddable.com/react';\nimport { Theme } from '../../theme/theme.types';\n\n/**\n * Hook that automatically applies fillGaps to chart data when beneficial.\n *\n * This hook intelligently fills missing time buckets in date-series data based on:\n * - The granularity from dimension inputs or auto-detected granularity from data\n * - Date bounds from dimension inputs (including relative time strings)\n * - Data sparsity analysis to determine if gap filling is needed\n *\n * @param results - The data response containing the chart data\n * @param dimension - The dimension being used for the chart axis (includes granularity in inputs)\n * @returns Enhanced data with filled time gaps, or original data if no gaps need filling\n */\nexport const useChartDataWithFillGaps = (\n results: DataResponse,\n dimension: Dimension,\n): DataResponse => {\n const theme = useTheme() as Theme;\n\n const data = useMemo(() => {\n const data = results.data;\n\n // Only apply fillGaps if:\n // 1. The dimension is a date/time dimension\n // 2. We have data to process\n if (dimension.nativeType !== 'time' || !data || data.length === 0) {\n return data;\n }\n\n // Get granularity from dimension inputs or auto-detect from data\n const effectiveGranularity =\n dimension.inputs?.granularity || detectGranularityFromData(data, dimension);\n\n if (!effectiveGranularity) {\n return data;\n }\n\n // Check if this looks like a sparse time series that would benefit from fillGaps\n // If dimension has date bounds, always apply fillGaps to ensure the specified range is filled\n const hasDateBounds = dimension.inputs?.dateBounds;\n const shouldApply = hasDateBounds ?? shouldApplyFillGaps(data, dimension, effectiveGranularity);\n\n if (!shouldApply) {\n return data;\n }\n\n // Use the effective granularity\n const options: FillGapsOptions = {\n dimension: dimension,\n granularity: effectiveGranularity,\n sortOrder: 'asc',\n theme: theme,\n };\n\n try {\n return fillGaps(data, options);\n } catch (error) {\n console.warn('Failed to apply fillGaps to chart data:', error);\n return data;\n }\n }, [results.data, dimension, theme]);\n return {\n ...results,\n data,\n };\n};\n\n/**\n * Determines if fillGaps should be applied based on data characteristics.\n *\n * Analyzes the time series data to detect if there are significant gaps that would\n * benefit from gap filling. Uses the expected step size for the given granularity\n * to determine if the data appears sparse.\n *\n * @param data - The chart data to analyze\n * @param dimension - The dimension being used for the time axis\n * @param granularity - The granularity to use for gap analysis (e.g., 'day', 'week')\n * @returns True if gap filling should be applied, false otherwise\n */\nconst shouldApplyFillGaps = (\n data: DataResponse['data'],\n dimension: Dimension,\n granularity: string,\n): boolean => {\n if (!data || data.length < 2) {\n return false; // Too few data points\n }\n\n const dimensionName = dimension.name;\n const dates = data\n .map((record) => record[dimensionName])\n .filter(Boolean)\n .map((dateStr) => new Date(dateStr as string))\n .filter((date) => !isNaN(date.getTime()))\n .sort((a, b) => a.getTime() - b.getTime());\n\n if (dates.length < 2) {\n return false; // Not enough valid dates\n }\n\n // Calculate expected step size based on granularity\n const expectedStepMs = getGranularityStepMs(granularity);\n\n // Check if there are gaps larger than expected step\n for (let i = 1; i < dates.length; i++) {\n const currentDate = dates[i];\n const previousDate = dates[i - 1];\n if (currentDate && previousDate) {\n const actualStep = currentDate.getTime() - previousDate.getTime();\n // If actual step is more than 1.5x the expected step, we have a gap\n if (actualStep > expectedStepMs * 1.5) {\n return true;\n }\n }\n }\n\n return false;\n};\n\n/**\n * Detects granularity from data by examining dimension names in the data.\n *\n * Looks for granularity-specific dimension names (e.g., 'events.date.week')\n * to infer the appropriate granularity for gap filling. Falls back to the\n * base dimension name if no granularity-specific dimension is found.\n *\n * @param data - The chart data to analyze\n * @param dimension - The base dimension being used\n * @returns Detected granularity or null if none can be determined\n */\nconst detectGranularityFromData = (\n data: DataResponse['data'],\n dimension: Dimension,\n): Granularity | null => {\n if (!data || data.length === 0) return null;\n\n const sampleRecord = data[0];\n if (!sampleRecord) return null;\n\n const baseDimensionName = dimension.name;\n\n // Look for granularity-specific dimension names in the data\n const granularityKeys = Object.keys(sampleRecord).filter(\n (key) => key.startsWith(baseDimensionName) && key !== baseDimensionName,\n );\n\n // Check for common granularity patterns\n for (const key of granularityKeys) {\n if (key.includes('.second')) return 'second';\n if (key.includes('.minute')) return 'minute';\n if (key.includes('.hour')) return 'hour';\n if (key.includes('.day')) return 'day';\n if (key.includes('.week')) return 'week';\n if (key.includes('.month')) return 'month';\n if (key.includes('.quarter')) return 'quarter';\n if (key.includes('.year')) return 'year';\n }\n\n // If no granularity-specific dimension found, return null\n return null;\n};\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\nexport const TIME_CONSTANTS = {\n SECOND,\n MINUTE,\n HOUR,\n DAY,\n WEEK: 7 * DAY,\n MONTH: 30 * DAY, // Approximate\n QUARTER: 90 * DAY, // Approximate\n YEAR: 365 * DAY, // Approximate\n} as const;\n\n/**\n * Gets the expected step size in milliseconds for a given granularity.\n *\n * Returns the expected time interval between consecutive data points for\n * the specified granularity. Used to detect if there are gaps in the\n * time series data that would benefit from gap filling.\n *\n * @param granularity - The time granularity (e.g., 'day', 'week', 'month')\n * @returns Expected step size in milliseconds\n */\nconst getGranularityStepMs = (granularity: string): number => {\n switch (granularity) {\n case 'second':\n return TIME_CONSTANTS.SECOND;\n case 'minute':\n return TIME_CONSTANTS.MINUTE;\n case 'hour':\n return TIME_CONSTANTS.HOUR;\n case 'day':\n return TIME_CONSTANTS.DAY;\n case 'week':\n return TIME_CONSTANTS.WEEK;\n case 'month':\n return TIME_CONSTANTS.MONTH;\n case 'quarter':\n return TIME_CONSTANTS.QUARTER;\n case 'year':\n return TIME_CONSTANTS.YEAR;\n default:\n return TIME_CONSTANTS.DAY; // Default fallback\n }\n};\n"],"names":["defaultBarChartOptions","chartjsOptions","getStyle","getStyleNumber","getBarChartData","data","_a","dataset","index","colors","chartContrastColors","defaultDataset","mergician","getDatalabelTotalDisplay","context","showTotalLabels","getDatalabelTotalFormatter","_value","datasets","i","total","sum","ds","val","getBarVerticalChartOptions","config","getBarHorizontalChartOptions","getBarChartOptions","props","horizontal","showLegend","showTooltips","showValueLabels","options","ChartJS","CategoryScale","LinearScale","BarElement","LogarithmicScale","Title","Tooltip","Legend","BarChart","onSegmentClick","chartRef","useRef","barChartOptions","handleSegmentClick","event","indexClicked","getSegmentIndexClicked","jsx","styles","Bar","getBarStackedChartProData","theme","themeFormatter","getThemeFormatter","dimension","groupDimension","measure","axis","d","groupBy","themeKey","getObjectStableKey","groupByItem","backgroundColor","getColor","borderColor","axisItem","record","getBarChartProData","remarkableTheme","groupedData","groupTailAsOther","item","value","formattedValue","i18n","chartColors","getBarChartProOptions","onBarClicked","raw","_event","elements","chart","element","axisDimensionValue","groupingDimensionValue","DATE_FORMATS","granularityToDayjsUnitMap","formatDateAsString","date","formatDateAsStringUTC","isUTCDate","formatDateString","getQuarterStart","applyGranularityBounds","granularity","unit","granularityToDayjsUnit","resolveDateBounds","dateBounds","relativeTimeString","matchedOption","_c","_b","option","range","fillGaps","sortOrder","resolvedDateBounds","dimensionName","getGranularityDimensionName","validData","dateValue","parsedDate","dayjs","minDate","maxDate","fromDate","toDate","fromDateStr","toDateStr","firstRecord","min","max","allDates","dayjsUnit","minDateStart","maxDateStart","currentDate","existingDataMap","dateKey","generateDateKey","result","existingRecord","cleanRecord","dateFormat","getDateFormatFromSample","formattedDate","formatDateForGapRecord","gapRecord","baseDimensionName","sampleRecord","key","a","b","granularityKey","useChartDataWithFillGaps","results","useTheme","useMemo","effectiveGranularity","detectGranularityFromData","shouldApplyFillGaps","error","dates","dateStr","expectedStepMs","getGranularityStepMs","previousDate","granularityKeys","SECOND","MINUTE","HOUR","DAY","TIME_CONSTANTS"],"mappings":"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"}
|
|
@@ -2186,9 +2186,10 @@ function Jt({
|
|
|
2186
2186
|
children: e,
|
|
2187
2187
|
as: t = "p",
|
|
2188
2188
|
className: n,
|
|
2189
|
-
|
|
2189
|
+
style: i,
|
|
2190
|
+
title: s
|
|
2190
2191
|
}) {
|
|
2191
|
-
return /* @__PURE__ */ M.jsx(t, { title:
|
|
2192
|
+
return /* @__PURE__ */ M.jsx(t, { title: s, className: De(Fh.typography, n), style: i, children: e });
|
|
2192
2193
|
}
|
|
2193
2194
|
const jh = Ot.forwardRef(
|
|
2194
2195
|
({ children: e, className: t, ...n }, i) => /* @__PURE__ */ M.jsx("div", { className: De(He.card, t), ref: i, ...n, children: e })
|
|
@@ -15905,6 +15906,16 @@ const LS = ({ data: e, options: t = {}, onSegmentClick: n }) => {
|
|
|
15905
15906
|
category: "Component Data",
|
|
15906
15907
|
inputs: Ts
|
|
15907
15908
|
}, jS = {
|
|
15909
|
+
name: "dimensionTime",
|
|
15910
|
+
type: "dimension",
|
|
15911
|
+
label: "Dimension Time",
|
|
15912
|
+
config: {
|
|
15913
|
+
dataset: "dataset",
|
|
15914
|
+
supportedTypes: ["time"]
|
|
15915
|
+
},
|
|
15916
|
+
required: !0,
|
|
15917
|
+
category: "Component Data"
|
|
15918
|
+
}, BS = {
|
|
15908
15919
|
name: "dimension",
|
|
15909
15920
|
type: "dimension",
|
|
15910
15921
|
label: "Dimension",
|
|
@@ -15914,7 +15925,7 @@ const LS = ({ data: e, options: t = {}, onSegmentClick: n }) => {
|
|
|
15914
15925
|
required: !0,
|
|
15915
15926
|
category: "Component Data",
|
|
15916
15927
|
inputs: dS
|
|
15917
|
-
},
|
|
15928
|
+
}, zS = {
|
|
15918
15929
|
name: "dimensions",
|
|
15919
15930
|
type: "dimension",
|
|
15920
15931
|
label: "Dimensions",
|
|
@@ -15924,7 +15935,7 @@ const LS = ({ data: e, options: t = {}, onSegmentClick: n }) => {
|
|
|
15924
15935
|
required: !0,
|
|
15925
15936
|
category: "Component Data",
|
|
15926
15937
|
inputs: Ts
|
|
15927
|
-
},
|
|
15938
|
+
}, $S = {
|
|
15928
15939
|
name: "measure",
|
|
15929
15940
|
type: "measure",
|
|
15930
15941
|
label: "Measure",
|
|
@@ -15934,7 +15945,7 @@ const LS = ({ data: e, options: t = {}, onSegmentClick: n }) => {
|
|
|
15934
15945
|
required: !0,
|
|
15935
15946
|
category: "Component Data",
|
|
15936
15947
|
inputs: Ts
|
|
15937
|
-
},
|
|
15948
|
+
}, WS = {
|
|
15938
15949
|
name: "measures",
|
|
15939
15950
|
type: "measure",
|
|
15940
15951
|
label: "Measures",
|
|
@@ -15945,125 +15956,145 @@ const LS = ({ data: e, options: t = {}, onSegmentClick: n }) => {
|
|
|
15945
15956
|
required: !0,
|
|
15946
15957
|
category: "Component Data",
|
|
15947
15958
|
inputs: Ts
|
|
15948
|
-
},
|
|
15959
|
+
}, VS = {
|
|
15960
|
+
name: "boolean",
|
|
15961
|
+
type: "boolean",
|
|
15962
|
+
label: "Boolean",
|
|
15963
|
+
category: "Component Settings"
|
|
15964
|
+
}, HS = {
|
|
15965
|
+
name: "timeRange",
|
|
15966
|
+
type: "timeRange",
|
|
15967
|
+
label: "Time Range",
|
|
15968
|
+
category: "Component Settings"
|
|
15969
|
+
}, YS = {
|
|
15970
|
+
name: "number",
|
|
15971
|
+
type: "number",
|
|
15972
|
+
label: "Number",
|
|
15973
|
+
category: "Component Settings"
|
|
15974
|
+
}, US = {
|
|
15975
|
+
name: "string",
|
|
15976
|
+
type: "string",
|
|
15977
|
+
label: "String",
|
|
15978
|
+
category: "Component Settings"
|
|
15979
|
+
}, KS = {
|
|
15949
15980
|
name: "title",
|
|
15950
15981
|
type: "string",
|
|
15951
15982
|
label: "Title",
|
|
15952
15983
|
category: "Component Header"
|
|
15953
|
-
},
|
|
15984
|
+
}, XS = {
|
|
15954
15985
|
name: "description",
|
|
15955
15986
|
type: "string",
|
|
15956
15987
|
label: "Description",
|
|
15957
15988
|
category: "Component Header"
|
|
15958
|
-
},
|
|
15989
|
+
}, GS = {
|
|
15959
15990
|
name: "showLegend",
|
|
15960
15991
|
type: "boolean",
|
|
15961
15992
|
label: "Show Legend",
|
|
15962
15993
|
defaultValue: !0,
|
|
15963
15994
|
category: "Component Settings"
|
|
15964
|
-
},
|
|
15995
|
+
}, qS = {
|
|
15965
15996
|
name: "showTooltips",
|
|
15966
15997
|
type: "boolean",
|
|
15967
15998
|
label: "Show Tooltips",
|
|
15968
15999
|
defaultValue: !0,
|
|
15969
16000
|
category: "Component Settings"
|
|
15970
|
-
},
|
|
16001
|
+
}, JS = {
|
|
15971
16002
|
name: "showValueLabels",
|
|
15972
16003
|
type: "boolean",
|
|
15973
16004
|
label: "Show Value Labels",
|
|
15974
16005
|
defaultValue: !0,
|
|
15975
16006
|
category: "Component Settings"
|
|
15976
|
-
},
|
|
16007
|
+
}, ZS = {
|
|
15977
16008
|
name: "showTotalLabels",
|
|
15978
16009
|
type: "boolean",
|
|
15979
16010
|
label: "Show Total Labels",
|
|
15980
16011
|
defaultValue: !1,
|
|
15981
16012
|
category: "Component Settings"
|
|
15982
|
-
},
|
|
16013
|
+
}, QS = {
|
|
15983
16014
|
name: "showLogarithmicScale",
|
|
15984
16015
|
type: "boolean",
|
|
15985
16016
|
label: "Show Logarithmic Scale",
|
|
15986
16017
|
defaultValue: !1,
|
|
15987
16018
|
category: "Component Settings"
|
|
15988
|
-
},
|
|
16019
|
+
}, tM = {
|
|
15989
16020
|
name: "xAxisLabel",
|
|
15990
16021
|
type: "string",
|
|
15991
16022
|
label: "X-axis Label",
|
|
15992
16023
|
category: "Axes Settings"
|
|
15993
|
-
},
|
|
16024
|
+
}, eM = {
|
|
15994
16025
|
name: "yAxisLabel",
|
|
15995
16026
|
type: "string",
|
|
15996
16027
|
label: "Y-axis Label",
|
|
15997
16028
|
category: "Axes Settings"
|
|
15998
|
-
},
|
|
16029
|
+
}, nM = {
|
|
15999
16030
|
name: "reverseXAxis",
|
|
16000
16031
|
type: "boolean",
|
|
16001
16032
|
label: "Reverse X-axis",
|
|
16002
16033
|
defaultValue: !1,
|
|
16003
16034
|
category: "Axes Settings"
|
|
16004
|
-
},
|
|
16035
|
+
}, iM = {
|
|
16005
16036
|
name: "displayPercentages",
|
|
16006
16037
|
type: "boolean",
|
|
16007
16038
|
label: "Display Percentages",
|
|
16008
16039
|
defaultValue: !1,
|
|
16009
16040
|
category: "Component Settings"
|
|
16010
|
-
},
|
|
16041
|
+
}, sM = {
|
|
16011
16042
|
name: "reverseYAxis",
|
|
16012
16043
|
type: "boolean",
|
|
16013
16044
|
label: "Reverse Y-axis",
|
|
16014
16045
|
defaultValue: !1,
|
|
16015
16046
|
category: "Axes Settings"
|
|
16016
|
-
},
|
|
16047
|
+
}, oM = {
|
|
16017
16048
|
name: "yAxisRangeMin",
|
|
16018
16049
|
type: "number",
|
|
16019
16050
|
label: "Y-axis Range Min",
|
|
16020
16051
|
category: "Axes Settings"
|
|
16021
|
-
},
|
|
16052
|
+
}, rM = {
|
|
16022
16053
|
name: "yAxisRangeMax",
|
|
16023
16054
|
type: "number",
|
|
16024
16055
|
label: "Y-axis Range Max",
|
|
16025
16056
|
category: "Axes Settings"
|
|
16026
|
-
},
|
|
16057
|
+
}, aM = {
|
|
16027
16058
|
name: "xAxisRangeMin",
|
|
16028
16059
|
type: "number",
|
|
16029
16060
|
label: "X-axis Range Min",
|
|
16030
16061
|
category: "Axes Settings"
|
|
16031
|
-
},
|
|
16062
|
+
}, lM = {
|
|
16032
16063
|
name: "xAxisRangeMax",
|
|
16033
16064
|
type: "number",
|
|
16034
16065
|
label: "X-axis Range Max",
|
|
16035
16066
|
category: "Axes Settings"
|
|
16036
|
-
},
|
|
16067
|
+
}, cM = {
|
|
16037
16068
|
name: "xAxisMaxItems",
|
|
16038
16069
|
type: "number",
|
|
16039
16070
|
label: "Max X-axis Items",
|
|
16040
16071
|
category: "Axes Settings"
|
|
16041
|
-
},
|
|
16072
|
+
}, uM = {
|
|
16042
16073
|
name: "yAxisMaxItems",
|
|
16043
16074
|
type: "number",
|
|
16044
16075
|
label: "Max Y-axis Items",
|
|
16045
16076
|
category: "Axes Settings"
|
|
16046
|
-
},
|
|
16077
|
+
}, dM = {
|
|
16047
16078
|
name: "showTopItems",
|
|
16048
16079
|
type: "number",
|
|
16049
16080
|
label: "Show Top Items",
|
|
16050
16081
|
defaultValue: 10,
|
|
16051
16082
|
category: "Component Data"
|
|
16052
|
-
},
|
|
16083
|
+
}, fM = {
|
|
16053
16084
|
name: "maxLegendItems",
|
|
16054
16085
|
type: "number",
|
|
16055
16086
|
label: "Max Legend Items",
|
|
16056
16087
|
defaultValue: 10,
|
|
16057
16088
|
category: "Component Data"
|
|
16058
|
-
},
|
|
16089
|
+
}, hM = {
|
|
16059
16090
|
name: "placeholder",
|
|
16060
16091
|
type: "string",
|
|
16061
16092
|
label: "Placeholder",
|
|
16062
16093
|
category: "Component Settings"
|
|
16063
16094
|
};
|
|
16064
16095
|
export {
|
|
16065
|
-
|
|
16066
|
-
|
|
16096
|
+
mS as $,
|
|
16097
|
+
ZS as A,
|
|
16067
16098
|
G as B,
|
|
16068
16099
|
et as C,
|
|
16069
16100
|
sS as D,
|
|
@@ -16081,68 +16112,73 @@ export {
|
|
|
16081
16112
|
rf as P,
|
|
16082
16113
|
ec as Q,
|
|
16083
16114
|
st as R,
|
|
16084
|
-
|
|
16085
|
-
|
|
16086
|
-
|
|
16115
|
+
lS as S,
|
|
16116
|
+
jS as T,
|
|
16117
|
+
HS as U,
|
|
16087
16118
|
pS as V,
|
|
16088
|
-
|
|
16089
|
-
|
|
16090
|
-
|
|
16091
|
-
|
|
16092
|
-
|
|
16093
|
-
|
|
16094
|
-
|
|
16095
|
-
|
|
16096
|
-
|
|
16097
|
-
|
|
16098
|
-
|
|
16099
|
-
|
|
16100
|
-
|
|
16101
|
-
|
|
16102
|
-
|
|
16103
|
-
|
|
16104
|
-
|
|
16105
|
-
|
|
16106
|
-
|
|
16107
|
-
|
|
16108
|
-
|
|
16109
|
-
|
|
16110
|
-
|
|
16111
|
-
|
|
16112
|
-
|
|
16113
|
-
|
|
16114
|
-
|
|
16115
|
-
|
|
16116
|
-
|
|
16117
|
-
|
|
16118
|
-
|
|
16119
|
-
|
|
16120
|
-
|
|
16121
|
-
|
|
16122
|
-
|
|
16123
|
-
|
|
16119
|
+
VS as W,
|
|
16120
|
+
YS as X,
|
|
16121
|
+
fM as Y,
|
|
16122
|
+
ls as Z,
|
|
16123
|
+
hM as _,
|
|
16124
|
+
WS as a,
|
|
16125
|
+
bS as a0,
|
|
16126
|
+
De as a1,
|
|
16127
|
+
jh as a2,
|
|
16128
|
+
vS as a3,
|
|
16129
|
+
dc as a4,
|
|
16130
|
+
Bh as a5,
|
|
16131
|
+
Jt as a6,
|
|
16132
|
+
_S as a7,
|
|
16133
|
+
CS as a8,
|
|
16134
|
+
kS as a9,
|
|
16135
|
+
hy as aa,
|
|
16136
|
+
PS as ab,
|
|
16137
|
+
wy as ac,
|
|
16138
|
+
Sy as ad,
|
|
16139
|
+
TS as ae,
|
|
16140
|
+
LS as af,
|
|
16141
|
+
os as ag,
|
|
16142
|
+
lf as ah,
|
|
16143
|
+
cf as ai,
|
|
16144
|
+
uf as aj,
|
|
16145
|
+
df as ak,
|
|
16146
|
+
ff as al,
|
|
16147
|
+
hf as am,
|
|
16148
|
+
gf as an,
|
|
16149
|
+
cS as ao,
|
|
16150
|
+
uS as ap,
|
|
16151
|
+
zS as aq,
|
|
16152
|
+
US as ar,
|
|
16153
|
+
iM as as,
|
|
16154
|
+
dM as at,
|
|
16155
|
+
rc as au,
|
|
16156
|
+
kh as av,
|
|
16157
|
+
xS as aw,
|
|
16158
|
+
BS as b,
|
|
16159
|
+
XS as c,
|
|
16124
16160
|
NS as d,
|
|
16125
|
-
|
|
16126
|
-
|
|
16127
|
-
|
|
16128
|
-
|
|
16161
|
+
qS as e,
|
|
16162
|
+
JS as f,
|
|
16163
|
+
QS as g,
|
|
16164
|
+
sM as h,
|
|
16129
16165
|
yS as i,
|
|
16130
16166
|
M as j,
|
|
16131
|
-
|
|
16132
|
-
|
|
16167
|
+
aM as k,
|
|
16168
|
+
lM as l,
|
|
16133
16169
|
rs as m,
|
|
16134
|
-
|
|
16170
|
+
uM as n,
|
|
16135
16171
|
gS as o,
|
|
16136
|
-
|
|
16137
|
-
|
|
16172
|
+
nM as p,
|
|
16173
|
+
oM as q,
|
|
16138
16174
|
IS as r,
|
|
16139
|
-
|
|
16140
|
-
|
|
16141
|
-
|
|
16142
|
-
|
|
16143
|
-
|
|
16144
|
-
|
|
16145
|
-
|
|
16175
|
+
GS as s,
|
|
16176
|
+
KS as t,
|
|
16177
|
+
rM as u,
|
|
16178
|
+
cM as v,
|
|
16179
|
+
$S as w,
|
|
16180
|
+
tM as x,
|
|
16181
|
+
eM as y,
|
|
16146
16182
|
FS as z
|
|
16147
16183
|
};
|
|
16148
|
-
//# sourceMappingURL=component.constants-
|
|
16184
|
+
//# sourceMappingURL=component.constants-DIhZCTG3.js.map
|