@lieselthuriot/widget-renderer 0.1.0 → 0.2.0
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/README.md +299 -244
- package/fesm2022/{lieselthuriot-widget-renderer-chart-accessibility-CXEeXwdH.mjs → lieselthuriot-widget-renderer-chart-accessibility-BzH2alxy.mjs} +23 -16
- package/fesm2022/lieselthuriot-widget-renderer-chart-accessibility-BzH2alxy.mjs.map +1 -0
- package/fesm2022/lieselthuriot-widget-renderer-chart-element-renderer-wVHdIYuJ.mjs +993 -0
- package/fesm2022/lieselthuriot-widget-renderer-chart-element-renderer-wVHdIYuJ.mjs.map +1 -0
- package/fesm2022/lieselthuriot-widget-renderer.mjs +299 -37
- package/fesm2022/lieselthuriot-widget-renderer.mjs.map +1 -1
- package/package.json +10 -8
- package/types/lieselthuriot-widget-renderer.d.ts +42 -8
- package/types/lieselthuriot-widget-renderer.d.ts.map +1 -1
- package/fesm2022/lieselthuriot-widget-renderer-chart-accessibility-CXEeXwdH.mjs.map +0 -1
- package/fesm2022/lieselthuriot-widget-renderer-chart-element-renderer-BO3V-jYo.mjs +0 -722
- package/fesm2022/lieselthuriot-widget-renderer-chart-element-renderer-BO3V-jYo.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lieselthuriot-widget-renderer-chart-accessibility-CXEeXwdH.mjs","names":[],"sources":["../../../projects/widget-renderer/src/lib/widget-locale.ts","../../../projects/widget-renderer/src/lib/widget-tooltip.ts","../../../projects/widget-renderer/src/lib/chart-accessibility.ts"],"sourcesContent":["export interface WidgetRendererChartLocale {\n progressAriaLabel: (title: string | undefined, value: string, range: string) => string;\n gaugeAriaLabel: (title: string | undefined, value: string, max: string) => string;\n chartAriaLabel: (title: string | undefined, chartType: string, pointCount: number) => string;\n progressSummary: (\n title: string | undefined,\n value: string,\n min: string,\n max: string,\n breakdown: string,\n ) => string;\n gaugeSummary: (\n title: string | undefined,\n value: string,\n max: string,\n percentage: string,\n ) => string;\n dataSummary: (title: string | undefined, points: string) => string;\n noDataSummary: (title: string | undefined) => string;\n noSegmentsSummary: string;\n morePoints: (count: number) => string;\n progressSegmentLabel: (label: string, value: string) => string;\n progressBreakdown: (label: string, start: string, end: string) => string;\n}\n\nexport interface WidgetRendererAriaLocale {\n toolbarActions: string;\n loading: string;\n showSensitiveData: string;\n hideSensitiveData: string;\n imageUnavailable: string;\n chart: WidgetRendererChartLocale;\n}\n\nexport interface WidgetRendererLocale {\n aria: WidgetRendererAriaLocale;\n}\n\nexport interface WidgetRendererLocaleOverrides {\n aria?: Partial<Omit<WidgetRendererAriaLocale, 'chart'>> & {\n chart?: Partial<WidgetRendererChartLocale>;\n };\n}\n\nconst chart = {\n progressAriaLabel: (title: string | undefined, value: string, range: string) =>\n `${title || 'Progress'}, ${value} of ${range}.`,\n gaugeAriaLabel: (title: string | undefined, value: string, max: string) =>\n `${title || 'Gauge'}, ${value} of ${max}.`,\n chartAriaLabel: (title: string | undefined, chartType: string, pointCount: number) =>\n `${title || chartType} chart, ${pointCount} data points.`,\n progressSummary: (\n title: string | undefined,\n value: string,\n min: string,\n max: string,\n breakdown: string,\n ) => `${title || 'Progress'}: ${value} of ${max}; range ${min} to ${max}.${breakdown}`,\n gaugeSummary: (title: string | undefined, value: string, max: string, percentage: string) =>\n `${title || 'Gauge'}: value ${value} of ${max}, ${percentage} percent.`,\n dataSummary: (title: string | undefined, points: string) =>\n `${title ? `${title}: ` : ''}${points}.`,\n noDataSummary: (title: string | undefined) => `${title ? `${title}: ` : ''}no data.`,\n noSegmentsSummary: ' No segments.',\n morePoints: (count: number) => `${count} more points.`,\n progressSegmentLabel: (label: string, value: string) => `${label}: ${value}`,\n progressBreakdown: (label: string, start: string, end: string) => `${label}: ${start} to ${end}`,\n} satisfies WidgetRendererChartLocale;\n\nexport const defaultWidgetRendererLocale: WidgetRendererLocale = {\n aria: {\n toolbarActions: 'Widget actions',\n loading: 'Widget loading',\n showSensitiveData: 'Show sensitive data',\n hideSensitiveData: 'Hide sensitive data',\n imageUnavailable: 'Image unavailable',\n chart,\n },\n};\n\nfunction locale(\n aria: Omit<WidgetRendererAriaLocale, 'chart'>,\n chartLocale: WidgetRendererChartLocale,\n): WidgetRendererLocale {\n return { aria: { ...aria, chart: chartLocale } };\n}\n\nexport const germanWidgetRendererLocale = locale(\n {\n toolbarActions: 'Widget-Aktionen',\n loading: 'Widget wird geladen',\n showSensitiveData: 'Sensible Daten anzeigen',\n hideSensitiveData: 'Sensible Daten ausblenden',\n imageUnavailable: 'Bild nicht verfügbar',\n },\n {\n ...chart,\n progressAriaLabel: (title, value, range) => `${title || 'Fortschritt'}, ${value} von ${range}.`,\n gaugeAriaLabel: (title, value, max) => `${title || 'Messwert'}, ${value} von ${max}.`,\n chartAriaLabel: (title, type, count) => `${title || `${type}-Diagramm`}, ${count} Datenpunkte.`,\n progressSummary: (title, value, min, max, breakdown) =>\n `${title || 'Fortschritt'}: ${value} von ${max}; Bereich ${min} bis ${max}.${breakdown}`,\n gaugeSummary: (title, value, max, percentage) =>\n `${title || 'Messwert'}: Wert ${value} von ${max}, ${percentage} Prozent.`,\n noDataSummary: (title) => `${title ? `${title}: ` : ''}keine Daten.`,\n noSegmentsSummary: ' Keine Segmente.',\n morePoints: (count) => `${count} weitere Datenpunkte.`,\n progressSegmentLabel: (label, value) => `${label}: ${value}`,\n progressBreakdown: (label, start, end) => `${label}: ${start} bis ${end}`,\n },\n);\n\nexport const frenchWidgetRendererLocale = locale(\n {\n toolbarActions: 'Actions du widget',\n loading: 'Chargement du widget',\n showSensitiveData: 'Afficher les données sensibles',\n hideSensitiveData: 'Masquer les données sensibles',\n imageUnavailable: 'Image indisponible',\n },\n {\n ...chart,\n progressAriaLabel: (title, value, range) => `${title || 'Progression'}, ${value} sur ${range}.`,\n gaugeAriaLabel: (title, value, max) => `${title || 'Jauge'}, ${value} sur ${max}.`,\n chartAriaLabel: (title, type, count) =>\n `${title || `Graphique ${type}`}, ${count} points de données.`,\n progressSummary: (title, value, min, max, breakdown) =>\n `${title || 'Progression'} : ${value} sur ${max} ; plage de ${min} à ${max}.${breakdown}`,\n gaugeSummary: (title, value, max, percentage) =>\n `${title || 'Jauge'} : valeur ${value} sur ${max}, ${percentage} pour cent.`,\n noDataSummary: (title) => `${title ? `${title} : ` : ''}aucune donnée.`,\n noSegmentsSummary: ' Aucun segment.',\n morePoints: (count) => `${count} points de données supplémentaires.`,\n progressSegmentLabel: (label, value) => `${label} : ${value}`,\n progressBreakdown: (label, start, end) => `${label} : de ${start} à ${end}`,\n },\n);\n\nexport const dutchWidgetRendererLocale = locale(\n {\n toolbarActions: 'Widgetacties',\n loading: 'Widget wordt geladen',\n showSensitiveData: 'Gevoelige gegevens tonen',\n hideSensitiveData: 'Gevoelige gegevens verbergen',\n imageUnavailable: 'Afbeelding niet beschikbaar',\n },\n {\n ...chart,\n progressAriaLabel: (title, value, range) => `${title || 'Voortgang'}, ${value} van ${range}.`,\n gaugeAriaLabel: (title, value, max) => `${title || 'Meter'}, ${value} van ${max}.`,\n chartAriaLabel: (title, type, count) =>\n `${title || `${type}-grafiek`}, ${count} gegevenspunten.`,\n progressSummary: (title, value, min, max, breakdown) =>\n `${title || 'Voortgang'}: ${value} van ${max}; bereik ${min} tot ${max}.${breakdown}`,\n gaugeSummary: (title, value, max, percentage) =>\n `${title || 'Meter'}: waarde ${value} van ${max}, ${percentage} procent.`,\n noDataSummary: (title) => `${title ? `${title}: ` : ''}geen gegevens.`,\n noSegmentsSummary: ' Geen segmenten.',\n morePoints: (count) => `${count} extra gegevenspunten.`,\n progressSegmentLabel: (label, value) => `${label}: ${value}`,\n progressBreakdown: (label, start, end) => `${label}: ${start} tot ${end}`,\n },\n);\n","import { Injectable, signal } from '@angular/core';\n\nexport interface ProgressTooltipState {\n x: number;\n y: number;\n label: string;\n value: number;\n color?: string;\n}\n\n@Injectable()\nexport class WidgetTooltip {\n readonly progress = signal<ProgressTooltipState | null>(null);\n private readonly overlay = signal<HTMLElement | null>(null);\n private progressOwner: object | null = null;\n\n setOverlay(overlay: HTMLElement): void {\n this.overlay.set(overlay);\n }\n\n overlayElement(): HTMLElement | null {\n return this.overlay();\n }\n\n showProgress(owner: object, state: ProgressTooltipState): void {\n this.progressOwner = owner;\n this.progress.set(state);\n }\n\n hideProgress(owner: object): void {\n if (this.progressOwner !== owner) return;\n this.progressOwner = null;\n this.progress.set(null);\n }\n\n clear(): void {\n this.progressOwner = null;\n this.progress.set(null);\n this.overlay.set(null);\n }\n}\n","import { ChartElement, ProgressElement, ProgressSegment } from './widget.model';\nimport { defaultWidgetRendererLocale, WidgetRendererChartLocale } from './widget-locale';\n\nconst MAX_POINTS = 20;\n\nfunction number(value: number): string {\n return Number.isInteger(value)\n ? `${value}`\n : value.toFixed(2).replace(/0+$/, '').replace(/\\.$/, '');\n}\n\nfunction points(\n data: { label: string; value: number }[],\n locale: WidgetRendererChartLocale,\n): string {\n const visible = data\n .slice(0, MAX_POINTS)\n .map((point) => `${point.label}: ${number(point.value)}`);\n const remaining = data.length - visible.length;\n return remaining > 0\n ? `${visible.join('; ')}; ${locale.morePoints(remaining)}`\n : visible.join('; ');\n}\n\nfunction progressSegments(\n element: ProgressElement,\n): { segment: ProgressSegment; start: number; end: number }[] {\n let position = element.data.min;\n return element.data.items.flatMap((item) => {\n const start = position;\n position += item.value;\n return item.kind === 'segment' ? [{ segment: item, start, end: position }] : [];\n });\n}\n\nfunction progressValue(element: ProgressElement): number {\n return element.data.items.reduce(\n (total, item) => total + (item.kind === 'segment' ? item.value : 0),\n 0,\n );\n}\n\nexport function chartAriaLabel(\n element: ChartElement | ProgressElement,\n locale = defaultWidgetRendererLocale.aria.chart,\n): string {\n if (element.type === 'progress') {\n return locale.progressAriaLabel(\n element.title,\n number(progressValue(element)),\n number(element.data.max - element.data.min),\n );\n }\n if (element.type === 'gauge') {\n return locale.gaugeAriaLabel(\n element.title,\n number(element.data.value),\n number(element.data.max),\n );\n }\n return locale.chartAriaLabel(element.title, element.type, element.data.length);\n}\n\nexport function chartAccessibilitySummary(\n element: ChartElement | ProgressElement,\n locale = defaultWidgetRendererLocale.aria.chart,\n): string {\n if (element.type === 'progress') {\n const segments = progressSegments(element);\n const breakdown = segments.length\n ? ` ${segments.map(({ segment, start, end }) => locale.progressBreakdown(segment.label, number(start), number(end))).join('; ')}.`\n : locale.noSegmentsSummary;\n return locale.progressSummary(\n element.title,\n number(progressValue(element)),\n number(element.data.min),\n number(element.data.max),\n breakdown,\n );\n }\n if (element.type === 'gauge') {\n const range = element.data.max - element.data.min;\n const percentage = Math.max(\n 0,\n Math.min(100, ((element.data.value - element.data.min) / range) * 100),\n );\n return locale.gaugeSummary(\n element.title,\n number(element.data.value),\n number(element.data.max),\n number(percentage),\n );\n }\n if (!element.data.length) return locale.noDataSummary(element.title);\n return locale.dataSummary(element.title, points(element.data, locale));\n}\n"],"mappings":"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"}
|