@praxisui/charts 9.0.26 → 9.0.28
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/ai/component-registry.json +31 -16
- package/fesm2022/praxisui-charts.mjs +860 -783
- package/package.json +3 -3
- package/types/praxisui-charts.d.ts +21 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, Optional, Inject, InjectionToken, input, booleanAttribute, output, viewChild, inject, ElementRef, NgZone, DestroyRef, signal, computed, afterNextRender, effect, ChangeDetectionStrategy, Component, ViewChild, Input, Injector, ENVIRONMENT_INITIALIZER } from '@angular/core';
|
|
3
3
|
import * as i1 from '@praxisui/core';
|
|
4
|
-
import { buildApiUrl, API_URL, PraxisI18nService, SETTINGS_PANEL_BRIDGE, normalizePraxisDataQueryContext, resolvePraxisFilterCriteria, BUILTIN_PAGE_THEME_PRESETS, PraxisIconButtonComponent, normalizePraxisPresentationVisualization, AnalyticsStatsRequestBuilderService,
|
|
4
|
+
import { buildApiUrl, API_URL, PraxisI18nService, SETTINGS_PANEL_BRIDGE, normalizePraxisDataQueryContext, resolvePraxisFilterCriteria, BUILTIN_PAGE_THEME_PRESETS, PraxisIconButtonComponent, normalizePraxisPresentationVisualization, AnalyticsStatsRequestBuilderService, AnalyticsPresentationResolver, providePraxisI18n, ComponentMetadataRegistry, ResourceDiscoveryService, SETTINGS_PANEL_DATA, createDefaultTableConfig, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, DynamicWidgetPageComponent } from '@praxisui/core';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { throwError, map, of, isObservable, from, firstValueFrom, timeout, BehaviorSubject, Subscription } from 'rxjs';
|
|
7
7
|
import * as i1$2 from '@angular/material/tooltip';
|
|
@@ -9,7 +9,7 @@ import { MatTooltipModule } from '@angular/material/tooltip';
|
|
|
9
9
|
import * as i1$1 from '@angular/common/http';
|
|
10
10
|
import { HttpErrorResponse } from '@angular/common/http';
|
|
11
11
|
import { catchError } from 'rxjs/operators';
|
|
12
|
-
import { AnalyticsTableConfigAdapterService, AnalyticsTableStatsApiService, PraxisTable } from '@praxisui/table';
|
|
12
|
+
import { AnalyticsTableConfigAdapterService, AnalyticsTableStatsApiService, ANALYTICS_TABLE_ROW_KEY_FIELD, PraxisTable } from '@praxisui/table';
|
|
13
13
|
import { use, init } from 'echarts/core';
|
|
14
14
|
import { BarChart, FunnelChart, LineChart, PieChart, ScatterChart } from 'echarts/charts';
|
|
15
15
|
import { AriaComponent, DatasetComponent, GridComponent, LegendComponent, TitleComponent, TooltipComponent, TransformComponent } from 'echarts/components';
|
|
@@ -3894,493 +3894,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
3894
3894
|
type: Optional
|
|
3895
3895
|
}] }] });
|
|
3896
3896
|
|
|
3897
|
-
const
|
|
3898
|
-
'praxis.charts.runtime.editChart': 'Edit chart settings',
|
|
3899
|
-
'praxis.charts.runtime.invalidDocumentTitle': 'Invalid canonical configuration',
|
|
3900
|
-
'praxis.charts.runtime.invalidDocumentDescription': 'The canonical chart document could not be mapped by Praxis Charts. Review the chart contract before continuing.',
|
|
3901
|
-
'praxis.charts.runtime.remoteErrorTitle': 'Chart data could not be loaded',
|
|
3902
|
-
'praxis.charts.runtime.remoteErrorDescription': 'Review the chart data source and analytics request before continuing.',
|
|
3903
|
-
'praxis.charts.runtime.booleanFalseLabel': 'Not {{ label }}',
|
|
3904
|
-
'praxis.charts.runtime.comparisonCurrent': 'Current',
|
|
3905
|
-
'praxis.charts.runtime.comparisonPrevious': 'Previous',
|
|
3906
|
-
'praxis.charts.widget.missingDocument': 'This widget does not have a canonical chart document yet. Runtime inputs are preserved until a canonical chartDocument is provided by the host.',
|
|
3907
|
-
'praxis.charts.widget.queryContext.label': 'Query context',
|
|
3908
|
-
'praxis.charts.widget.queryContext.ariaLabel': 'Chart query context',
|
|
3909
|
-
'praxis.charts.widget.queryContext.invalidJson': 'Query context must be valid JSON.',
|
|
3910
|
-
'praxis.charts.widget.queryContext.mustBeObject': 'Query context must be a JSON object.',
|
|
3911
|
-
'praxis.charts.editor.section.general': 'General',
|
|
3912
|
-
'praxis.charts.editor.section.data': 'Data',
|
|
3913
|
-
'praxis.charts.editor.section.analytics': 'Analytics',
|
|
3914
|
-
'praxis.charts.editor.section.appearance': 'Appearance',
|
|
3915
|
-
'praxis.charts.editor.section.motion': 'Motion',
|
|
3916
|
-
'praxis.charts.editor.section.events': 'Events',
|
|
3917
|
-
'praxis.charts.editor.section.preview': 'Preview',
|
|
3918
|
-
'praxis.charts.editor.field.chartId': 'Chart ID',
|
|
3919
|
-
'praxis.charts.editor.field.kind': 'Kind',
|
|
3920
|
-
'praxis.charts.editor.field.title': 'Title',
|
|
3921
|
-
'praxis.charts.editor.field.subtitle': 'Subtitle',
|
|
3922
|
-
'praxis.charts.editor.field.sizingMode': 'Sizing',
|
|
3923
|
-
'praxis.charts.editor.field.height': 'Height',
|
|
3924
|
-
'praxis.charts.editor.field.minHeight': 'Minimum height',
|
|
3925
|
-
'praxis.charts.editor.field.maxHeight': 'Maximum height',
|
|
3926
|
-
'praxis.charts.editor.field.aspectRatio': 'Aspect ratio',
|
|
3927
|
-
'praxis.charts.editor.field.sourceKind': 'Source',
|
|
3928
|
-
'praxis.charts.editor.field.resource': 'Resource',
|
|
3929
|
-
'praxis.charts.editor.field.operation': 'Operation',
|
|
3930
|
-
'praxis.charts.editor.field.granularity': 'Granularity',
|
|
3931
|
-
'praxis.charts.editor.field.fillGaps': 'Fill missing intervals',
|
|
3932
|
-
'praxis.charts.editor.field.distributionMode': 'Distribution mode',
|
|
3933
|
-
'praxis.charts.editor.field.bucketSize': 'Bucket size',
|
|
3934
|
-
'praxis.charts.editor.field.bucketCount': 'Bucket count',
|
|
3935
|
-
'praxis.charts.editor.field.comparisonPeriodField': 'Period field',
|
|
3936
|
-
'praxis.charts.editor.field.comparisonTimezone': 'Timezone',
|
|
3937
|
-
'praxis.charts.editor.field.comparisonPreset': 'Period preset',
|
|
3938
|
-
'praxis.charts.editor.field.comparisonMode': 'Comparison mode',
|
|
3939
|
-
'praxis.charts.editor.field.dimension': 'Dimension',
|
|
3940
|
-
'praxis.charts.editor.field.dimensionRole': 'Dimension role',
|
|
3941
|
-
'praxis.charts.editor.field.metric': 'Metric',
|
|
3942
|
-
'praxis.charts.editor.field.metricLabel': 'Metric label',
|
|
3943
|
-
'praxis.charts.editor.field.metricAggregation': 'Aggregation',
|
|
3944
|
-
'praxis.charts.editor.field.metricAxis': 'Axis',
|
|
3945
|
-
'praxis.charts.editor.field.metricSeriesKind': 'Series kind',
|
|
3946
|
-
'praxis.charts.editor.field.legendEnabled': 'Show legend',
|
|
3947
|
-
'praxis.charts.editor.field.labelsEnabled': 'Show labels',
|
|
3948
|
-
'praxis.charts.editor.field.tooltipEnabled': 'Show tooltip',
|
|
3949
|
-
'praxis.charts.editor.field.themeVariant': 'Theme variant',
|
|
3950
|
-
'praxis.charts.editor.field.paletteMode': 'Palette mode',
|
|
3951
|
-
'praxis.charts.editor.field.paletteToken': 'Palette token',
|
|
3952
|
-
'praxis.charts.editor.field.palette': 'Palette colors',
|
|
3953
|
-
'praxis.charts.editor.field.surfaceMode': 'Surface mode',
|
|
3954
|
-
'praxis.charts.editor.field.emptyTitle': 'Empty title',
|
|
3955
|
-
'praxis.charts.editor.field.emptyDescription': 'Empty description',
|
|
3956
|
-
'praxis.charts.editor.field.loadingTitle': 'Loading title',
|
|
3957
|
-
'praxis.charts.editor.field.loadingDescription': 'Loading description',
|
|
3958
|
-
'praxis.charts.editor.field.errorTitle': 'Error title',
|
|
3959
|
-
'praxis.charts.editor.field.errorDescription': 'Error description',
|
|
3960
|
-
'praxis.charts.editor.field.motionEnabled': 'Enable animations',
|
|
3961
|
-
'praxis.charts.editor.field.motionPreset': 'Motion preset',
|
|
3962
|
-
'praxis.charts.editor.field.eventAction': 'Action',
|
|
3963
|
-
'praxis.charts.editor.field.eventTarget': 'Target',
|
|
3964
|
-
'praxis.charts.editor.field.eventMapping': 'Mapping',
|
|
3965
|
-
'praxis.charts.editor.preview.title': 'Chart preview',
|
|
3966
|
-
'praxis.charts.editor.preview.caption': 'Local preview derived from the canonical contract without remote calls.',
|
|
3967
|
-
'praxis.charts.editor.preview.invalid': 'Preview is unavailable while the contract has blocking errors.',
|
|
3968
|
-
'praxis.charts.editor.issues.title': 'Validation issues',
|
|
3969
|
-
'praxis.charts.editor.issues.empty': 'No issues were identified.',
|
|
3970
|
-
'praxis.charts.editor.appearance.featuresTitle': 'Display features',
|
|
3971
|
-
'praxis.charts.editor.appearance.paletteTitle': 'Palette',
|
|
3972
|
-
'praxis.charts.editor.appearance.paletteHint': 'Use a registered token or comma-separated colors to persist theme.palette in the canonical contract.',
|
|
3973
|
-
'praxis.charts.editor.appearance.surfaceTitle': 'Surface',
|
|
3974
|
-
'praxis.charts.editor.appearance.surfaceHint': 'Use embedded for dashboard widgets and contained only when the chart must own its visual surface.',
|
|
3975
|
-
'praxis.charts.editor.appearance.statesTitle': 'State messages',
|
|
3976
|
-
'praxis.charts.editor.catalog.resourceMissing': 'Resource catalog is required for governed praxis.stats authoring.',
|
|
3977
|
-
'praxis.charts.editor.catalog.resourceStale': 'Selected resource is not available in the governed resource catalog.',
|
|
3978
|
-
'praxis.charts.editor.catalog.operationMissing': 'Selected resource does not publish authorable stats operations.',
|
|
3979
|
-
'praxis.charts.editor.catalog.operationStale': 'Selected operation is not supported by the governed resource catalog.',
|
|
3980
|
-
'praxis.charts.editor.catalog.fieldCatalogMissing': 'The selected resource does not publish governed fields for chart authoring.',
|
|
3981
|
-
'praxis.charts.editor.catalog.dimensionFieldsMissing': 'No governed dimensions are available for the current resource and operation.',
|
|
3982
|
-
'praxis.charts.editor.catalog.metricFieldsMissing': 'No governed metrics are available for the current resource and operation.',
|
|
3983
|
-
'praxis.charts.editor.catalog.dimensionFieldStale': 'Selected dimension is not eligible for the current resource and operation.',
|
|
3984
|
-
'praxis.charts.editor.catalog.metricFieldStale': 'Selected metric is not eligible for the current resource and operation.',
|
|
3985
|
-
'praxis.charts.editor.catalog.metricAggregationStale': 'Selected aggregation is not allowed for the selected metric field.',
|
|
3986
|
-
'praxis.charts.editor.catalog.comparisonPeriodFieldsMissing': 'No governed time-series field is available for comparison periods.',
|
|
3987
|
-
'praxis.charts.editor.catalog.comparisonPeriodFieldStale': 'Selected period field is not time-series eligible for the governed comparison operation.',
|
|
3988
|
-
'praxis.charts.editor.catalog.targetMissing': 'Target catalog is required for this governed event action.',
|
|
3989
|
-
'praxis.charts.editor.catalog.targetStale': 'Selected target is not available for this event action.',
|
|
3990
|
-
'praxis.charts.editor.catalog.capabilitiesDenied': 'Access to the selected resource capabilities was denied.',
|
|
3991
|
-
'praxis.charts.editor.catalog.capabilitiesUnavailable': 'The selected resource capabilities are temporarily unavailable.',
|
|
3992
|
-
'praxis.charts.editor.catalog.contextUnavailable': 'Governed chart authoring context could not be resolved.',
|
|
3993
|
-
'praxis.charts.widget.contextDiagnostics.title': 'Authoring context',
|
|
3994
|
-
'praxis.charts.widget.contextDiagnostics.catalogDenied': 'Access to the governed resource catalog was denied.',
|
|
3995
|
-
'praxis.charts.widget.contextDiagnostics.catalogUnavailable': 'The governed resource catalog is temporarily unavailable.',
|
|
3996
|
-
'praxis.charts.widget.contextDiagnostics.catalogEmpty': 'No authorable stats resources were published by the governed catalog.',
|
|
3997
|
-
'praxis.charts.widget.contextDiagnostics.catalogPathInvalid': 'The resource catalog published an unsafe or non-relative operational path.',
|
|
3998
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesDenied': 'Access to the selected resource capabilities was denied.',
|
|
3999
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesUnavailable': 'The selected resource capabilities are temporarily unavailable.',
|
|
4000
|
-
'praxis.charts.widget.contextDiagnostics.operationsEmpty': 'The selected resource does not publish authorable stats operations.',
|
|
4001
|
-
'praxis.charts.widget.contextDiagnostics.fieldsEmpty': 'The selected resource does not publish governed fields for chart authoring.',
|
|
4002
|
-
'praxis.charts.widget.contextDiagnostics.identityMismatch': 'The selected resource identity does not match its governed capability snapshot.',
|
|
4003
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesPathInvalid': 'The selected capability snapshot did not publish a safe governed resource path.',
|
|
4004
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesPathMismatch': 'The selected capability snapshot path does not match the operational path published by the catalog.',
|
|
4005
|
-
'praxis.charts.widget.contextDiagnostics.partial': 'Some governed authoring choices could not be materialized from the current page context.',
|
|
4006
|
-
'praxis.charts.editor.hint.sizingMode': 'Use fill-container only when the host widget provides a defined body height.',
|
|
4007
|
-
'praxis.charts.editor.hint.height': 'Numbers are saved as pixels; CSS lengths such as 20rem are also accepted.',
|
|
4008
|
-
'praxis.charts.editor.hint.minHeight': 'Set a readable minimum for compact dashboard widgets.',
|
|
4009
|
-
'praxis.charts.editor.hint.maxHeight': 'Leave empty unless the chart must stop growing inside a flexible layout.',
|
|
4010
|
-
'praxis.charts.editor.hint.aspectRatio': 'Optional. Use values such as 1.777 or 16 / 9.',
|
|
4011
|
-
'praxis.charts.editor.analytics.dimensionsTitle': 'Dimensions',
|
|
4012
|
-
'praxis.charts.editor.analytics.metricsTitle': 'Metrics',
|
|
4013
|
-
'praxis.charts.editor.analytics.addDimension': 'Add dimension',
|
|
4014
|
-
'praxis.charts.editor.analytics.addMetric': 'Add metric',
|
|
4015
|
-
'praxis.charts.editor.analytics.removeDimension': 'Remove dimension',
|
|
4016
|
-
'praxis.charts.editor.analytics.removeMetric': 'Remove metric',
|
|
4017
|
-
'praxis.charts.editor.specialization.timeseriesTitle': 'Timeseries options',
|
|
4018
|
-
'praxis.charts.editor.specialization.distributionTitle': 'Distribution options',
|
|
4019
|
-
'praxis.charts.editor.specialization.comparisonTitle': 'Comparison period',
|
|
4020
|
-
'praxis.charts.editor.specialization.comboTitle': 'Combo guidance',
|
|
4021
|
-
'praxis.charts.editor.specialization.comboHint': 'Combo charts require at least two metrics and allow per-metric axis and series kind mapping.',
|
|
4022
|
-
'praxis.charts.editor.specialization.pieDonutTitle': 'Composition guidance',
|
|
4023
|
-
'praxis.charts.editor.themeVariant.none': 'No variant',
|
|
4024
|
-
'praxis.charts.editor.themeVariant.default': 'Default',
|
|
4025
|
-
'praxis.charts.editor.themeVariant.compact': 'Compact',
|
|
4026
|
-
'praxis.charts.editor.themeVariant.executive': 'Executive',
|
|
4027
|
-
'praxis.charts.editor.paletteMode.token': 'Registered token',
|
|
4028
|
-
'praxis.charts.editor.paletteMode.custom': 'Custom colors',
|
|
4029
|
-
'praxis.charts.editor.paletteToken.brand-primary': 'Brand primary',
|
|
4030
|
-
'praxis.charts.editor.paletteToken.brand-balanced': 'Brand balanced',
|
|
4031
|
-
'praxis.charts.editor.paletteToken.status': 'Status',
|
|
4032
|
-
'praxis.charts.editor.paletteToken.executive': 'Executive',
|
|
4033
|
-
'praxis.charts.editor.specialization.pieDonutHint': 'Pie, donut, funnel and pyramid charts keep one metric and use the first dimension as the category segment.',
|
|
4034
|
-
'praxis.charts.editor.specialization.scatterTitle': 'Scatter guidance',
|
|
4035
|
-
'praxis.charts.editor.specialization.scatterHint': 'Scatter charts use the first dimension as X and the first metric as Y.',
|
|
4036
|
-
'praxis.charts.editor.events.pointClickTitle': 'Point click',
|
|
4037
|
-
'praxis.charts.editor.events.selectionChangeTitle': 'Selection change',
|
|
4038
|
-
'praxis.charts.editor.events.drillDownTitle': 'Drill down',
|
|
4039
|
-
'praxis.charts.editor.events.crossFilterTitle': 'Cross filter',
|
|
4040
|
-
'praxis.charts.editor.events.none': 'None',
|
|
4041
|
-
'praxis.charts.editor.sourceKind.praxisStats': 'praxis.stats',
|
|
4042
|
-
'praxis.charts.editor.sourceKind.derived': 'derived',
|
|
4043
|
-
'praxis.charts.editor.sizing.fixed': 'Fixed height',
|
|
4044
|
-
'praxis.charts.editor.sizing.fill-container': 'Fill widget',
|
|
4045
|
-
'praxis.charts.editor.sizing.auto': 'Automatic',
|
|
4046
|
-
'praxis.charts.editor.surface.auto': 'Automatic',
|
|
4047
|
-
'praxis.charts.editor.surface.embedded': 'Embedded in widget',
|
|
4048
|
-
'praxis.charts.editor.surface.contained': 'Contained surface',
|
|
4049
|
-
'praxis.charts.editor.operation.groupBy': 'group-by',
|
|
4050
|
-
'praxis.charts.editor.operation.timeseries': 'timeseries',
|
|
4051
|
-
'praxis.charts.editor.operation.distribution': 'distribution',
|
|
4052
|
-
'praxis.charts.editor.operation.comparison': 'comparison',
|
|
4053
|
-
'praxis.charts.editor.granularity.day': 'day',
|
|
4054
|
-
'praxis.charts.editor.granularity.week': 'week',
|
|
4055
|
-
'praxis.charts.editor.granularity.month': 'month',
|
|
4056
|
-
'praxis.charts.editor.distributionMode.terms': 'terms',
|
|
4057
|
-
'praxis.charts.editor.distributionMode.histogram': 'histogram',
|
|
4058
|
-
'praxis.charts.editor.comparisonPreset.TODAY': 'Today',
|
|
4059
|
-
'praxis.charts.editor.comparisonPreset.YESTERDAY': 'Yesterday',
|
|
4060
|
-
'praxis.charts.editor.comparisonPreset.LAST_7_DAYS': 'Last 7 days',
|
|
4061
|
-
'praxis.charts.editor.comparisonPreset.LAST_30_DAYS': 'Last 30 days',
|
|
4062
|
-
'praxis.charts.editor.comparisonPreset.THIS_MONTH': 'This month',
|
|
4063
|
-
'praxis.charts.editor.comparisonPreset.LAST_MONTH': 'Last month',
|
|
4064
|
-
'praxis.charts.editor.comparisonPreset.THIS_QUARTER': 'This quarter',
|
|
4065
|
-
'praxis.charts.editor.comparisonPreset.THIS_YEAR': 'This year',
|
|
4066
|
-
'praxis.charts.editor.comparisonMode.PREVIOUS_ALIGNED': 'Previous aligned period',
|
|
4067
|
-
'praxis.charts.editor.comparisonMode.PREVIOUS_CALENDAR_PERIOD': 'Previous calendar period',
|
|
4068
|
-
'praxis.charts.editor.motionPreset.subtle': 'subtle',
|
|
4069
|
-
'praxis.charts.editor.motionPreset.standard': 'standard',
|
|
4070
|
-
'praxis.charts.editor.motionPreset.expressive': 'expressive',
|
|
4071
|
-
'praxis.charts.editor.dimensionRole.category': 'category',
|
|
4072
|
-
'praxis.charts.editor.dimensionRole.series': 'series',
|
|
4073
|
-
'praxis.charts.editor.dimensionRole.segment': 'segment',
|
|
4074
|
-
'praxis.charts.editor.dimensionRole.time': 'time',
|
|
4075
|
-
'praxis.charts.editor.dimensionRole.value': 'value',
|
|
4076
|
-
'praxis.charts.editor.metricAggregation.sum': 'sum',
|
|
4077
|
-
'praxis.charts.editor.metricAggregation.count': 'count',
|
|
4078
|
-
'praxis.charts.editor.metricAggregation.distinct-count': 'distinct count',
|
|
4079
|
-
'praxis.charts.editor.metricAggregation.avg': 'avg',
|
|
4080
|
-
'praxis.charts.editor.metricAggregation.min': 'min',
|
|
4081
|
-
'praxis.charts.editor.metricAggregation.max': 'max',
|
|
4082
|
-
'praxis.charts.editor.metricAxis.primary': 'primary',
|
|
4083
|
-
'praxis.charts.editor.metricAxis.secondary': 'secondary',
|
|
4084
|
-
'praxis.charts.editor.metricSeriesKind.bar': 'bar',
|
|
4085
|
-
'praxis.charts.editor.metricSeriesKind.line': 'line',
|
|
4086
|
-
'praxis.charts.editor.metricSeriesKind.area': 'area',
|
|
4087
|
-
'praxis.charts.editor.eventAction.filter-widget': 'filter-widget',
|
|
4088
|
-
'praxis.charts.editor.eventAction.open-detail': 'open-detail',
|
|
4089
|
-
'praxis.charts.editor.eventAction.navigate': 'navigate',
|
|
4090
|
-
'praxis.charts.editor.eventAction.update-context': 'update-context',
|
|
4091
|
-
'praxis.charts.editor.eventAction.emit': 'emit',
|
|
4092
|
-
'praxis.charts.editor.kind.bar': 'Bar',
|
|
4093
|
-
'praxis.charts.editor.kind.horizontal-bar': 'Horizontal Bar',
|
|
4094
|
-
'praxis.charts.editor.kind.line': 'Line',
|
|
4095
|
-
'praxis.charts.editor.kind.area': 'Area',
|
|
4096
|
-
'praxis.charts.editor.kind.stacked-bar': 'Stacked Bar',
|
|
4097
|
-
'praxis.charts.editor.kind.stacked-area': 'Stacked Area',
|
|
4098
|
-
'praxis.charts.editor.kind.combo': 'Combo',
|
|
4099
|
-
'praxis.charts.editor.kind.pie': 'Pie',
|
|
4100
|
-
'praxis.charts.editor.kind.donut': 'Donut',
|
|
4101
|
-
'praxis.charts.editor.kind.scatter': 'Scatter',
|
|
4102
|
-
'praxis.charts.editor.kind.funnel': 'Funnel',
|
|
4103
|
-
'praxis.charts.editor.kind.pyramid': 'Pyramid',
|
|
4104
|
-
'praxis.charts.analyticsPresentation.selectorLabel': 'Analytics presentation',
|
|
4105
|
-
'praxis.charts.analyticsPresentation.chart': 'Chart',
|
|
4106
|
-
'praxis.charts.analyticsPresentation.table': 'Table',
|
|
4107
|
-
'praxis.charts.analyticsPresentation.unavailable': 'Presentation unavailable',
|
|
4108
|
-
'praxis.charts.analyticsPresentation.loading': 'Loading analytics…',
|
|
4109
|
-
'praxis.charts.analyticsPresentation.empty': 'No data available.',
|
|
4110
|
-
'praxis.charts.analyticsPresentation.projectionMissing': 'Analytics projection "{projectionId}" was not found.',
|
|
4111
|
-
'praxis.charts.analyticsPresentation.noRenderer': 'Analytics projection "{projectionId}" has no eligible installed renderer.',
|
|
4112
|
-
'praxis.charts.analyticsPresentation.familyIneligible': 'Presentation family "{family}" is not eligible for projection "{projectionId}".',
|
|
4113
|
-
};
|
|
4114
|
-
|
|
4115
|
-
const PRAXIS_CHARTS_PT_BR = {
|
|
4116
|
-
'praxis.charts.runtime.editChart': 'Editar configurações do gráfico',
|
|
4117
|
-
'praxis.charts.runtime.invalidDocumentTitle': 'Configuração canônica inválida',
|
|
4118
|
-
'praxis.charts.runtime.invalidDocumentDescription': 'O documento canônico do gráfico não pode ser mapeado pelo Praxis Charts. Revise o contrato do gráfico antes de continuar.',
|
|
4119
|
-
'praxis.charts.runtime.remoteErrorTitle': 'Não foi possível carregar os dados do gráfico',
|
|
4120
|
-
'praxis.charts.runtime.remoteErrorDescription': 'Revise a fonte de dados e os filtros antes de continuar.',
|
|
4121
|
-
'praxis.charts.runtime.booleanFalseLabel': 'Não {{ label }}',
|
|
4122
|
-
'praxis.charts.runtime.comparisonCurrent': 'Atual',
|
|
4123
|
-
'praxis.charts.runtime.comparisonPrevious': 'Anterior',
|
|
4124
|
-
'praxis.charts.widget.missingDocument': 'Este widget ainda não possui um documento canônico de gráfico. Os inputs runtime são preservados até o host fornecer um chartDocument canônico.',
|
|
4125
|
-
'praxis.charts.widget.queryContext.label': 'Contexto da consulta',
|
|
4126
|
-
'praxis.charts.widget.queryContext.ariaLabel': 'Contexto da consulta do gráfico',
|
|
4127
|
-
'praxis.charts.widget.queryContext.invalidJson': 'O contexto da consulta deve ser um JSON válido.',
|
|
4128
|
-
'praxis.charts.widget.queryContext.mustBeObject': 'O contexto da consulta deve ser um objeto JSON.',
|
|
4129
|
-
'praxis.charts.editor.section.general': 'Geral',
|
|
4130
|
-
'praxis.charts.editor.section.data': 'Dados',
|
|
4131
|
-
'praxis.charts.editor.section.analytics': 'Estrutura',
|
|
4132
|
-
'praxis.charts.editor.section.appearance': 'Aparência',
|
|
4133
|
-
'praxis.charts.editor.section.motion': 'Movimento',
|
|
4134
|
-
'praxis.charts.editor.section.events': 'Eventos',
|
|
4135
|
-
'praxis.charts.editor.section.preview': 'Visualização',
|
|
4136
|
-
'praxis.charts.editor.field.chartId': 'ID do Gráfico',
|
|
4137
|
-
'praxis.charts.editor.field.kind': 'Tipo',
|
|
4138
|
-
'praxis.charts.editor.field.title': 'Título',
|
|
4139
|
-
'praxis.charts.editor.field.subtitle': 'Subtítulo',
|
|
4140
|
-
'praxis.charts.editor.field.sizingMode': 'Tamanho',
|
|
4141
|
-
'praxis.charts.editor.field.height': 'Altura',
|
|
4142
|
-
'praxis.charts.editor.field.minHeight': 'Altura mínima',
|
|
4143
|
-
'praxis.charts.editor.field.maxHeight': 'Altura máxima',
|
|
4144
|
-
'praxis.charts.editor.field.aspectRatio': 'Proporção',
|
|
4145
|
-
'praxis.charts.editor.field.sourceKind': 'Fonte',
|
|
4146
|
-
'praxis.charts.editor.field.resource': 'Recurso',
|
|
4147
|
-
'praxis.charts.editor.field.operation': 'Operação',
|
|
4148
|
-
'praxis.charts.editor.field.granularity': 'Granularidade',
|
|
4149
|
-
'praxis.charts.editor.field.fillGaps': 'Preencher intervalos sem dados',
|
|
4150
|
-
'praxis.charts.editor.field.distributionMode': 'Modo de distribuição',
|
|
4151
|
-
'praxis.charts.editor.field.bucketSize': 'Tamanho do bucket',
|
|
4152
|
-
'praxis.charts.editor.field.bucketCount': 'Quantidade de buckets',
|
|
4153
|
-
'praxis.charts.editor.field.comparisonPeriodField': 'Campo de período',
|
|
4154
|
-
'praxis.charts.editor.field.comparisonTimezone': 'Fuso horário',
|
|
4155
|
-
'praxis.charts.editor.field.comparisonPreset': 'Período predefinido',
|
|
4156
|
-
'praxis.charts.editor.field.comparisonMode': 'Modo de comparação',
|
|
4157
|
-
'praxis.charts.editor.field.dimension': 'Dimensão',
|
|
4158
|
-
'praxis.charts.editor.field.dimensionRole': 'Papel da dimensão',
|
|
4159
|
-
'praxis.charts.editor.field.metric': 'Métrica',
|
|
4160
|
-
'praxis.charts.editor.field.metricLabel': 'Rótulo da métrica',
|
|
4161
|
-
'praxis.charts.editor.field.metricAggregation': 'Agregação',
|
|
4162
|
-
'praxis.charts.editor.field.metricAxis': 'Eixo',
|
|
4163
|
-
'praxis.charts.editor.field.metricSeriesKind': 'Tipo da série',
|
|
4164
|
-
'praxis.charts.editor.field.legendEnabled': 'Exibir legenda',
|
|
4165
|
-
'praxis.charts.editor.field.labelsEnabled': 'Exibir rótulos',
|
|
4166
|
-
'praxis.charts.editor.field.tooltipEnabled': 'Exibir dica de ferramenta (tooltip)',
|
|
4167
|
-
'praxis.charts.editor.field.themeVariant': 'Variante de tema',
|
|
4168
|
-
'praxis.charts.editor.field.paletteMode': 'Modo da paleta',
|
|
4169
|
-
'praxis.charts.editor.field.paletteToken': 'Token da paleta',
|
|
4170
|
-
'praxis.charts.editor.field.palette': 'Cores da paleta',
|
|
4171
|
-
'praxis.charts.editor.field.surfaceMode': 'Modo da superfície',
|
|
4172
|
-
'praxis.charts.editor.field.emptyTitle': 'Título do estado vazio',
|
|
4173
|
-
'praxis.charts.editor.field.emptyDescription': 'Descrição do estado vazio',
|
|
4174
|
-
'praxis.charts.editor.field.loadingTitle': 'Título de carregamento',
|
|
4175
|
-
'praxis.charts.editor.field.loadingDescription': 'Descrição de carregamento',
|
|
4176
|
-
'praxis.charts.editor.field.errorTitle': 'Título do erro',
|
|
4177
|
-
'praxis.charts.editor.field.errorDescription': 'Descrição do erro',
|
|
4178
|
-
'praxis.charts.editor.field.motionEnabled': 'Ativar animações',
|
|
4179
|
-
'praxis.charts.editor.field.motionPreset': 'Predefinição de movimento',
|
|
4180
|
-
'praxis.charts.editor.field.eventAction': 'Ação',
|
|
4181
|
-
'praxis.charts.editor.field.eventTarget': 'Destino',
|
|
4182
|
-
'praxis.charts.editor.field.eventMapping': 'Mapeamento',
|
|
4183
|
-
'praxis.charts.editor.preview.title': 'Visualização do gráfico',
|
|
4184
|
-
'praxis.charts.editor.preview.caption': 'Visualização local derivada do contrato canônico, sem chamadas remotas.',
|
|
4185
|
-
'praxis.charts.editor.preview.invalid': 'A visualização fica indisponível enquanto houver erro bloqueante no contrato.',
|
|
4186
|
-
'praxis.charts.editor.issues.title': 'Problemas de validação',
|
|
4187
|
-
'praxis.charts.editor.issues.empty': 'Nenhum problema identificado.',
|
|
4188
|
-
'praxis.charts.editor.appearance.featuresTitle': 'Recursos visuais',
|
|
4189
|
-
'praxis.charts.editor.appearance.paletteTitle': 'Paleta',
|
|
4190
|
-
'praxis.charts.editor.appearance.paletteHint': 'Use um token registrado ou cores separadas por vírgula para persistir `theme.palette` no contrato canônico.',
|
|
4191
|
-
'praxis.charts.editor.appearance.surfaceTitle': 'Superfície',
|
|
4192
|
-
'praxis.charts.editor.appearance.surfaceHint': 'Use embutido para widgets de dashboard e contido apenas quando o gráfico precisar ser dono da própria superfície visual.',
|
|
4193
|
-
'praxis.charts.editor.appearance.statesTitle': 'Mensagens de estado',
|
|
4194
|
-
'praxis.charts.editor.catalog.resourceMissing': 'O catálogo de recursos é obrigatório para authoring governado de praxis.stats.',
|
|
4195
|
-
'praxis.charts.editor.catalog.resourceStale': 'O recurso selecionado não está disponível no catálogo governado de recursos.',
|
|
4196
|
-
'praxis.charts.editor.catalog.operationMissing': 'O recurso selecionado não publica operações de stats authoráveis.',
|
|
4197
|
-
'praxis.charts.editor.catalog.operationStale': 'A operação selecionada não é suportada pelo catálogo governado do recurso.',
|
|
4198
|
-
'praxis.charts.editor.catalog.fieldCatalogMissing': 'O recurso selecionado não publica campos governados para a autoria do gráfico.',
|
|
4199
|
-
'praxis.charts.editor.catalog.dimensionFieldsMissing': 'Nenhuma dimensão governada está disponível para o recurso e a operação atuais.',
|
|
4200
|
-
'praxis.charts.editor.catalog.metricFieldsMissing': 'Nenhuma métrica governada está disponível para o recurso e a operação atuais.',
|
|
4201
|
-
'praxis.charts.editor.catalog.dimensionFieldStale': 'A dimensão selecionada não é elegível para o recurso e a operação atuais.',
|
|
4202
|
-
'praxis.charts.editor.catalog.metricFieldStale': 'A métrica selecionada não é elegível para o recurso e a operação atuais.',
|
|
4203
|
-
'praxis.charts.editor.catalog.metricAggregationStale': 'A agregação selecionada não é permitida para a métrica escolhida.',
|
|
4204
|
-
'praxis.charts.editor.catalog.comparisonPeriodFieldsMissing': 'Nenhum campo temporal governado está disponível para períodos de comparação.',
|
|
4205
|
-
'praxis.charts.editor.catalog.comparisonPeriodFieldStale': 'O campo de período selecionado não é elegível para série temporal na operação de comparação governada.',
|
|
4206
|
-
'praxis.charts.editor.catalog.targetMissing': 'O catálogo de destinos é obrigatório para esta ação de evento governada.',
|
|
4207
|
-
'praxis.charts.editor.catalog.targetStale': 'O destino selecionado não está disponível para esta ação de evento.',
|
|
4208
|
-
'praxis.charts.editor.catalog.capabilitiesDenied': 'O acesso às capabilities do recurso selecionado foi negado.',
|
|
4209
|
-
'praxis.charts.editor.catalog.capabilitiesUnavailable': 'As capabilities do recurso selecionado estão temporariamente indisponíveis.',
|
|
4210
|
-
'praxis.charts.editor.catalog.contextUnavailable': 'Não foi possível resolver o contexto governado de authoring do gráfico.',
|
|
4211
|
-
'praxis.charts.widget.contextDiagnostics.title': 'Contexto de authoring',
|
|
4212
|
-
'praxis.charts.widget.contextDiagnostics.catalogDenied': 'O acesso ao catálogo governado de recursos foi negado.',
|
|
4213
|
-
'praxis.charts.widget.contextDiagnostics.catalogUnavailable': 'O catálogo governado de recursos está temporariamente indisponível.',
|
|
4214
|
-
'praxis.charts.widget.contextDiagnostics.catalogEmpty': 'Nenhum recurso de stats authorável foi publicado pelo catálogo governado.',
|
|
4215
|
-
'praxis.charts.widget.contextDiagnostics.catalogPathInvalid': 'O catálogo de recursos publicou um path operacional inseguro ou não relativo.',
|
|
4216
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesDenied': 'O acesso às capabilities do recurso selecionado foi negado.',
|
|
4217
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesUnavailable': 'As capabilities do recurso selecionado estão temporariamente indisponíveis.',
|
|
4218
|
-
'praxis.charts.widget.contextDiagnostics.operationsEmpty': 'O recurso selecionado não publica operações de stats authoráveis.',
|
|
4219
|
-
'praxis.charts.widget.contextDiagnostics.fieldsEmpty': 'O recurso selecionado não publica campos governados para a autoria do gráfico.',
|
|
4220
|
-
'praxis.charts.widget.contextDiagnostics.identityMismatch': 'A identidade do recurso selecionado não corresponde ao snapshot governado de capabilities.',
|
|
4221
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesPathInvalid': 'O snapshot de capabilities selecionado não publicou um path de recurso governado e seguro.',
|
|
4222
|
-
'praxis.charts.widget.contextDiagnostics.capabilitiesPathMismatch': 'O path do snapshot de capabilities não corresponde ao path operacional publicado pelo catálogo.',
|
|
4223
|
-
'praxis.charts.widget.contextDiagnostics.partial': 'Algumas opções governadas de authoring não puderam ser materializadas a partir do contexto atual da página.',
|
|
4224
|
-
'praxis.charts.editor.hint.sizingMode': 'Use preencher container apenas quando o widget host fornecer altura definida para o corpo.',
|
|
4225
|
-
'praxis.charts.editor.hint.height': 'Números são salvos como pixels; medidas CSS como 20rem também são aceitas.',
|
|
4226
|
-
'praxis.charts.editor.hint.minHeight': 'Defina um mínimo legível para widgets compactos de dashboard.',
|
|
4227
|
-
'praxis.charts.editor.hint.maxHeight': 'Deixe vazio exceto quando o gráfico não puder crescer dentro de um layout flexível.',
|
|
4228
|
-
'praxis.charts.editor.hint.aspectRatio': 'Opcional. Use valores como 1.777 ou 16 / 9.',
|
|
4229
|
-
'praxis.charts.editor.analytics.dimensionsTitle': 'Dimensões',
|
|
4230
|
-
'praxis.charts.editor.analytics.metricsTitle': 'Métricas',
|
|
4231
|
-
'praxis.charts.editor.analytics.addDimension': 'Adicionar dimensão',
|
|
4232
|
-
'praxis.charts.editor.analytics.addMetric': 'Adicionar métrica',
|
|
4233
|
-
'praxis.charts.editor.analytics.removeDimension': 'Remover dimensão',
|
|
4234
|
-
'praxis.charts.editor.analytics.removeMetric': 'Remover métrica',
|
|
4235
|
-
'praxis.charts.editor.specialization.timeseriesTitle': 'Opções de séries temporais',
|
|
4236
|
-
'praxis.charts.editor.specialization.distributionTitle': 'Opções de distribuição',
|
|
4237
|
-
'praxis.charts.editor.specialization.comparisonTitle': 'Período de comparação',
|
|
4238
|
-
'praxis.charts.editor.specialization.comboTitle': 'Guia de combo',
|
|
4239
|
-
'praxis.charts.editor.specialization.comboHint': 'Gráficos combo exigem pelo menos duas métricas e permitem configurar eixo e tipo de série por métrica.',
|
|
4240
|
-
'praxis.charts.editor.specialization.pieDonutTitle': 'Guia de composição',
|
|
4241
|
-
'praxis.charts.editor.themeVariant.none': 'Sem variante',
|
|
4242
|
-
'praxis.charts.editor.themeVariant.default': 'Padrão',
|
|
4243
|
-
'praxis.charts.editor.themeVariant.compact': 'Compacta',
|
|
4244
|
-
'praxis.charts.editor.themeVariant.executive': 'Executiva',
|
|
4245
|
-
'praxis.charts.editor.paletteMode.token': 'Token registrado',
|
|
4246
|
-
'praxis.charts.editor.paletteMode.custom': 'Cores customizadas',
|
|
4247
|
-
'praxis.charts.editor.paletteToken.brand-primary': 'Marca principal',
|
|
4248
|
-
'praxis.charts.editor.paletteToken.brand-balanced': 'Marca balanceada',
|
|
4249
|
-
'praxis.charts.editor.paletteToken.status': 'Status',
|
|
4250
|
-
'praxis.charts.editor.paletteToken.executive': 'Executiva',
|
|
4251
|
-
'praxis.charts.editor.specialization.pieDonutHint': 'Gráficos de pizza, rosca, funil e pirâmide mantêm uma métrica e usam a primeira dimensão como segmento categórico.',
|
|
4252
|
-
'praxis.charts.editor.specialization.scatterTitle': 'Guia de dispersão (scatter)',
|
|
4253
|
-
'praxis.charts.editor.specialization.scatterHint': 'Gráficos de dispersão usam a primeira dimensão como eixo X e a primeira métrica como eixo Y.',
|
|
4254
|
-
'praxis.charts.editor.events.pointClickTitle': 'Clique no ponto',
|
|
4255
|
-
'praxis.charts.editor.events.selectionChangeTitle': 'Mudança de seleção',
|
|
4256
|
-
'praxis.charts.editor.events.drillDownTitle': 'Drill down',
|
|
4257
|
-
'praxis.charts.editor.events.crossFilterTitle': 'Filtro cruzado',
|
|
4258
|
-
'praxis.charts.editor.events.none': 'Nenhuma',
|
|
4259
|
-
'praxis.charts.editor.sourceKind.praxisStats': 'praxis.stats',
|
|
4260
|
-
'praxis.charts.editor.sourceKind.derived': 'derivado',
|
|
4261
|
-
'praxis.charts.editor.sizing.fixed': 'Altura fixa',
|
|
4262
|
-
'praxis.charts.editor.sizing.fill-container': 'Preencher widget',
|
|
4263
|
-
'praxis.charts.editor.sizing.auto': 'Automático',
|
|
4264
|
-
'praxis.charts.editor.surface.auto': 'Automático',
|
|
4265
|
-
'praxis.charts.editor.surface.embedded': 'Embutido no widget',
|
|
4266
|
-
'praxis.charts.editor.surface.contained': 'Superfície contida',
|
|
4267
|
-
'praxis.charts.editor.operation.groupBy': 'agrupar por',
|
|
4268
|
-
'praxis.charts.editor.operation.timeseries': 'série temporal',
|
|
4269
|
-
'praxis.charts.editor.operation.distribution': 'distribuição',
|
|
4270
|
-
'praxis.charts.editor.operation.comparison': 'comparação',
|
|
4271
|
-
'praxis.charts.editor.granularity.day': 'dia',
|
|
4272
|
-
'praxis.charts.editor.granularity.week': 'semana',
|
|
4273
|
-
'praxis.charts.editor.granularity.month': 'mês',
|
|
4274
|
-
'praxis.charts.editor.distributionMode.terms': 'termos',
|
|
4275
|
-
'praxis.charts.editor.distributionMode.histogram': 'histograma',
|
|
4276
|
-
'praxis.charts.editor.comparisonPreset.TODAY': 'Hoje',
|
|
4277
|
-
'praxis.charts.editor.comparisonPreset.YESTERDAY': 'Ontem',
|
|
4278
|
-
'praxis.charts.editor.comparisonPreset.LAST_7_DAYS': 'Últimos 7 dias',
|
|
4279
|
-
'praxis.charts.editor.comparisonPreset.LAST_30_DAYS': 'Últimos 30 dias',
|
|
4280
|
-
'praxis.charts.editor.comparisonPreset.THIS_MONTH': 'Este mês',
|
|
4281
|
-
'praxis.charts.editor.comparisonPreset.LAST_MONTH': 'Mês anterior',
|
|
4282
|
-
'praxis.charts.editor.comparisonPreset.THIS_QUARTER': 'Este trimestre',
|
|
4283
|
-
'praxis.charts.editor.comparisonPreset.THIS_YEAR': 'Este ano',
|
|
4284
|
-
'praxis.charts.editor.comparisonMode.PREVIOUS_ALIGNED': 'Período anterior alinhado',
|
|
4285
|
-
'praxis.charts.editor.comparisonMode.PREVIOUS_CALENDAR_PERIOD': 'Período anterior do calendário',
|
|
4286
|
-
'praxis.charts.editor.motionPreset.subtle': 'sutil',
|
|
4287
|
-
'praxis.charts.editor.motionPreset.standard': 'padrão',
|
|
4288
|
-
'praxis.charts.editor.motionPreset.expressive': 'expressivo',
|
|
4289
|
-
'praxis.charts.editor.dimensionRole.category': 'categoria',
|
|
4290
|
-
'praxis.charts.editor.dimensionRole.series': 'série',
|
|
4291
|
-
'praxis.charts.editor.dimensionRole.segment': 'segmento',
|
|
4292
|
-
'praxis.charts.editor.dimensionRole.time': 'tempo',
|
|
4293
|
-
'praxis.charts.editor.dimensionRole.value': 'valor',
|
|
4294
|
-
'praxis.charts.editor.metricAggregation.sum': 'soma',
|
|
4295
|
-
'praxis.charts.editor.metricAggregation.count': 'contagem',
|
|
4296
|
-
'praxis.charts.editor.metricAggregation.distinct-count': 'contagem distinta',
|
|
4297
|
-
'praxis.charts.editor.metricAggregation.avg': 'média',
|
|
4298
|
-
'praxis.charts.editor.metricAggregation.min': 'mínimo',
|
|
4299
|
-
'praxis.charts.editor.metricAggregation.max': 'máximo',
|
|
4300
|
-
'praxis.charts.editor.metricAxis.primary': 'primário',
|
|
4301
|
-
'praxis.charts.editor.metricAxis.secondary': 'secundário',
|
|
4302
|
-
'praxis.charts.editor.metricSeriesKind.bar': 'barra',
|
|
4303
|
-
'praxis.charts.editor.metricSeriesKind.line': 'linha',
|
|
4304
|
-
'praxis.charts.editor.metricSeriesKind.area': 'área',
|
|
4305
|
-
'praxis.charts.editor.eventAction.filter-widget': 'filtrar widget',
|
|
4306
|
-
'praxis.charts.editor.eventAction.open-detail': 'abrir detalhes',
|
|
4307
|
-
'praxis.charts.editor.eventAction.navigate': 'navegar',
|
|
4308
|
-
'praxis.charts.editor.eventAction.update-context': 'atualizar contexto',
|
|
4309
|
-
'praxis.charts.editor.eventAction.emit': 'emitir',
|
|
4310
|
-
'praxis.charts.editor.kind.bar': 'Barra',
|
|
4311
|
-
'praxis.charts.editor.kind.horizontal-bar': 'Barra Horizontal',
|
|
4312
|
-
'praxis.charts.editor.kind.line': 'Linha',
|
|
4313
|
-
'praxis.charts.editor.kind.area': 'Área',
|
|
4314
|
-
'praxis.charts.editor.kind.stacked-bar': 'Barra Empilhada',
|
|
4315
|
-
'praxis.charts.editor.kind.stacked-area': 'Área Empilhada',
|
|
4316
|
-
'praxis.charts.editor.kind.combo': 'Combinado (Combo)',
|
|
4317
|
-
'praxis.charts.editor.kind.pie': 'Pizza (Pie)',
|
|
4318
|
-
'praxis.charts.editor.kind.donut': 'Rosca (Donut)',
|
|
4319
|
-
'praxis.charts.editor.kind.scatter': 'Dispersão (Scatter)',
|
|
4320
|
-
'praxis.charts.editor.kind.funnel': 'Funil',
|
|
4321
|
-
'praxis.charts.editor.kind.pyramid': 'Pirâmide',
|
|
4322
|
-
'praxis.charts.analyticsPresentation.selectorLabel': 'Apresentação analítica',
|
|
4323
|
-
'praxis.charts.analyticsPresentation.chart': 'Gráfico',
|
|
4324
|
-
'praxis.charts.analyticsPresentation.table': 'Tabela',
|
|
4325
|
-
'praxis.charts.analyticsPresentation.unavailable': 'Apresentação indisponível',
|
|
4326
|
-
'praxis.charts.analyticsPresentation.loading': 'Carregando dados analíticos…',
|
|
4327
|
-
'praxis.charts.analyticsPresentation.empty': 'Nenhum dado disponível.',
|
|
4328
|
-
'praxis.charts.analyticsPresentation.projectionMissing': 'A projection analítica "{projectionId}" não foi encontrada.',
|
|
4329
|
-
'praxis.charts.analyticsPresentation.noRenderer': 'A projection analítica "{projectionId}" não possui renderer instalado elegível.',
|
|
4330
|
-
'praxis.charts.analyticsPresentation.familyIneligible': 'A família de apresentação "{family}" não é elegível para a projection "{projectionId}".',
|
|
4331
|
-
};
|
|
4332
|
-
|
|
4333
|
-
const PRAXIS_CHARTS_I18N = new InjectionToken('PRAXIS_CHARTS_I18N', {
|
|
4334
|
-
factory: () => ({}),
|
|
4335
|
-
});
|
|
4336
|
-
function createPraxisChartsI18nConfig(options = {}) {
|
|
4337
|
-
const localeDictionaries = {
|
|
4338
|
-
'pt-BR': {
|
|
4339
|
-
...PRAXIS_CHARTS_PT_BR,
|
|
4340
|
-
...(options.dictionaries?.['pt-BR'] ?? {}),
|
|
4341
|
-
},
|
|
4342
|
-
'en-US': {
|
|
4343
|
-
...PRAXIS_CHARTS_EN_US,
|
|
4344
|
-
...(options.dictionaries?.['en-US'] ?? {}),
|
|
4345
|
-
},
|
|
4346
|
-
};
|
|
4347
|
-
for (const [locale, dictionary] of Object.entries(options.dictionaries ?? {})) {
|
|
4348
|
-
if (locale === 'pt-BR' || locale === 'en-US') {
|
|
4349
|
-
continue;
|
|
4350
|
-
}
|
|
4351
|
-
localeDictionaries[locale] = {
|
|
4352
|
-
...(localeDictionaries[locale] ?? {}),
|
|
4353
|
-
...dictionary,
|
|
4354
|
-
};
|
|
4355
|
-
}
|
|
4356
|
-
return {
|
|
4357
|
-
locale: options.locale,
|
|
4358
|
-
fallbackLocale: options.fallbackLocale ?? 'pt-BR',
|
|
4359
|
-
namespaces: {
|
|
4360
|
-
charts: localeDictionaries,
|
|
4361
|
-
},
|
|
4362
|
-
};
|
|
4363
|
-
}
|
|
4364
|
-
function providePraxisChartsI18n(options = {}) {
|
|
4365
|
-
return [
|
|
4366
|
-
{
|
|
4367
|
-
provide: PRAXIS_CHARTS_I18N,
|
|
4368
|
-
useValue: {},
|
|
4369
|
-
},
|
|
4370
|
-
providePraxisI18n(createPraxisChartsI18nConfig(options)),
|
|
4371
|
-
];
|
|
4372
|
-
}
|
|
4373
|
-
function resolvePraxisChartsText(value, fallback) {
|
|
4374
|
-
if (typeof value === 'string') {
|
|
4375
|
-
return { text: value };
|
|
4376
|
-
}
|
|
4377
|
-
if (value?.key || value?.text) {
|
|
4378
|
-
return value;
|
|
4379
|
-
}
|
|
4380
|
-
return { text: fallback ?? '' };
|
|
4381
|
-
}
|
|
4382
|
-
|
|
4383
|
-
const INSTALLED_FAMILIES = ['chart', 'analytic-table'];
|
|
3897
|
+
const INSTALLED_FAMILIES = ['chart', 'analytic-table', 'kpi'];
|
|
4384
3898
|
class PraxisAnalyticsPresentationComponent {
|
|
4385
3899
|
analytics = input.required(...(ngDevMode ? [{ debugName: "analytics" }] : /* istanbul ignore next */ []));
|
|
4386
3900
|
projectionId = input.required(...(ngDevMode ? [{ debugName: "projectionId" }] : /* istanbul ignore next */ []));
|
|
@@ -4404,15 +3918,15 @@ class PraxisAnalyticsPresentationComponent {
|
|
|
4404
3918
|
tableAdapter = inject(AnalyticsTableConfigAdapterService);
|
|
4405
3919
|
tableStats = inject(AnalyticsTableStatsApiService);
|
|
4406
3920
|
temporaryFamily = signal(null, ...(ngDevMode ? [{ debugName: "temporaryFamily" }] : /* istanbul ignore next */ []));
|
|
4407
|
-
|
|
4408
|
-
|
|
4409
|
-
|
|
4410
|
-
|
|
3921
|
+
resultRows = signal([], ...(ngDevMode ? [{ debugName: "resultRows" }] : /* istanbul ignore next */ []));
|
|
3922
|
+
resultState = signal('idle', ...(ngDevMode ? [{ debugName: "resultState" }] : /* istanbul ignore next */ []));
|
|
3923
|
+
resultDiagnostic = signal(null, ...(ngDevMode ? [{ debugName: "resultDiagnostic" }] : /* istanbul ignore next */ []));
|
|
3924
|
+
resultRequestGeneration = 0;
|
|
4411
3925
|
previousProjectionId = null;
|
|
4412
3926
|
resolved = computed(() => this.resolvePresentation(), ...(ngDevMode ? [{ debugName: "resolved" }] : /* istanbul ignore next */ []));
|
|
4413
3927
|
activeFamily = computed(() => this.resolved().family, ...(ngDevMode ? [{ debugName: "activeFamily" }] : /* istanbul ignore next */ []));
|
|
4414
3928
|
eligibleFamilies = computed(() => this.resolved().eligibleFamilies, ...(ngDevMode ? [{ debugName: "eligibleFamilies" }] : /* istanbul ignore next */ []));
|
|
4415
|
-
diagnostic = computed(() => this.resolved().diagnostic ?? this.
|
|
3929
|
+
diagnostic = computed(() => this.resolved().diagnostic ?? this.resultDiagnostic(), ...(ngDevMode ? [{ debugName: "diagnostic" }] : /* istanbul ignore next */ []));
|
|
4416
3930
|
chartConfig = computed(() => {
|
|
4417
3931
|
const projection = this.resolved().projection;
|
|
4418
3932
|
return projection
|
|
@@ -4425,8 +3939,31 @@ class PraxisAnalyticsPresentationComponent {
|
|
|
4425
3939
|
? this.tableAdapter.toTableConfig(projection, { title: this.title(), subtitle: this.subtitle() })
|
|
4426
3940
|
: null;
|
|
4427
3941
|
}, ...(ngDevMode ? [{ debugName: "tableConfig" }] : /* istanbul ignore next */ []));
|
|
4428
|
-
|
|
4429
|
-
|
|
3942
|
+
isResultLoading = computed(() => this.resultState() === 'loading', ...(ngDevMode ? [{ debugName: "isResultLoading" }] : /* istanbul ignore next */ []));
|
|
3943
|
+
isResultEmpty = computed(() => this.resultState() === 'ready' && this.resultRows().length === 0, ...(ngDevMode ? [{ debugName: "isResultEmpty" }] : /* istanbul ignore next */ []));
|
|
3944
|
+
kpiTitle = computed(() => this.resolveText(this.title()), ...(ngDevMode ? [{ debugName: "kpiTitle" }] : /* istanbul ignore next */ []));
|
|
3945
|
+
kpiSubtitle = computed(() => this.resolveText(this.subtitle()), ...(ngDevMode ? [{ debugName: "kpiSubtitle" }] : /* istanbul ignore next */ []));
|
|
3946
|
+
kpiItems = computed(() => {
|
|
3947
|
+
const projection = this.resolved().projection;
|
|
3948
|
+
const dimension = projection?.bindings.primaryDimension;
|
|
3949
|
+
const metric = projection?.bindings.primaryMetrics[0];
|
|
3950
|
+
if (!projection || !dimension?.field || !metric?.field || !this.isKpiEligible(projection)) {
|
|
3951
|
+
return [];
|
|
3952
|
+
}
|
|
3953
|
+
return this.resultRows().map((row, index) => {
|
|
3954
|
+
const rawValue = row[metric.field];
|
|
3955
|
+
const value = typeof rawValue === 'number' && Number.isFinite(rawValue) ? rawValue : 0;
|
|
3956
|
+
const label = stringifyValue(row[dimension.field]) ?? this.t('praxis.charts.analyticsPresentation.kpiUnknownBucket', 'Unidentified category');
|
|
3957
|
+
return {
|
|
3958
|
+
trackId: `${stringifyValue(row[ANALYTICS_TABLE_ROW_KEY_FIELD]) ?? label}-${index}`,
|
|
3959
|
+
label,
|
|
3960
|
+
metricLabel: metric.label?.trim() || metric.field,
|
|
3961
|
+
value,
|
|
3962
|
+
formattedValue: this.i18n.formatNumber(value),
|
|
3963
|
+
row,
|
|
3964
|
+
};
|
|
3965
|
+
});
|
|
3966
|
+
}, ...(ngDevMode ? [{ debugName: "kpiItems" }] : /* istanbul ignore next */ []));
|
|
4430
3967
|
constructor() {
|
|
4431
3968
|
effect(() => {
|
|
4432
3969
|
const projectionId = this.projectionId();
|
|
@@ -4438,39 +3975,39 @@ class PraxisAnalyticsPresentationComponent {
|
|
|
4438
3975
|
effect((onCleanup) => {
|
|
4439
3976
|
const resolved = this.resolved();
|
|
4440
3977
|
const queryContext = this.queryContext();
|
|
4441
|
-
const generation = ++this.
|
|
3978
|
+
const generation = ++this.resultRequestGeneration;
|
|
4442
3979
|
onCleanup(() => {
|
|
4443
|
-
if (this.
|
|
4444
|
-
this.
|
|
3980
|
+
if (this.resultRequestGeneration === generation) {
|
|
3981
|
+
this.resultRequestGeneration += 1;
|
|
4445
3982
|
}
|
|
4446
3983
|
});
|
|
4447
|
-
this.
|
|
4448
|
-
this.
|
|
4449
|
-
this.
|
|
4450
|
-
if (resolved.family
|
|
3984
|
+
this.resultRows.set([]);
|
|
3985
|
+
this.resultDiagnostic.set(null);
|
|
3986
|
+
this.resultState.set('idle');
|
|
3987
|
+
if (!this.usesRemoteRows(resolved.family) || !resolved.projection) {
|
|
4451
3988
|
return;
|
|
4452
3989
|
}
|
|
4453
|
-
this.
|
|
3990
|
+
this.resultState.set('loading');
|
|
4454
3991
|
void this.tableStats.execute(resolved.projection, queryContext).then((rows) => {
|
|
4455
|
-
if (this.
|
|
3992
|
+
if (this.resultRequestGeneration !== generation)
|
|
4456
3993
|
return;
|
|
4457
|
-
this.
|
|
4458
|
-
this.
|
|
4459
|
-
}, (
|
|
4460
|
-
if (this.
|
|
3994
|
+
this.resultRows.set(rows);
|
|
3995
|
+
this.resultState.set('ready');
|
|
3996
|
+
}, () => {
|
|
3997
|
+
if (this.resultRequestGeneration !== generation)
|
|
4461
3998
|
return;
|
|
4462
|
-
this.
|
|
4463
|
-
this.
|
|
4464
|
-
this.
|
|
3999
|
+
this.resultRows.set([]);
|
|
4000
|
+
this.resultState.set('error');
|
|
4001
|
+
this.resultDiagnostic.set(this.t('praxis.charts.analyticsPresentation.loadError', 'Analytics data could not be loaded.'));
|
|
4465
4002
|
});
|
|
4466
4003
|
});
|
|
4467
4004
|
}
|
|
4468
4005
|
selectFamily(family) {
|
|
4469
4006
|
if (!this.eligibleFamilies().includes(family)) {
|
|
4470
|
-
this.
|
|
4007
|
+
this.resultDiagnostic.set(this.message('praxis.charts.analyticsPresentation.familyIneligible', 'Presentation family "{family}" is not eligible for projection "{projectionId}".', { family, projectionId: this.projectionId() }));
|
|
4471
4008
|
return;
|
|
4472
4009
|
}
|
|
4473
|
-
this.
|
|
4010
|
+
this.resultDiagnostic.set(null);
|
|
4474
4011
|
this.temporaryFamily.set(family);
|
|
4475
4012
|
this.presentationChange.emit({
|
|
4476
4013
|
projectionId: this.projectionId(),
|
|
@@ -4492,6 +4029,20 @@ class PraxisAnalyticsPresentationComponent {
|
|
|
4492
4029
|
data: row,
|
|
4493
4030
|
});
|
|
4494
4031
|
}
|
|
4032
|
+
handleKpiClick(row, label, value) {
|
|
4033
|
+
const projection = this.resolved().projection;
|
|
4034
|
+
if (!projection)
|
|
4035
|
+
return;
|
|
4036
|
+
this.pointClick.emit({
|
|
4037
|
+
chartId: projection.id,
|
|
4038
|
+
category: label,
|
|
4039
|
+
value,
|
|
4040
|
+
data: row,
|
|
4041
|
+
});
|
|
4042
|
+
}
|
|
4043
|
+
kpiItemAriaLabel(category, formattedValue, metric) {
|
|
4044
|
+
return this.message('praxis.charts.analyticsPresentation.kpiItemAriaLabel', '{category}: {value} {metric}', { category, value: formattedValue, metric });
|
|
4045
|
+
}
|
|
4495
4046
|
resolvePresentation() {
|
|
4496
4047
|
const projectionId = this.projectionId();
|
|
4497
4048
|
const projection = this.analytics().projections.find((candidate) => candidate.id === projectionId) ?? null;
|
|
@@ -4526,11 +4077,19 @@ class PraxisAnalyticsPresentationComponent {
|
|
|
4526
4077
|
const decision = this.resolver.resolve({ projections: [projection] }, { availableFamilies: eligibleFamilies, preferFamily: requestedFamily });
|
|
4527
4078
|
return { projection, family: decision.family, eligibleFamilies, diagnostic: null };
|
|
4528
4079
|
}
|
|
4529
|
-
catch
|
|
4530
|
-
return {
|
|
4080
|
+
catch {
|
|
4081
|
+
return {
|
|
4082
|
+
projection,
|
|
4083
|
+
family: null,
|
|
4084
|
+
eligibleFamilies,
|
|
4085
|
+
diagnostic: this.t('praxis.charts.analyticsPresentation.resolutionError', 'The analytics presentation could not be resolved.'),
|
|
4086
|
+
};
|
|
4531
4087
|
}
|
|
4532
4088
|
}
|
|
4533
4089
|
isEligible(projection, family) {
|
|
4090
|
+
if (family === 'kpi' && !this.isKpiEligible(projection)) {
|
|
4091
|
+
return false;
|
|
4092
|
+
}
|
|
4534
4093
|
try {
|
|
4535
4094
|
return this.resolver.resolve({ projections: [projection] }, { availableFamilies: [family], preferFamily: family }).family === family;
|
|
4536
4095
|
}
|
|
@@ -4538,22 +4097,35 @@ class PraxisAnalyticsPresentationComponent {
|
|
|
4538
4097
|
return false;
|
|
4539
4098
|
}
|
|
4540
4099
|
}
|
|
4100
|
+
isKpiEligible(projection) {
|
|
4101
|
+
return (projection.source.operation === 'group-by'
|
|
4102
|
+
&& !!projection.bindings.primaryDimension?.field
|
|
4103
|
+
&& projection.bindings.primaryMetrics.length === 1
|
|
4104
|
+
&& !!projection.bindings.primaryMetrics[0]?.field
|
|
4105
|
+
&& (projection.presentationHints?.preferredFamilies ?? []).includes('kpi'));
|
|
4106
|
+
}
|
|
4107
|
+
usesRemoteRows(family) {
|
|
4108
|
+
return family === 'analytic-table' || family === 'kpi';
|
|
4109
|
+
}
|
|
4110
|
+
resolveText(value) {
|
|
4111
|
+
if (!value)
|
|
4112
|
+
return null;
|
|
4113
|
+
const resolved = this.i18n.resolve(value).trim();
|
|
4114
|
+
return resolved || null;
|
|
4115
|
+
}
|
|
4541
4116
|
t(key, fallback) {
|
|
4542
|
-
return this.i18n.
|
|
4117
|
+
return this.i18n.t(key, undefined, fallback, 'charts');
|
|
4543
4118
|
}
|
|
4544
4119
|
message(key, fallback, values) {
|
|
4545
4120
|
return Object.entries(values).reduce((message, [name, value]) => message.replaceAll(`{${name}}`, value), this.t(key, fallback));
|
|
4546
4121
|
}
|
|
4547
4122
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAnalyticsPresentationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
4548
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAnalyticsPresentationComponent, isStandalone: true, selector: "praxis-analytics-presentation", inputs: { analytics: { classPropertyName: "analytics", publicName: "analytics", isSignal: true, isRequired: true, transformFunction: null }, projectionId: { classPropertyName: "projectionId", publicName: "projectionId", isSignal: true, isRequired: true, transformFunction: null }, availableFamilies: { classPropertyName: "availableFamilies", publicName: "availableFamilies", isSignal: true, isRequired: false, transformFunction: null }, preferredFamily: { classPropertyName: "preferredFamily", publicName: "preferredFamily", isSignal: true, isRequired: false, transformFunction: null }, queryContext: { classPropertyName: "queryContext", publicName: "queryContext", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, enableCustomization: { classPropertyName: "enableCustomization", publicName: "enableCustomization", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { presentationChange: "presentationChange", pointClick: "pointClick", pointAction: "pointAction", selectionChange: "selectionChange", drillDown: "drillDown", crossFilter: "crossFilter", queryRequest: "queryRequest", loadStateChange: "loadStateChange" }, ngImport: i0, template: "<section class=\"analytics-presentation\" [attr.aria-label]=\"projectionId()\">\n <div class=\"analytics-presentation__toolbar\" role=\"group\" [attr.aria-label]=\"t('praxis.charts.analyticsPresentation.selectorLabel', 'Analytics presentation')\">\n @if (eligibleFamilies().includes('chart')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'chart'\" (click)=\"selectFamily('chart')\">\n {{ t('praxis.charts.analyticsPresentation.chart', 'Chart') }}\n </button>\n }\n @if (eligibleFamilies().includes('analytic-table')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'analytic-table'\" (click)=\"selectFamily('analytic-table')\">\n {{ t('praxis.charts.analyticsPresentation.table', 'Table') }}\n </button>\n }\n </div>\n\n @if (diagnostic(); as message) {\n <section class=\"analytics-presentation__state analytics-presentation__state--error\" role=\"alert\">\n <strong>{{ t('praxis.charts.analyticsPresentation.unavailable', 'Presentation unavailable') }}</strong>\n <span>{{ message }}</span>\n </section>\n } @else if (activeFamily() === 'chart' && chartConfig(); as config) {\n <praxis-chart\n [config]=\"config\"\n [queryContext]=\"queryContext()\"\n [enableCustomization]=\"enableCustomization()\"\n (pointClick)=\"pointClick.emit($event)\"\n (pointAction)=\"pointAction.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (drillDown)=\"drillDown.emit($event)\"\n (crossFilter)=\"crossFilter.emit($event)\"\n (queryRequest)=\"queryRequest.emit($event)\"\n (loadStateChange)=\"loadStateChange.emit($event)\"\n />\n } @else if (activeFamily() === 'analytic-table' && tableConfig(); as config) {\n @if (isTableLoading()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.loading', 'Loading analytics\u2026') }}</section>\n } @else if (isTableEmpty()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.empty', 'No data available.') }}</section>\n } @else {\n <praxis-table\n [config]=\"config\"\n [data]=\"tableRows()\"\n [tableId]=\"projectionId() + '-analytic-table'\"\n (rowClick)=\"handleTableRowClick($event)\"\n />\n }\n }\n</section>\n", styles: [":host{display:block;min-width:0}.analytics-presentation{display:grid;gap:12px;min-width:0}.analytics-presentation__toolbar{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px}.analytics-presentation__toolbar button{min-height:40px;padding:0 14px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1a1c1e);font:inherit;cursor:pointer}.analytics-presentation__toolbar button[aria-pressed=true]{border-color:var(--md-sys-color-primary, #1263b4);background:var(--md-sys-color-primary-container, #d7e3ff);color:var(--md-sys-color-on-primary-container, #001b3e)}.analytics-presentation__toolbar button:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 45%,transparent);outline-offset:2px}.analytics-presentation__state{min-height:220px;display:grid;place-content:center;gap:6px;padding:24px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:16px;background:var(--md-sys-color-surface-container-low, #f7f8fa);color:var(--md-sys-color-on-surface, #1a1c1e);text-align:center}.analytics-presentation__state--error{border-color:var(--md-sys-color-error, #ba1a1a);color:var(--md-sys-color-error, #ba1a1a)}@media(max-width:600px){.analytics-presentation__toolbar{justify-content:stretch}.analytics-presentation__toolbar button{flex:1 1 0}}\n"], dependencies: [{ kind: "component", type: PraxisChartComponent, selector: "praxis-chart", inputs: ["config", "data", "chartDocument", "filterCriteria", "queryContext", "remoteDataResolver", "enableCustomization", "availableResources", "availableFields", "availableTargets"], outputs: ["pointClick", "pointAction", "selectionChange", "drillDown", "crossFilter", "queryRequest", "loadStateChange", "chartDocumentApplied", "chartDocumentSaved"] }, { kind: "component", type: PraxisTable, selector: "praxis-table", inputs: ["config", "resourcePath", "data", "tableId", "componentInstanceId", "configPersistenceStrategy", "title", "subtitle", "icon", "autoDelete", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "crudContext", "filterCriteria", "queryContext", "aiContext", "aiAssistantVoiceInputMode", "aiAssistantVoiceLanguage", "horizontalScroll", "enableCustomization", "authoringCapability", "dense"], outputs: ["rowClick", "widgetEvent", "resourceEvent", "rowDoubleClick", "rowExpansionChange", "rowAction", "toolbarAction", "bulkAction", "exportAction", "columnReorder", "columnReorderAttempt", "columnResize", "beforeDelete", "afterDelete", "deleteError", "beforeBulkDelete", "afterBulkDelete", "bulkDeleteError", "schemaStatusChange", "configChange", "metadataChange", "loadingStateChange", "collectionLinksChange", "selectionChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4123
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAnalyticsPresentationComponent, isStandalone: true, selector: "praxis-analytics-presentation", inputs: { analytics: { classPropertyName: "analytics", publicName: "analytics", isSignal: true, isRequired: true, transformFunction: null }, projectionId: { classPropertyName: "projectionId", publicName: "projectionId", isSignal: true, isRequired: true, transformFunction: null }, availableFamilies: { classPropertyName: "availableFamilies", publicName: "availableFamilies", isSignal: true, isRequired: false, transformFunction: null }, preferredFamily: { classPropertyName: "preferredFamily", publicName: "preferredFamily", isSignal: true, isRequired: false, transformFunction: null }, queryContext: { classPropertyName: "queryContext", publicName: "queryContext", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, enableCustomization: { classPropertyName: "enableCustomization", publicName: "enableCustomization", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { presentationChange: "presentationChange", pointClick: "pointClick", pointAction: "pointAction", selectionChange: "selectionChange", drillDown: "drillDown", crossFilter: "crossFilter", queryRequest: "queryRequest", loadStateChange: "loadStateChange" }, ngImport: i0, template: "<section class=\"analytics-presentation\" [attr.aria-label]=\"projectionId()\">\n <div class=\"analytics-presentation__toolbar\" role=\"group\" [attr.aria-label]=\"t('praxis.charts.analyticsPresentation.selectorLabel', 'Analytics presentation')\">\n @if (eligibleFamilies().includes('chart')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'chart'\" (click)=\"selectFamily('chart')\">\n {{ t('praxis.charts.analyticsPresentation.chart', 'Chart') }}\n </button>\n }\n @if (eligibleFamilies().includes('analytic-table')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'analytic-table'\" (click)=\"selectFamily('analytic-table')\">\n {{ t('praxis.charts.analyticsPresentation.table', 'Table') }}\n </button>\n }\n @if (eligibleFamilies().includes('kpi')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'kpi'\" (click)=\"selectFamily('kpi')\">\n {{ t('praxis.charts.analyticsPresentation.kpi', 'KPI') }}\n </button>\n }\n </div>\n\n @if (diagnostic(); as message) {\n <section class=\"analytics-presentation__state analytics-presentation__state--error\" role=\"alert\">\n <strong>{{ t('praxis.charts.analyticsPresentation.unavailable', 'Presentation unavailable') }}</strong>\n <span>{{ message }}</span>\n </section>\n } @else if (activeFamily() === 'chart' && chartConfig(); as config) {\n <praxis-chart\n [config]=\"config\"\n [queryContext]=\"queryContext()\"\n [enableCustomization]=\"enableCustomization()\"\n (pointClick)=\"pointClick.emit($event)\"\n (pointAction)=\"pointAction.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (drillDown)=\"drillDown.emit($event)\"\n (crossFilter)=\"crossFilter.emit($event)\"\n (queryRequest)=\"queryRequest.emit($event)\"\n (loadStateChange)=\"loadStateChange.emit($event)\"\n />\n } @else if (activeFamily() === 'analytic-table' && tableConfig(); as config) {\n @if (isResultLoading()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.loading', 'Loading analytics\u2026') }}</section>\n } @else if (isResultEmpty()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.empty', 'No data available.') }}</section>\n } @else {\n <praxis-table\n [config]=\"config\"\n [data]=\"resultRows()\"\n [tableId]=\"projectionId() + '-analytic-table'\"\n (rowClick)=\"handleTableRowClick($event)\"\n />\n }\n } @else if (activeFamily() === 'kpi') {\n @if (isResultLoading()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.loading', 'Loading analytics\u2026') }}</section>\n } @else if (isResultEmpty()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.empty', 'No data available.') }}</section>\n } @else {\n <section class=\"analytics-presentation__kpi\" [attr.aria-label]=\"kpiTitle() || t('praxis.charts.analyticsPresentation.kpiCollection', 'Key metrics')\">\n @if (kpiTitle(); as heading) {\n <header class=\"analytics-presentation__kpi-header\">\n <h3>{{ heading }}</h3>\n @if (kpiSubtitle(); as description) {\n <p>{{ description }}</p>\n }\n </header>\n }\n <div class=\"analytics-presentation__kpi-grid\" role=\"list\">\n @for (item of kpiItems(); track item.trackId) {\n <div role=\"listitem\">\n <button\n class=\"analytics-presentation__kpi-card\"\n type=\"button\"\n [attr.aria-label]=\"kpiItemAriaLabel(item.label, item.formattedValue, item.metricLabel)\"\n (click)=\"handleKpiClick(item.row, item.label, item.value)\"\n >\n <strong>{{ item.formattedValue }}</strong>\n <span>{{ item.label }}</span>\n <small>{{ item.metricLabel }}</small>\n </button>\n </div>\n }\n </div>\n </section>\n }\n }\n</section>\n", styles: [":host{display:block;min-width:0}.analytics-presentation{display:grid;gap:12px;min-width:0}.analytics-presentation__toolbar{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px}.analytics-presentation__toolbar button{min-height:40px;padding:0 14px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1a1c1e);font:inherit;cursor:pointer}.analytics-presentation__toolbar button[aria-pressed=true]{border-color:var(--md-sys-color-primary, #1263b4);background:var(--md-sys-color-primary-container, #d7e3ff);color:var(--md-sys-color-on-primary-container, #001b3e)}.analytics-presentation__toolbar button:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 45%,transparent);outline-offset:2px}.analytics-presentation__state{min-height:220px;display:grid;place-content:center;gap:6px;padding:24px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:16px;background:var(--md-sys-color-surface-container-low, #f7f8fa);color:var(--md-sys-color-on-surface, #1a1c1e);text-align:center}.analytics-presentation__state--error{border-color:var(--md-sys-color-error, #ba1a1a);color:var(--md-sys-color-error, #ba1a1a)}.analytics-presentation__kpi{display:grid;gap:16px;min-width:0}.analytics-presentation__kpi-header{display:grid;gap:4px}.analytics-presentation__kpi-header h3,.analytics-presentation__kpi-header p{margin:0}.analytics-presentation__kpi-header h3{color:var(--md-sys-color-on-surface, #1a1c1e);font-size:1rem;font-weight:650}.analytics-presentation__kpi-header p{color:var(--md-sys-color-on-surface-variant, #44474e);font-size:.875rem}.analytics-presentation__kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,176px),1fr));gap:12px;min-width:0}.analytics-presentation__kpi-card{display:grid;gap:6px;width:100%;height:100%;min-width:0;min-height:132px;align-content:center;padding:18px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:16px;background:var(--md-sys-color-surface-container-low, #f7f8fa);color:var(--md-sys-color-on-surface, #1a1c1e);font:inherit;text-align:left;cursor:pointer}.analytics-presentation__kpi-card:hover{border-color:var(--md-sys-color-primary, #1263b4);background:var(--md-sys-color-surface-container, #f0f1f3)}.analytics-presentation__kpi-card:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 45%,transparent);outline-offset:2px}.analytics-presentation__kpi-card strong{overflow-wrap:anywhere;color:var(--md-sys-color-primary, #1263b4);font-size:clamp(1.75rem,5vw,2.5rem);font-variant-numeric:tabular-nums;line-height:1}.analytics-presentation__kpi-card span,.analytics-presentation__kpi-card small{overflow-wrap:anywhere}.analytics-presentation__kpi-card span{font-weight:600}.analytics-presentation__kpi-card small{color:var(--md-sys-color-on-surface-variant, #44474e)}@media(max-width:600px){.analytics-presentation__toolbar{justify-content:stretch}.analytics-presentation__toolbar button{flex:1 1 0}}\n"], dependencies: [{ kind: "component", type: PraxisChartComponent, selector: "praxis-chart", inputs: ["config", "data", "chartDocument", "filterCriteria", "queryContext", "remoteDataResolver", "enableCustomization", "availableResources", "availableFields", "availableTargets"], outputs: ["pointClick", "pointAction", "selectionChange", "drillDown", "crossFilter", "queryRequest", "loadStateChange", "chartDocumentApplied", "chartDocumentSaved"] }, { kind: "component", type: PraxisTable, selector: "praxis-table", inputs: ["config", "resourcePath", "data", "tableId", "componentInstanceId", "configPersistenceStrategy", "title", "subtitle", "icon", "autoDelete", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "crudContext", "filterCriteria", "queryContext", "aiContext", "aiAssistantVoiceInputMode", "aiAssistantVoiceLanguage", "horizontalScroll", "enableCustomization", "authoringCapability", "dense"], outputs: ["rowClick", "widgetEvent", "resourceEvent", "rowDoubleClick", "rowExpansionChange", "rowAction", "toolbarAction", "bulkAction", "exportAction", "columnReorder", "columnReorderAttempt", "columnResize", "beforeDelete", "afterDelete", "deleteError", "beforeBulkDelete", "afterBulkDelete", "bulkDeleteError", "schemaStatusChange", "configChange", "metadataChange", "loadingStateChange", "collectionLinksChange", "selectionChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4549
4124
|
}
|
|
4550
4125
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAnalyticsPresentationComponent, decorators: [{
|
|
4551
4126
|
type: Component,
|
|
4552
|
-
args: [{ selector: 'praxis-analytics-presentation',
|
|
4127
|
+
args: [{ selector: 'praxis-analytics-presentation', imports: [PraxisChartComponent, PraxisTable], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"analytics-presentation\" [attr.aria-label]=\"projectionId()\">\n <div class=\"analytics-presentation__toolbar\" role=\"group\" [attr.aria-label]=\"t('praxis.charts.analyticsPresentation.selectorLabel', 'Analytics presentation')\">\n @if (eligibleFamilies().includes('chart')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'chart'\" (click)=\"selectFamily('chart')\">\n {{ t('praxis.charts.analyticsPresentation.chart', 'Chart') }}\n </button>\n }\n @if (eligibleFamilies().includes('analytic-table')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'analytic-table'\" (click)=\"selectFamily('analytic-table')\">\n {{ t('praxis.charts.analyticsPresentation.table', 'Table') }}\n </button>\n }\n @if (eligibleFamilies().includes('kpi')) {\n <button type=\"button\" [attr.aria-pressed]=\"activeFamily() === 'kpi'\" (click)=\"selectFamily('kpi')\">\n {{ t('praxis.charts.analyticsPresentation.kpi', 'KPI') }}\n </button>\n }\n </div>\n\n @if (diagnostic(); as message) {\n <section class=\"analytics-presentation__state analytics-presentation__state--error\" role=\"alert\">\n <strong>{{ t('praxis.charts.analyticsPresentation.unavailable', 'Presentation unavailable') }}</strong>\n <span>{{ message }}</span>\n </section>\n } @else if (activeFamily() === 'chart' && chartConfig(); as config) {\n <praxis-chart\n [config]=\"config\"\n [queryContext]=\"queryContext()\"\n [enableCustomization]=\"enableCustomization()\"\n (pointClick)=\"pointClick.emit($event)\"\n (pointAction)=\"pointAction.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (drillDown)=\"drillDown.emit($event)\"\n (crossFilter)=\"crossFilter.emit($event)\"\n (queryRequest)=\"queryRequest.emit($event)\"\n (loadStateChange)=\"loadStateChange.emit($event)\"\n />\n } @else if (activeFamily() === 'analytic-table' && tableConfig(); as config) {\n @if (isResultLoading()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.loading', 'Loading analytics\u2026') }}</section>\n } @else if (isResultEmpty()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.empty', 'No data available.') }}</section>\n } @else {\n <praxis-table\n [config]=\"config\"\n [data]=\"resultRows()\"\n [tableId]=\"projectionId() + '-analytic-table'\"\n (rowClick)=\"handleTableRowClick($event)\"\n />\n }\n } @else if (activeFamily() === 'kpi') {\n @if (isResultLoading()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.loading', 'Loading analytics\u2026') }}</section>\n } @else if (isResultEmpty()) {\n <section class=\"analytics-presentation__state\" role=\"status\">{{ t('praxis.charts.analyticsPresentation.empty', 'No data available.') }}</section>\n } @else {\n <section class=\"analytics-presentation__kpi\" [attr.aria-label]=\"kpiTitle() || t('praxis.charts.analyticsPresentation.kpiCollection', 'Key metrics')\">\n @if (kpiTitle(); as heading) {\n <header class=\"analytics-presentation__kpi-header\">\n <h3>{{ heading }}</h3>\n @if (kpiSubtitle(); as description) {\n <p>{{ description }}</p>\n }\n </header>\n }\n <div class=\"analytics-presentation__kpi-grid\" role=\"list\">\n @for (item of kpiItems(); track item.trackId) {\n <div role=\"listitem\">\n <button\n class=\"analytics-presentation__kpi-card\"\n type=\"button\"\n [attr.aria-label]=\"kpiItemAriaLabel(item.label, item.formattedValue, item.metricLabel)\"\n (click)=\"handleKpiClick(item.row, item.label, item.value)\"\n >\n <strong>{{ item.formattedValue }}</strong>\n <span>{{ item.label }}</span>\n <small>{{ item.metricLabel }}</small>\n </button>\n </div>\n }\n </div>\n </section>\n }\n }\n</section>\n", styles: [":host{display:block;min-width:0}.analytics-presentation{display:grid;gap:12px;min-width:0}.analytics-presentation__toolbar{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px}.analytics-presentation__toolbar button{min-height:40px;padding:0 14px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1a1c1e);font:inherit;cursor:pointer}.analytics-presentation__toolbar button[aria-pressed=true]{border-color:var(--md-sys-color-primary, #1263b4);background:var(--md-sys-color-primary-container, #d7e3ff);color:var(--md-sys-color-on-primary-container, #001b3e)}.analytics-presentation__toolbar button:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 45%,transparent);outline-offset:2px}.analytics-presentation__state{min-height:220px;display:grid;place-content:center;gap:6px;padding:24px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:16px;background:var(--md-sys-color-surface-container-low, #f7f8fa);color:var(--md-sys-color-on-surface, #1a1c1e);text-align:center}.analytics-presentation__state--error{border-color:var(--md-sys-color-error, #ba1a1a);color:var(--md-sys-color-error, #ba1a1a)}.analytics-presentation__kpi{display:grid;gap:16px;min-width:0}.analytics-presentation__kpi-header{display:grid;gap:4px}.analytics-presentation__kpi-header h3,.analytics-presentation__kpi-header p{margin:0}.analytics-presentation__kpi-header h3{color:var(--md-sys-color-on-surface, #1a1c1e);font-size:1rem;font-weight:650}.analytics-presentation__kpi-header p{color:var(--md-sys-color-on-surface-variant, #44474e);font-size:.875rem}.analytics-presentation__kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,176px),1fr));gap:12px;min-width:0}.analytics-presentation__kpi-card{display:grid;gap:6px;width:100%;height:100%;min-width:0;min-height:132px;align-content:center;padding:18px;border:1px solid var(--md-sys-color-outline-variant, #c4c7c5);border-radius:16px;background:var(--md-sys-color-surface-container-low, #f7f8fa);color:var(--md-sys-color-on-surface, #1a1c1e);font:inherit;text-align:left;cursor:pointer}.analytics-presentation__kpi-card:hover{border-color:var(--md-sys-color-primary, #1263b4);background:var(--md-sys-color-surface-container, #f0f1f3)}.analytics-presentation__kpi-card:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 45%,transparent);outline-offset:2px}.analytics-presentation__kpi-card strong{overflow-wrap:anywhere;color:var(--md-sys-color-primary, #1263b4);font-size:clamp(1.75rem,5vw,2.5rem);font-variant-numeric:tabular-nums;line-height:1}.analytics-presentation__kpi-card span,.analytics-presentation__kpi-card small{overflow-wrap:anywhere}.analytics-presentation__kpi-card span{font-weight:600}.analytics-presentation__kpi-card small{color:var(--md-sys-color-on-surface-variant, #44474e)}@media(max-width:600px){.analytics-presentation__toolbar{justify-content:stretch}.analytics-presentation__toolbar button{flex:1 1 0}}\n"] }]
|
|
4553
4128
|
}], ctorParameters: () => [], propDecorators: { analytics: [{ type: i0.Input, args: [{ isSignal: true, alias: "analytics", required: true }] }], projectionId: [{ type: i0.Input, args: [{ isSignal: true, alias: "projectionId", required: true }] }], availableFamilies: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableFamilies", required: false }] }], preferredFamily: [{ type: i0.Input, args: [{ isSignal: true, alias: "preferredFamily", required: false }] }], queryContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryContext", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], enableCustomization: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableCustomization", required: false }] }], presentationChange: [{ type: i0.Output, args: ["presentationChange"] }], pointClick: [{ type: i0.Output, args: ["pointClick"] }], pointAction: [{ type: i0.Output, args: ["pointAction"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], drillDown: [{ type: i0.Output, args: ["drillDown"] }], crossFilter: [{ type: i0.Output, args: ["crossFilter"] }], queryRequest: [{ type: i0.Output, args: ["queryRequest"] }], loadStateChange: [{ type: i0.Output, args: ["loadStateChange"] }] } });
|
|
4554
|
-
function normalizeError$1(error) {
|
|
4555
|
-
return error instanceof Error && error.message.trim() ? error.message.trim() : 'Analytics presentation failed.';
|
|
4556
|
-
}
|
|
4557
4129
|
function stringifyValue(value) {
|
|
4558
4130
|
return value === null || value === undefined ? undefined : String(value);
|
|
4559
4131
|
}
|
|
@@ -5165,273 +4737,771 @@ class EChartsOptionBuilderService {
|
|
|
5165
4737
|
if (value === 'code' || value === 'name' || value === 'narrowSymbol') {
|
|
5166
4738
|
return value;
|
|
5167
4739
|
}
|
|
5168
|
-
return 'symbol';
|
|
4740
|
+
return 'symbol';
|
|
4741
|
+
}
|
|
4742
|
+
parseNumberFormat(format) {
|
|
4743
|
+
const [pattern, ...modifiers] = format.split('|').map((part) => part.trim());
|
|
4744
|
+
const match = /^(\d+)\.(\d+)-(\d+)$/.exec(pattern);
|
|
4745
|
+
if (!match) {
|
|
4746
|
+
return null;
|
|
4747
|
+
}
|
|
4748
|
+
return {
|
|
4749
|
+
minimumFractionDigits: this.clampDecimals(Number.parseInt(match[2], 10), 0),
|
|
4750
|
+
maximumFractionDigits: this.clampDecimals(Number.parseInt(match[3], 10), 0),
|
|
4751
|
+
useGrouping: !modifiers.some((part) => part.toLowerCase() === 'nosep'),
|
|
4752
|
+
};
|
|
4753
|
+
}
|
|
4754
|
+
clampDecimals(value, fallback) {
|
|
4755
|
+
if (!Number.isFinite(value)) {
|
|
4756
|
+
return fallback;
|
|
4757
|
+
}
|
|
4758
|
+
return Math.min(Math.max(value, 0), 20);
|
|
4759
|
+
}
|
|
4760
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EChartsOptionBuilderService, deps: [{ token: PraxisChartDataTransformerService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
4761
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EChartsOptionBuilderService, providedIn: 'root' });
|
|
4762
|
+
}
|
|
4763
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EChartsOptionBuilderService, decorators: [{
|
|
4764
|
+
type: Injectable,
|
|
4765
|
+
args: [{ providedIn: 'root' }]
|
|
4766
|
+
}], ctorParameters: () => [{ type: PraxisChartDataTransformerService }] });
|
|
4767
|
+
function truncateLegendText(name) {
|
|
4768
|
+
const value = String(name ?? '').trim();
|
|
4769
|
+
if (value.length <= 28) {
|
|
4770
|
+
return value;
|
|
4771
|
+
}
|
|
4772
|
+
return `${value.slice(0, 25)}...`;
|
|
4773
|
+
}
|
|
4774
|
+
function escapeTooltipHtml(value) {
|
|
4775
|
+
return String(value ?? '')
|
|
4776
|
+
.replace(/&/g, '&')
|
|
4777
|
+
.replace(/</g, '<')
|
|
4778
|
+
.replace(/>/g, '>')
|
|
4779
|
+
.replace(/"/g, '"')
|
|
4780
|
+
.replace(/'/g, ''');
|
|
4781
|
+
}
|
|
4782
|
+
|
|
4783
|
+
use([
|
|
4784
|
+
AriaComponent,
|
|
4785
|
+
BarChart,
|
|
4786
|
+
CanvasRenderer,
|
|
4787
|
+
DatasetComponent,
|
|
4788
|
+
FunnelChart,
|
|
4789
|
+
GridComponent,
|
|
4790
|
+
LegendComponent,
|
|
4791
|
+
LineChart,
|
|
4792
|
+
PieChart,
|
|
4793
|
+
ScatterChart,
|
|
4794
|
+
TitleComponent,
|
|
4795
|
+
TooltipComponent,
|
|
4796
|
+
TransformComponent,
|
|
4797
|
+
]);
|
|
4798
|
+
class EChartsEngineAdapter {
|
|
4799
|
+
optionBuilder;
|
|
4800
|
+
chart;
|
|
4801
|
+
currentHost;
|
|
4802
|
+
clickHost;
|
|
4803
|
+
domClickHandler;
|
|
4804
|
+
zrenderClickHandler;
|
|
4805
|
+
lastSeriesClickAt = 0;
|
|
4806
|
+
lastGridClick;
|
|
4807
|
+
constructor(optionBuilder) {
|
|
4808
|
+
this.optionBuilder = optionBuilder;
|
|
4809
|
+
}
|
|
4810
|
+
render(host, payload) {
|
|
4811
|
+
if (this.chart && this.currentHost !== host) {
|
|
4812
|
+
this.disposeChart();
|
|
4813
|
+
}
|
|
4814
|
+
if (!this.chart) {
|
|
4815
|
+
this.chart = this.createChart(host);
|
|
4816
|
+
this.currentHost = host;
|
|
4817
|
+
}
|
|
4818
|
+
const option = this.optionBuilder.build(payload.config, payload.data);
|
|
4819
|
+
const chart = this.chart;
|
|
4820
|
+
chart.setOption(option, true);
|
|
4821
|
+
this.detachHandlers();
|
|
4822
|
+
chart.off('click');
|
|
4823
|
+
chart.on('click', (params) => {
|
|
4824
|
+
this.lastSeriesClickAt = Date.now();
|
|
4825
|
+
this.lastGridClick = undefined;
|
|
4826
|
+
const data = pointData(params?.name, params?.data ?? params?.value);
|
|
4827
|
+
payload.onPointClick?.({
|
|
4828
|
+
chartId: payload.config.id,
|
|
4829
|
+
seriesId: params?.seriesId,
|
|
4830
|
+
seriesName: params?.seriesName,
|
|
4831
|
+
category: this.resolvePointCategory(payload, data, params?.name),
|
|
4832
|
+
value: pointValue(params?.value ?? params?.data),
|
|
4833
|
+
data,
|
|
4834
|
+
});
|
|
4835
|
+
});
|
|
4836
|
+
const zrender = chart?.getZr?.();
|
|
4837
|
+
this.zrenderClickHandler = (event) => {
|
|
4838
|
+
window.setTimeout(() => {
|
|
4839
|
+
if (Date.now() - this.lastSeriesClickAt < 80) {
|
|
4840
|
+
return;
|
|
4841
|
+
}
|
|
4842
|
+
this.emitCategoryClickFromGrid(event, payload);
|
|
4843
|
+
}, 0);
|
|
4844
|
+
};
|
|
4845
|
+
zrender?.on?.('click', this.zrenderClickHandler);
|
|
4846
|
+
this.domClickHandler = (event) => {
|
|
4847
|
+
window.setTimeout(() => {
|
|
4848
|
+
if (Date.now() - this.lastSeriesClickAt < 80) {
|
|
4849
|
+
return;
|
|
4850
|
+
}
|
|
4851
|
+
const rect = host.getBoundingClientRect();
|
|
4852
|
+
const offsetX = Number.isFinite(event.offsetX) ? event.offsetX : event.clientX - rect.left;
|
|
4853
|
+
const offsetY = Number.isFinite(event.offsetY) ? event.offsetY : event.clientY - rect.top;
|
|
4854
|
+
this.emitCategoryClickFromGrid({
|
|
4855
|
+
offsetX,
|
|
4856
|
+
offsetY,
|
|
4857
|
+
}, payload);
|
|
4858
|
+
}, 0);
|
|
4859
|
+
};
|
|
4860
|
+
host.addEventListener('click', this.domClickHandler, true);
|
|
4861
|
+
this.clickHost = host;
|
|
4862
|
+
}
|
|
4863
|
+
resize() {
|
|
4864
|
+
this.chart?.resize();
|
|
4865
|
+
}
|
|
4866
|
+
destroy() {
|
|
4867
|
+
this.disposeChart();
|
|
4868
|
+
}
|
|
4869
|
+
createChart(host) {
|
|
4870
|
+
return init(host);
|
|
4871
|
+
}
|
|
4872
|
+
disposeChart() {
|
|
4873
|
+
this.detachHandlers();
|
|
4874
|
+
this.chart?.off('click');
|
|
4875
|
+
this.chart?.dispose();
|
|
4876
|
+
this.chart = undefined;
|
|
4877
|
+
this.currentHost = undefined;
|
|
4878
|
+
this.lastSeriesClickAt = 0;
|
|
4879
|
+
this.lastGridClick = undefined;
|
|
4880
|
+
}
|
|
4881
|
+
detachHandlers() {
|
|
4882
|
+
const zrender = this.chart?.getZr?.();
|
|
4883
|
+
if (zrender && this.zrenderClickHandler) {
|
|
4884
|
+
zrender.off?.('click', this.zrenderClickHandler);
|
|
4885
|
+
}
|
|
4886
|
+
if (this.clickHost && this.domClickHandler) {
|
|
4887
|
+
this.clickHost.removeEventListener('click', this.domClickHandler, true);
|
|
4888
|
+
}
|
|
4889
|
+
this.clickHost = undefined;
|
|
4890
|
+
this.domClickHandler = undefined;
|
|
4891
|
+
this.zrenderClickHandler = undefined;
|
|
4892
|
+
}
|
|
4893
|
+
resolvePointCategory(payload, data, fallback) {
|
|
4894
|
+
const categoryField = payload.config.axes?.x?.field
|
|
4895
|
+
?? payload.config.series.find((series) => series.categoryField)?.categoryField;
|
|
4896
|
+
const dataSource = payload.config.dataSource;
|
|
4897
|
+
const usesCanonicalStatsTime = dataSource?.kind === 'remote'
|
|
4898
|
+
&& dataSource.query?.sourceKind === 'praxis.stats';
|
|
4899
|
+
const usesCanonicalStatsTimePoint = usesCanonicalStatsTime
|
|
4900
|
+
&& (payload.config.axes?.x?.type === 'time'
|
|
4901
|
+
|| (dataSource?.kind === 'remote' && dataSource.query?.statsOperation === 'timeseries'));
|
|
4902
|
+
const candidate = usesCanonicalStatsTimePoint && data['label'] !== null
|
|
4903
|
+
&& data['label'] !== undefined
|
|
4904
|
+
&& data['label'] !== ''
|
|
4905
|
+
? data['label']
|
|
4906
|
+
: categoryField && data[categoryField] !== null && data[categoryField] !== undefined
|
|
4907
|
+
? data[categoryField]
|
|
4908
|
+
: fallback;
|
|
4909
|
+
return candidate === null || candidate === undefined
|
|
4910
|
+
? undefined
|
|
4911
|
+
: String(candidate);
|
|
4912
|
+
}
|
|
4913
|
+
emitCategoryClickFromGrid(event, payload) {
|
|
4914
|
+
const chart = this.chart;
|
|
4915
|
+
if (!chart || typeof chart.containPixel !== 'function' || typeof chart.convertFromPixel !== 'function') {
|
|
4916
|
+
return;
|
|
4917
|
+
}
|
|
4918
|
+
const point = [event?.offsetX, event?.offsetY];
|
|
4919
|
+
if (!Number.isFinite(point[0]) || !Number.isFinite(point[1])) {
|
|
4920
|
+
return;
|
|
4921
|
+
}
|
|
4922
|
+
if (!chart.containPixel({ gridIndex: 0 }, point)) {
|
|
4923
|
+
return;
|
|
4924
|
+
}
|
|
4925
|
+
const option = chart.getOption?.();
|
|
4926
|
+
const xAxis = firstOptionEntry(option?.xAxis);
|
|
4927
|
+
const yAxis = firstOptionEntry(option?.yAxis);
|
|
4928
|
+
const horizontal = yAxis?.type === 'category';
|
|
4929
|
+
const categories = (horizontal ? yAxis?.data : xAxis?.data) ?? [];
|
|
4930
|
+
if (!Array.isArray(categories) || categories.length === 0) {
|
|
4931
|
+
return;
|
|
4932
|
+
}
|
|
4933
|
+
const converted = chart.convertFromPixel({ gridIndex: 0 }, point);
|
|
4934
|
+
const categoryIndex = Math.round(Number(horizontal ? converted?.[1] : converted?.[0]));
|
|
4935
|
+
if (!Number.isInteger(categoryIndex) || categoryIndex < 0 || categoryIndex >= categories.length) {
|
|
4936
|
+
return;
|
|
4937
|
+
}
|
|
4938
|
+
const category = categories[categoryIndex];
|
|
4939
|
+
const categoryValue = category == null ? undefined : String(category);
|
|
4940
|
+
const categoryField = payload.config.axes?.x?.field
|
|
4941
|
+
?? payload.config.series.find((series) => series.categoryField)?.categoryField;
|
|
4942
|
+
const signature = JSON.stringify({
|
|
4943
|
+
chartId: payload.config.id,
|
|
4944
|
+
category: categoryValue,
|
|
4945
|
+
horizontal,
|
|
4946
|
+
categoryIndex,
|
|
4947
|
+
});
|
|
4948
|
+
if (this.isDuplicateGridClick(signature)) {
|
|
4949
|
+
return;
|
|
4950
|
+
}
|
|
4951
|
+
const usesCanonicalStatsRows = payload.config.dataSource?.kind === 'remote'
|
|
4952
|
+
&& payload.config.dataSource.query?.sourceKind === 'praxis.stats';
|
|
4953
|
+
const fallbackSourceRow = !usesCanonicalStatsRows
|
|
4954
|
+
&& categoryField
|
|
4955
|
+
&& categoryValue !== undefined
|
|
4956
|
+
? payload.data.find((row) => String(row[categoryField] ?? '') === categoryValue)
|
|
4957
|
+
: undefined;
|
|
4958
|
+
const sourceRow = usesCanonicalStatsRows
|
|
4959
|
+
? payload.data[categoryIndex]
|
|
4960
|
+
: fallbackSourceRow;
|
|
4961
|
+
const data = {
|
|
4962
|
+
...(sourceRow ?? {}),
|
|
4963
|
+
category: categoryValue,
|
|
4964
|
+
};
|
|
4965
|
+
if (categoryField && categoryValue !== undefined) {
|
|
4966
|
+
data[categoryField] = categoryValue;
|
|
4967
|
+
}
|
|
4968
|
+
payload.onPointClick?.({
|
|
4969
|
+
chartId: payload.config.id,
|
|
4970
|
+
category: categoryValue,
|
|
4971
|
+
data,
|
|
4972
|
+
});
|
|
5169
4973
|
}
|
|
5170
|
-
|
|
5171
|
-
const
|
|
5172
|
-
const
|
|
5173
|
-
|
|
5174
|
-
|
|
5175
|
-
|
|
5176
|
-
return {
|
|
5177
|
-
minimumFractionDigits: this.clampDecimals(Number.parseInt(match[2], 10), 0),
|
|
5178
|
-
maximumFractionDigits: this.clampDecimals(Number.parseInt(match[3], 10), 0),
|
|
5179
|
-
useGrouping: !modifiers.some((part) => part.toLowerCase() === 'nosep'),
|
|
5180
|
-
};
|
|
4974
|
+
isDuplicateGridClick(signature) {
|
|
4975
|
+
const now = Date.now();
|
|
4976
|
+
const duplicate = this.lastGridClick?.signature === signature
|
|
4977
|
+
&& now - this.lastGridClick.at < 80;
|
|
4978
|
+
this.lastGridClick = { signature, at: now };
|
|
4979
|
+
return duplicate;
|
|
5181
4980
|
}
|
|
5182
|
-
|
|
5183
|
-
|
|
5184
|
-
|
|
5185
|
-
|
|
5186
|
-
|
|
4981
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EChartsEngineAdapter, deps: [{ token: EChartsOptionBuilderService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
4982
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EChartsEngineAdapter });
|
|
4983
|
+
}
|
|
4984
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EChartsEngineAdapter, decorators: [{
|
|
4985
|
+
type: Injectable
|
|
4986
|
+
}], ctorParameters: () => [{ type: EChartsOptionBuilderService }] });
|
|
4987
|
+
function firstOptionEntry(value) {
|
|
4988
|
+
return Array.isArray(value) ? value[0] : value;
|
|
4989
|
+
}
|
|
4990
|
+
function pointValue(value) {
|
|
4991
|
+
if (Array.isArray(value)) {
|
|
4992
|
+
return value.length > 1 ? value[1] : value[0];
|
|
5187
4993
|
}
|
|
5188
|
-
|
|
5189
|
-
|
|
4994
|
+
if (value && typeof value === 'object' && 'value' in value) {
|
|
4995
|
+
return pointValue(value.value);
|
|
4996
|
+
}
|
|
4997
|
+
return value;
|
|
5190
4998
|
}
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
args: [{ providedIn: 'root' }]
|
|
5194
|
-
}], ctorParameters: () => [{ type: PraxisChartDataTransformerService }] });
|
|
5195
|
-
function truncateLegendText(name) {
|
|
5196
|
-
const value = String(name ?? '').trim();
|
|
5197
|
-
if (value.length <= 28) {
|
|
4999
|
+
function pointData(category, value) {
|
|
5000
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
5198
5001
|
return value;
|
|
5199
5002
|
}
|
|
5200
|
-
return
|
|
5201
|
-
|
|
5202
|
-
|
|
5203
|
-
|
|
5204
|
-
.replace(/&/g, '&')
|
|
5205
|
-
.replace(/</g, '<')
|
|
5206
|
-
.replace(/>/g, '>')
|
|
5207
|
-
.replace(/"/g, '"')
|
|
5208
|
-
.replace(/'/g, ''');
|
|
5003
|
+
return {
|
|
5004
|
+
category,
|
|
5005
|
+
value: pointValue(value),
|
|
5006
|
+
};
|
|
5209
5007
|
}
|
|
5210
5008
|
|
|
5211
|
-
|
|
5212
|
-
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5219
|
-
|
|
5220
|
-
|
|
5221
|
-
|
|
5222
|
-
|
|
5223
|
-
|
|
5224
|
-
|
|
5225
|
-
|
|
5226
|
-
|
|
5227
|
-
|
|
5228
|
-
|
|
5229
|
-
|
|
5230
|
-
|
|
5231
|
-
|
|
5232
|
-
|
|
5233
|
-
|
|
5234
|
-
|
|
5235
|
-
|
|
5236
|
-
|
|
5237
|
-
|
|
5238
|
-
|
|
5239
|
-
|
|
5240
|
-
|
|
5241
|
-
|
|
5242
|
-
|
|
5243
|
-
|
|
5244
|
-
|
|
5245
|
-
|
|
5246
|
-
|
|
5247
|
-
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
|
|
5251
|
-
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5257
|
-
|
|
5258
|
-
|
|
5259
|
-
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
|
|
5282
|
-
|
|
5283
|
-
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
|
|
5295
|
-
|
|
5296
|
-
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5301
|
-
|
|
5302
|
-
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
5318
|
-
|
|
5319
|
-
|
|
5320
|
-
|
|
5321
|
-
|
|
5322
|
-
|
|
5323
|
-
|
|
5324
|
-
|
|
5325
|
-
|
|
5326
|
-
|
|
5327
|
-
|
|
5328
|
-
|
|
5329
|
-
|
|
5330
|
-
|
|
5331
|
-
|
|
5332
|
-
|
|
5333
|
-
|
|
5334
|
-
|
|
5335
|
-
|
|
5336
|
-
|
|
5337
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
|
|
5351
|
-
|
|
5352
|
-
|
|
5353
|
-
|
|
5354
|
-
|
|
5355
|
-
|
|
5356
|
-
|
|
5357
|
-
|
|
5358
|
-
|
|
5359
|
-
|
|
5360
|
-
|
|
5361
|
-
|
|
5362
|
-
|
|
5363
|
-
|
|
5364
|
-
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
5375
|
-
|
|
5376
|
-
|
|
5377
|
-
|
|
5009
|
+
const PRAXIS_CHARTS_EN_US = {
|
|
5010
|
+
'praxis.charts.runtime.editChart': 'Edit chart settings',
|
|
5011
|
+
'praxis.charts.runtime.invalidDocumentTitle': 'Invalid canonical configuration',
|
|
5012
|
+
'praxis.charts.runtime.invalidDocumentDescription': 'The canonical chart document could not be mapped by Praxis Charts. Review the chart contract before continuing.',
|
|
5013
|
+
'praxis.charts.runtime.remoteErrorTitle': 'Chart data could not be loaded',
|
|
5014
|
+
'praxis.charts.runtime.remoteErrorDescription': 'Review the chart data source and analytics request before continuing.',
|
|
5015
|
+
'praxis.charts.runtime.booleanFalseLabel': 'Not {{ label }}',
|
|
5016
|
+
'praxis.charts.runtime.comparisonCurrent': 'Current',
|
|
5017
|
+
'praxis.charts.runtime.comparisonPrevious': 'Previous',
|
|
5018
|
+
'praxis.charts.widget.missingDocument': 'This widget does not have a canonical chart document yet. Runtime inputs are preserved until a canonical chartDocument is provided by the host.',
|
|
5019
|
+
'praxis.charts.widget.queryContext.label': 'Query context',
|
|
5020
|
+
'praxis.charts.widget.queryContext.ariaLabel': 'Chart query context',
|
|
5021
|
+
'praxis.charts.widget.queryContext.invalidJson': 'Query context must be valid JSON.',
|
|
5022
|
+
'praxis.charts.widget.queryContext.mustBeObject': 'Query context must be a JSON object.',
|
|
5023
|
+
'praxis.charts.editor.section.general': 'General',
|
|
5024
|
+
'praxis.charts.editor.section.data': 'Data',
|
|
5025
|
+
'praxis.charts.editor.section.analytics': 'Analytics',
|
|
5026
|
+
'praxis.charts.editor.section.appearance': 'Appearance',
|
|
5027
|
+
'praxis.charts.editor.section.motion': 'Motion',
|
|
5028
|
+
'praxis.charts.editor.section.events': 'Events',
|
|
5029
|
+
'praxis.charts.editor.section.preview': 'Preview',
|
|
5030
|
+
'praxis.charts.editor.field.chartId': 'Chart ID',
|
|
5031
|
+
'praxis.charts.editor.field.kind': 'Kind',
|
|
5032
|
+
'praxis.charts.editor.field.title': 'Title',
|
|
5033
|
+
'praxis.charts.editor.field.subtitle': 'Subtitle',
|
|
5034
|
+
'praxis.charts.editor.field.sizingMode': 'Sizing',
|
|
5035
|
+
'praxis.charts.editor.field.height': 'Height',
|
|
5036
|
+
'praxis.charts.editor.field.minHeight': 'Minimum height',
|
|
5037
|
+
'praxis.charts.editor.field.maxHeight': 'Maximum height',
|
|
5038
|
+
'praxis.charts.editor.field.aspectRatio': 'Aspect ratio',
|
|
5039
|
+
'praxis.charts.editor.field.sourceKind': 'Source',
|
|
5040
|
+
'praxis.charts.editor.field.resource': 'Resource',
|
|
5041
|
+
'praxis.charts.editor.field.operation': 'Operation',
|
|
5042
|
+
'praxis.charts.editor.field.granularity': 'Granularity',
|
|
5043
|
+
'praxis.charts.editor.field.fillGaps': 'Fill missing intervals',
|
|
5044
|
+
'praxis.charts.editor.field.distributionMode': 'Distribution mode',
|
|
5045
|
+
'praxis.charts.editor.field.bucketSize': 'Bucket size',
|
|
5046
|
+
'praxis.charts.editor.field.bucketCount': 'Bucket count',
|
|
5047
|
+
'praxis.charts.editor.field.comparisonPeriodField': 'Period field',
|
|
5048
|
+
'praxis.charts.editor.field.comparisonTimezone': 'Timezone',
|
|
5049
|
+
'praxis.charts.editor.field.comparisonPreset': 'Period preset',
|
|
5050
|
+
'praxis.charts.editor.field.comparisonMode': 'Comparison mode',
|
|
5051
|
+
'praxis.charts.editor.field.dimension': 'Dimension',
|
|
5052
|
+
'praxis.charts.editor.field.dimensionRole': 'Dimension role',
|
|
5053
|
+
'praxis.charts.editor.field.metric': 'Metric',
|
|
5054
|
+
'praxis.charts.editor.field.metricLabel': 'Metric label',
|
|
5055
|
+
'praxis.charts.editor.field.metricAggregation': 'Aggregation',
|
|
5056
|
+
'praxis.charts.editor.field.metricAxis': 'Axis',
|
|
5057
|
+
'praxis.charts.editor.field.metricSeriesKind': 'Series kind',
|
|
5058
|
+
'praxis.charts.editor.field.legendEnabled': 'Show legend',
|
|
5059
|
+
'praxis.charts.editor.field.labelsEnabled': 'Show labels',
|
|
5060
|
+
'praxis.charts.editor.field.tooltipEnabled': 'Show tooltip',
|
|
5061
|
+
'praxis.charts.editor.field.themeVariant': 'Theme variant',
|
|
5062
|
+
'praxis.charts.editor.field.paletteMode': 'Palette mode',
|
|
5063
|
+
'praxis.charts.editor.field.paletteToken': 'Palette token',
|
|
5064
|
+
'praxis.charts.editor.field.palette': 'Palette colors',
|
|
5065
|
+
'praxis.charts.editor.field.surfaceMode': 'Surface mode',
|
|
5066
|
+
'praxis.charts.editor.field.emptyTitle': 'Empty title',
|
|
5067
|
+
'praxis.charts.editor.field.emptyDescription': 'Empty description',
|
|
5068
|
+
'praxis.charts.editor.field.loadingTitle': 'Loading title',
|
|
5069
|
+
'praxis.charts.editor.field.loadingDescription': 'Loading description',
|
|
5070
|
+
'praxis.charts.editor.field.errorTitle': 'Error title',
|
|
5071
|
+
'praxis.charts.editor.field.errorDescription': 'Error description',
|
|
5072
|
+
'praxis.charts.editor.field.motionEnabled': 'Enable animations',
|
|
5073
|
+
'praxis.charts.editor.field.motionPreset': 'Motion preset',
|
|
5074
|
+
'praxis.charts.editor.field.eventAction': 'Action',
|
|
5075
|
+
'praxis.charts.editor.field.eventTarget': 'Target',
|
|
5076
|
+
'praxis.charts.editor.field.eventMapping': 'Mapping',
|
|
5077
|
+
'praxis.charts.editor.preview.title': 'Chart preview',
|
|
5078
|
+
'praxis.charts.editor.preview.caption': 'Local preview derived from the canonical contract without remote calls.',
|
|
5079
|
+
'praxis.charts.editor.preview.invalid': 'Preview is unavailable while the contract has blocking errors.',
|
|
5080
|
+
'praxis.charts.editor.issues.title': 'Validation issues',
|
|
5081
|
+
'praxis.charts.editor.issues.empty': 'No issues were identified.',
|
|
5082
|
+
'praxis.charts.editor.appearance.featuresTitle': 'Display features',
|
|
5083
|
+
'praxis.charts.editor.appearance.paletteTitle': 'Palette',
|
|
5084
|
+
'praxis.charts.editor.appearance.paletteHint': 'Use a registered token or comma-separated colors to persist theme.palette in the canonical contract.',
|
|
5085
|
+
'praxis.charts.editor.appearance.surfaceTitle': 'Surface',
|
|
5086
|
+
'praxis.charts.editor.appearance.surfaceHint': 'Use embedded for dashboard widgets and contained only when the chart must own its visual surface.',
|
|
5087
|
+
'praxis.charts.editor.appearance.statesTitle': 'State messages',
|
|
5088
|
+
'praxis.charts.editor.catalog.resourceMissing': 'Resource catalog is required for governed praxis.stats authoring.',
|
|
5089
|
+
'praxis.charts.editor.catalog.resourceStale': 'Selected resource is not available in the governed resource catalog.',
|
|
5090
|
+
'praxis.charts.editor.catalog.operationMissing': 'Selected resource does not publish authorable stats operations.',
|
|
5091
|
+
'praxis.charts.editor.catalog.operationStale': 'Selected operation is not supported by the governed resource catalog.',
|
|
5092
|
+
'praxis.charts.editor.catalog.fieldCatalogMissing': 'The selected resource does not publish governed fields for chart authoring.',
|
|
5093
|
+
'praxis.charts.editor.catalog.dimensionFieldsMissing': 'No governed dimensions are available for the current resource and operation.',
|
|
5094
|
+
'praxis.charts.editor.catalog.metricFieldsMissing': 'No governed metrics are available for the current resource and operation.',
|
|
5095
|
+
'praxis.charts.editor.catalog.dimensionFieldStale': 'Selected dimension is not eligible for the current resource and operation.',
|
|
5096
|
+
'praxis.charts.editor.catalog.metricFieldStale': 'Selected metric is not eligible for the current resource and operation.',
|
|
5097
|
+
'praxis.charts.editor.catalog.metricAggregationStale': 'Selected aggregation is not allowed for the selected metric field.',
|
|
5098
|
+
'praxis.charts.editor.catalog.comparisonPeriodFieldsMissing': 'No governed time-series field is available for comparison periods.',
|
|
5099
|
+
'praxis.charts.editor.catalog.comparisonPeriodFieldStale': 'Selected period field is not time-series eligible for the governed comparison operation.',
|
|
5100
|
+
'praxis.charts.editor.catalog.targetMissing': 'Target catalog is required for this governed event action.',
|
|
5101
|
+
'praxis.charts.editor.catalog.targetStale': 'Selected target is not available for this event action.',
|
|
5102
|
+
'praxis.charts.editor.catalog.capabilitiesDenied': 'Access to the selected resource capabilities was denied.',
|
|
5103
|
+
'praxis.charts.editor.catalog.capabilitiesUnavailable': 'The selected resource capabilities are temporarily unavailable.',
|
|
5104
|
+
'praxis.charts.editor.catalog.contextUnavailable': 'Governed chart authoring context could not be resolved.',
|
|
5105
|
+
'praxis.charts.widget.contextDiagnostics.title': 'Authoring context',
|
|
5106
|
+
'praxis.charts.widget.contextDiagnostics.catalogDenied': 'Access to the governed resource catalog was denied.',
|
|
5107
|
+
'praxis.charts.widget.contextDiagnostics.catalogUnavailable': 'The governed resource catalog is temporarily unavailable.',
|
|
5108
|
+
'praxis.charts.widget.contextDiagnostics.catalogEmpty': 'No authorable stats resources were published by the governed catalog.',
|
|
5109
|
+
'praxis.charts.widget.contextDiagnostics.catalogPathInvalid': 'The resource catalog published an unsafe or non-relative operational path.',
|
|
5110
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesDenied': 'Access to the selected resource capabilities was denied.',
|
|
5111
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesUnavailable': 'The selected resource capabilities are temporarily unavailable.',
|
|
5112
|
+
'praxis.charts.widget.contextDiagnostics.operationsEmpty': 'The selected resource does not publish authorable stats operations.',
|
|
5113
|
+
'praxis.charts.widget.contextDiagnostics.fieldsEmpty': 'The selected resource does not publish governed fields for chart authoring.',
|
|
5114
|
+
'praxis.charts.widget.contextDiagnostics.identityMismatch': 'The selected resource identity does not match its governed capability snapshot.',
|
|
5115
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesPathInvalid': 'The selected capability snapshot did not publish a safe governed resource path.',
|
|
5116
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesPathMismatch': 'The selected capability snapshot path does not match the operational path published by the catalog.',
|
|
5117
|
+
'praxis.charts.widget.contextDiagnostics.partial': 'Some governed authoring choices could not be materialized from the current page context.',
|
|
5118
|
+
'praxis.charts.editor.hint.sizingMode': 'Use fill-container only when the host widget provides a defined body height.',
|
|
5119
|
+
'praxis.charts.editor.hint.height': 'Numbers are saved as pixels; CSS lengths such as 20rem are also accepted.',
|
|
5120
|
+
'praxis.charts.editor.hint.minHeight': 'Set a readable minimum for compact dashboard widgets.',
|
|
5121
|
+
'praxis.charts.editor.hint.maxHeight': 'Leave empty unless the chart must stop growing inside a flexible layout.',
|
|
5122
|
+
'praxis.charts.editor.hint.aspectRatio': 'Optional. Use values such as 1.777 or 16 / 9.',
|
|
5123
|
+
'praxis.charts.editor.analytics.dimensionsTitle': 'Dimensions',
|
|
5124
|
+
'praxis.charts.editor.analytics.metricsTitle': 'Metrics',
|
|
5125
|
+
'praxis.charts.editor.analytics.addDimension': 'Add dimension',
|
|
5126
|
+
'praxis.charts.editor.analytics.addMetric': 'Add metric',
|
|
5127
|
+
'praxis.charts.editor.analytics.removeDimension': 'Remove dimension',
|
|
5128
|
+
'praxis.charts.editor.analytics.removeMetric': 'Remove metric',
|
|
5129
|
+
'praxis.charts.editor.specialization.timeseriesTitle': 'Timeseries options',
|
|
5130
|
+
'praxis.charts.editor.specialization.distributionTitle': 'Distribution options',
|
|
5131
|
+
'praxis.charts.editor.specialization.comparisonTitle': 'Comparison period',
|
|
5132
|
+
'praxis.charts.editor.specialization.comboTitle': 'Combo guidance',
|
|
5133
|
+
'praxis.charts.editor.specialization.comboHint': 'Combo charts require at least two metrics and allow per-metric axis and series kind mapping.',
|
|
5134
|
+
'praxis.charts.editor.specialization.pieDonutTitle': 'Composition guidance',
|
|
5135
|
+
'praxis.charts.editor.themeVariant.none': 'No variant',
|
|
5136
|
+
'praxis.charts.editor.themeVariant.default': 'Default',
|
|
5137
|
+
'praxis.charts.editor.themeVariant.compact': 'Compact',
|
|
5138
|
+
'praxis.charts.editor.themeVariant.executive': 'Executive',
|
|
5139
|
+
'praxis.charts.editor.paletteMode.token': 'Registered token',
|
|
5140
|
+
'praxis.charts.editor.paletteMode.custom': 'Custom colors',
|
|
5141
|
+
'praxis.charts.editor.paletteToken.brand-primary': 'Brand primary',
|
|
5142
|
+
'praxis.charts.editor.paletteToken.brand-balanced': 'Brand balanced',
|
|
5143
|
+
'praxis.charts.editor.paletteToken.status': 'Status',
|
|
5144
|
+
'praxis.charts.editor.paletteToken.executive': 'Executive',
|
|
5145
|
+
'praxis.charts.editor.specialization.pieDonutHint': 'Pie, donut, funnel and pyramid charts keep one metric and use the first dimension as the category segment.',
|
|
5146
|
+
'praxis.charts.editor.specialization.scatterTitle': 'Scatter guidance',
|
|
5147
|
+
'praxis.charts.editor.specialization.scatterHint': 'Scatter charts use the first dimension as X and the first metric as Y.',
|
|
5148
|
+
'praxis.charts.editor.events.pointClickTitle': 'Point click',
|
|
5149
|
+
'praxis.charts.editor.events.selectionChangeTitle': 'Selection change',
|
|
5150
|
+
'praxis.charts.editor.events.drillDownTitle': 'Drill down',
|
|
5151
|
+
'praxis.charts.editor.events.crossFilterTitle': 'Cross filter',
|
|
5152
|
+
'praxis.charts.editor.events.none': 'None',
|
|
5153
|
+
'praxis.charts.editor.sourceKind.praxisStats': 'praxis.stats',
|
|
5154
|
+
'praxis.charts.editor.sourceKind.derived': 'derived',
|
|
5155
|
+
'praxis.charts.editor.sizing.fixed': 'Fixed height',
|
|
5156
|
+
'praxis.charts.editor.sizing.fill-container': 'Fill widget',
|
|
5157
|
+
'praxis.charts.editor.sizing.auto': 'Automatic',
|
|
5158
|
+
'praxis.charts.editor.surface.auto': 'Automatic',
|
|
5159
|
+
'praxis.charts.editor.surface.embedded': 'Embedded in widget',
|
|
5160
|
+
'praxis.charts.editor.surface.contained': 'Contained surface',
|
|
5161
|
+
'praxis.charts.editor.operation.groupBy': 'group-by',
|
|
5162
|
+
'praxis.charts.editor.operation.timeseries': 'timeseries',
|
|
5163
|
+
'praxis.charts.editor.operation.distribution': 'distribution',
|
|
5164
|
+
'praxis.charts.editor.operation.comparison': 'comparison',
|
|
5165
|
+
'praxis.charts.editor.granularity.day': 'day',
|
|
5166
|
+
'praxis.charts.editor.granularity.week': 'week',
|
|
5167
|
+
'praxis.charts.editor.granularity.month': 'month',
|
|
5168
|
+
'praxis.charts.editor.distributionMode.terms': 'terms',
|
|
5169
|
+
'praxis.charts.editor.distributionMode.histogram': 'histogram',
|
|
5170
|
+
'praxis.charts.editor.comparisonPreset.TODAY': 'Today',
|
|
5171
|
+
'praxis.charts.editor.comparisonPreset.YESTERDAY': 'Yesterday',
|
|
5172
|
+
'praxis.charts.editor.comparisonPreset.LAST_7_DAYS': 'Last 7 days',
|
|
5173
|
+
'praxis.charts.editor.comparisonPreset.LAST_30_DAYS': 'Last 30 days',
|
|
5174
|
+
'praxis.charts.editor.comparisonPreset.THIS_MONTH': 'This month',
|
|
5175
|
+
'praxis.charts.editor.comparisonPreset.LAST_MONTH': 'Last month',
|
|
5176
|
+
'praxis.charts.editor.comparisonPreset.THIS_QUARTER': 'This quarter',
|
|
5177
|
+
'praxis.charts.editor.comparisonPreset.THIS_YEAR': 'This year',
|
|
5178
|
+
'praxis.charts.editor.comparisonMode.PREVIOUS_ALIGNED': 'Previous aligned period',
|
|
5179
|
+
'praxis.charts.editor.comparisonMode.PREVIOUS_CALENDAR_PERIOD': 'Previous calendar period',
|
|
5180
|
+
'praxis.charts.editor.motionPreset.subtle': 'subtle',
|
|
5181
|
+
'praxis.charts.editor.motionPreset.standard': 'standard',
|
|
5182
|
+
'praxis.charts.editor.motionPreset.expressive': 'expressive',
|
|
5183
|
+
'praxis.charts.editor.dimensionRole.category': 'category',
|
|
5184
|
+
'praxis.charts.editor.dimensionRole.series': 'series',
|
|
5185
|
+
'praxis.charts.editor.dimensionRole.segment': 'segment',
|
|
5186
|
+
'praxis.charts.editor.dimensionRole.time': 'time',
|
|
5187
|
+
'praxis.charts.editor.dimensionRole.value': 'value',
|
|
5188
|
+
'praxis.charts.editor.metricAggregation.sum': 'sum',
|
|
5189
|
+
'praxis.charts.editor.metricAggregation.count': 'count',
|
|
5190
|
+
'praxis.charts.editor.metricAggregation.distinct-count': 'distinct count',
|
|
5191
|
+
'praxis.charts.editor.metricAggregation.avg': 'avg',
|
|
5192
|
+
'praxis.charts.editor.metricAggregation.min': 'min',
|
|
5193
|
+
'praxis.charts.editor.metricAggregation.max': 'max',
|
|
5194
|
+
'praxis.charts.editor.metricAxis.primary': 'primary',
|
|
5195
|
+
'praxis.charts.editor.metricAxis.secondary': 'secondary',
|
|
5196
|
+
'praxis.charts.editor.metricSeriesKind.bar': 'bar',
|
|
5197
|
+
'praxis.charts.editor.metricSeriesKind.line': 'line',
|
|
5198
|
+
'praxis.charts.editor.metricSeriesKind.area': 'area',
|
|
5199
|
+
'praxis.charts.editor.eventAction.filter-widget': 'filter-widget',
|
|
5200
|
+
'praxis.charts.editor.eventAction.open-detail': 'open-detail',
|
|
5201
|
+
'praxis.charts.editor.eventAction.navigate': 'navigate',
|
|
5202
|
+
'praxis.charts.editor.eventAction.update-context': 'update-context',
|
|
5203
|
+
'praxis.charts.editor.eventAction.emit': 'emit',
|
|
5204
|
+
'praxis.charts.editor.kind.bar': 'Bar',
|
|
5205
|
+
'praxis.charts.editor.kind.horizontal-bar': 'Horizontal Bar',
|
|
5206
|
+
'praxis.charts.editor.kind.line': 'Line',
|
|
5207
|
+
'praxis.charts.editor.kind.area': 'Area',
|
|
5208
|
+
'praxis.charts.editor.kind.stacked-bar': 'Stacked Bar',
|
|
5209
|
+
'praxis.charts.editor.kind.stacked-area': 'Stacked Area',
|
|
5210
|
+
'praxis.charts.editor.kind.combo': 'Combo',
|
|
5211
|
+
'praxis.charts.editor.kind.pie': 'Pie',
|
|
5212
|
+
'praxis.charts.editor.kind.donut': 'Donut',
|
|
5213
|
+
'praxis.charts.editor.kind.scatter': 'Scatter',
|
|
5214
|
+
'praxis.charts.editor.kind.funnel': 'Funnel',
|
|
5215
|
+
'praxis.charts.editor.kind.pyramid': 'Pyramid',
|
|
5216
|
+
'praxis.charts.analyticsPresentation.selectorLabel': 'Analytics presentation',
|
|
5217
|
+
'praxis.charts.analyticsPresentation.chart': 'Chart',
|
|
5218
|
+
'praxis.charts.analyticsPresentation.table': 'Table',
|
|
5219
|
+
'praxis.charts.analyticsPresentation.kpi': 'KPI',
|
|
5220
|
+
'praxis.charts.analyticsPresentation.kpiCollection': 'Key metrics',
|
|
5221
|
+
'praxis.charts.analyticsPresentation.kpiUnknownBucket': 'Unidentified category',
|
|
5222
|
+
'praxis.charts.analyticsPresentation.kpiItemAriaLabel': '{category}: {value} {metric}',
|
|
5223
|
+
'praxis.charts.analyticsPresentation.unavailable': 'Presentation unavailable',
|
|
5224
|
+
'praxis.charts.analyticsPresentation.loading': 'Loading analytics…',
|
|
5225
|
+
'praxis.charts.analyticsPresentation.empty': 'No data available.',
|
|
5226
|
+
'praxis.charts.analyticsPresentation.loadError': 'Analytics data could not be loaded.',
|
|
5227
|
+
'praxis.charts.analyticsPresentation.resolutionError': 'The analytics presentation could not be resolved.',
|
|
5228
|
+
'praxis.charts.analyticsPresentation.projectionMissing': 'Analytics projection "{projectionId}" was not found.',
|
|
5229
|
+
'praxis.charts.analyticsPresentation.noRenderer': 'Analytics projection "{projectionId}" has no eligible installed renderer.',
|
|
5230
|
+
'praxis.charts.analyticsPresentation.familyIneligible': 'Presentation family "{family}" is not eligible for projection "{projectionId}".',
|
|
5231
|
+
};
|
|
5232
|
+
|
|
5233
|
+
const PRAXIS_CHARTS_PT_BR = {
|
|
5234
|
+
'praxis.charts.runtime.editChart': 'Editar configurações do gráfico',
|
|
5235
|
+
'praxis.charts.runtime.invalidDocumentTitle': 'Configuração canônica inválida',
|
|
5236
|
+
'praxis.charts.runtime.invalidDocumentDescription': 'O documento canônico do gráfico não pode ser mapeado pelo Praxis Charts. Revise o contrato do gráfico antes de continuar.',
|
|
5237
|
+
'praxis.charts.runtime.remoteErrorTitle': 'Não foi possível carregar os dados do gráfico',
|
|
5238
|
+
'praxis.charts.runtime.remoteErrorDescription': 'Revise a fonte de dados e os filtros antes de continuar.',
|
|
5239
|
+
'praxis.charts.runtime.booleanFalseLabel': 'Não {{ label }}',
|
|
5240
|
+
'praxis.charts.runtime.comparisonCurrent': 'Atual',
|
|
5241
|
+
'praxis.charts.runtime.comparisonPrevious': 'Anterior',
|
|
5242
|
+
'praxis.charts.widget.missingDocument': 'Este widget ainda não possui um documento canônico de gráfico. Os inputs runtime são preservados até o host fornecer um chartDocument canônico.',
|
|
5243
|
+
'praxis.charts.widget.queryContext.label': 'Contexto da consulta',
|
|
5244
|
+
'praxis.charts.widget.queryContext.ariaLabel': 'Contexto da consulta do gráfico',
|
|
5245
|
+
'praxis.charts.widget.queryContext.invalidJson': 'O contexto da consulta deve ser um JSON válido.',
|
|
5246
|
+
'praxis.charts.widget.queryContext.mustBeObject': 'O contexto da consulta deve ser um objeto JSON.',
|
|
5247
|
+
'praxis.charts.editor.section.general': 'Geral',
|
|
5248
|
+
'praxis.charts.editor.section.data': 'Dados',
|
|
5249
|
+
'praxis.charts.editor.section.analytics': 'Estrutura',
|
|
5250
|
+
'praxis.charts.editor.section.appearance': 'Aparência',
|
|
5251
|
+
'praxis.charts.editor.section.motion': 'Movimento',
|
|
5252
|
+
'praxis.charts.editor.section.events': 'Eventos',
|
|
5253
|
+
'praxis.charts.editor.section.preview': 'Visualização',
|
|
5254
|
+
'praxis.charts.editor.field.chartId': 'ID do Gráfico',
|
|
5255
|
+
'praxis.charts.editor.field.kind': 'Tipo',
|
|
5256
|
+
'praxis.charts.editor.field.title': 'Título',
|
|
5257
|
+
'praxis.charts.editor.field.subtitle': 'Subtítulo',
|
|
5258
|
+
'praxis.charts.editor.field.sizingMode': 'Tamanho',
|
|
5259
|
+
'praxis.charts.editor.field.height': 'Altura',
|
|
5260
|
+
'praxis.charts.editor.field.minHeight': 'Altura mínima',
|
|
5261
|
+
'praxis.charts.editor.field.maxHeight': 'Altura máxima',
|
|
5262
|
+
'praxis.charts.editor.field.aspectRatio': 'Proporção',
|
|
5263
|
+
'praxis.charts.editor.field.sourceKind': 'Fonte',
|
|
5264
|
+
'praxis.charts.editor.field.resource': 'Recurso',
|
|
5265
|
+
'praxis.charts.editor.field.operation': 'Operação',
|
|
5266
|
+
'praxis.charts.editor.field.granularity': 'Granularidade',
|
|
5267
|
+
'praxis.charts.editor.field.fillGaps': 'Preencher intervalos sem dados',
|
|
5268
|
+
'praxis.charts.editor.field.distributionMode': 'Modo de distribuição',
|
|
5269
|
+
'praxis.charts.editor.field.bucketSize': 'Tamanho do bucket',
|
|
5270
|
+
'praxis.charts.editor.field.bucketCount': 'Quantidade de buckets',
|
|
5271
|
+
'praxis.charts.editor.field.comparisonPeriodField': 'Campo de período',
|
|
5272
|
+
'praxis.charts.editor.field.comparisonTimezone': 'Fuso horário',
|
|
5273
|
+
'praxis.charts.editor.field.comparisonPreset': 'Período predefinido',
|
|
5274
|
+
'praxis.charts.editor.field.comparisonMode': 'Modo de comparação',
|
|
5275
|
+
'praxis.charts.editor.field.dimension': 'Dimensão',
|
|
5276
|
+
'praxis.charts.editor.field.dimensionRole': 'Papel da dimensão',
|
|
5277
|
+
'praxis.charts.editor.field.metric': 'Métrica',
|
|
5278
|
+
'praxis.charts.editor.field.metricLabel': 'Rótulo da métrica',
|
|
5279
|
+
'praxis.charts.editor.field.metricAggregation': 'Agregação',
|
|
5280
|
+
'praxis.charts.editor.field.metricAxis': 'Eixo',
|
|
5281
|
+
'praxis.charts.editor.field.metricSeriesKind': 'Tipo da série',
|
|
5282
|
+
'praxis.charts.editor.field.legendEnabled': 'Exibir legenda',
|
|
5283
|
+
'praxis.charts.editor.field.labelsEnabled': 'Exibir rótulos',
|
|
5284
|
+
'praxis.charts.editor.field.tooltipEnabled': 'Exibir dica de ferramenta (tooltip)',
|
|
5285
|
+
'praxis.charts.editor.field.themeVariant': 'Variante de tema',
|
|
5286
|
+
'praxis.charts.editor.field.paletteMode': 'Modo da paleta',
|
|
5287
|
+
'praxis.charts.editor.field.paletteToken': 'Token da paleta',
|
|
5288
|
+
'praxis.charts.editor.field.palette': 'Cores da paleta',
|
|
5289
|
+
'praxis.charts.editor.field.surfaceMode': 'Modo da superfície',
|
|
5290
|
+
'praxis.charts.editor.field.emptyTitle': 'Título do estado vazio',
|
|
5291
|
+
'praxis.charts.editor.field.emptyDescription': 'Descrição do estado vazio',
|
|
5292
|
+
'praxis.charts.editor.field.loadingTitle': 'Título de carregamento',
|
|
5293
|
+
'praxis.charts.editor.field.loadingDescription': 'Descrição de carregamento',
|
|
5294
|
+
'praxis.charts.editor.field.errorTitle': 'Título do erro',
|
|
5295
|
+
'praxis.charts.editor.field.errorDescription': 'Descrição do erro',
|
|
5296
|
+
'praxis.charts.editor.field.motionEnabled': 'Ativar animações',
|
|
5297
|
+
'praxis.charts.editor.field.motionPreset': 'Predefinição de movimento',
|
|
5298
|
+
'praxis.charts.editor.field.eventAction': 'Ação',
|
|
5299
|
+
'praxis.charts.editor.field.eventTarget': 'Destino',
|
|
5300
|
+
'praxis.charts.editor.field.eventMapping': 'Mapeamento',
|
|
5301
|
+
'praxis.charts.editor.preview.title': 'Visualização do gráfico',
|
|
5302
|
+
'praxis.charts.editor.preview.caption': 'Visualização local derivada do contrato canônico, sem chamadas remotas.',
|
|
5303
|
+
'praxis.charts.editor.preview.invalid': 'A visualização fica indisponível enquanto houver erro bloqueante no contrato.',
|
|
5304
|
+
'praxis.charts.editor.issues.title': 'Problemas de validação',
|
|
5305
|
+
'praxis.charts.editor.issues.empty': 'Nenhum problema identificado.',
|
|
5306
|
+
'praxis.charts.editor.appearance.featuresTitle': 'Recursos visuais',
|
|
5307
|
+
'praxis.charts.editor.appearance.paletteTitle': 'Paleta',
|
|
5308
|
+
'praxis.charts.editor.appearance.paletteHint': 'Use um token registrado ou cores separadas por vírgula para persistir `theme.palette` no contrato canônico.',
|
|
5309
|
+
'praxis.charts.editor.appearance.surfaceTitle': 'Superfície',
|
|
5310
|
+
'praxis.charts.editor.appearance.surfaceHint': 'Use embutido para widgets de dashboard e contido apenas quando o gráfico precisar ser dono da própria superfície visual.',
|
|
5311
|
+
'praxis.charts.editor.appearance.statesTitle': 'Mensagens de estado',
|
|
5312
|
+
'praxis.charts.editor.catalog.resourceMissing': 'O catálogo de recursos é obrigatório para authoring governado de praxis.stats.',
|
|
5313
|
+
'praxis.charts.editor.catalog.resourceStale': 'O recurso selecionado não está disponível no catálogo governado de recursos.',
|
|
5314
|
+
'praxis.charts.editor.catalog.operationMissing': 'O recurso selecionado não publica operações de stats authoráveis.',
|
|
5315
|
+
'praxis.charts.editor.catalog.operationStale': 'A operação selecionada não é suportada pelo catálogo governado do recurso.',
|
|
5316
|
+
'praxis.charts.editor.catalog.fieldCatalogMissing': 'O recurso selecionado não publica campos governados para a autoria do gráfico.',
|
|
5317
|
+
'praxis.charts.editor.catalog.dimensionFieldsMissing': 'Nenhuma dimensão governada está disponível para o recurso e a operação atuais.',
|
|
5318
|
+
'praxis.charts.editor.catalog.metricFieldsMissing': 'Nenhuma métrica governada está disponível para o recurso e a operação atuais.',
|
|
5319
|
+
'praxis.charts.editor.catalog.dimensionFieldStale': 'A dimensão selecionada não é elegível para o recurso e a operação atuais.',
|
|
5320
|
+
'praxis.charts.editor.catalog.metricFieldStale': 'A métrica selecionada não é elegível para o recurso e a operação atuais.',
|
|
5321
|
+
'praxis.charts.editor.catalog.metricAggregationStale': 'A agregação selecionada não é permitida para a métrica escolhida.',
|
|
5322
|
+
'praxis.charts.editor.catalog.comparisonPeriodFieldsMissing': 'Nenhum campo temporal governado está disponível para períodos de comparação.',
|
|
5323
|
+
'praxis.charts.editor.catalog.comparisonPeriodFieldStale': 'O campo de período selecionado não é elegível para série temporal na operação de comparação governada.',
|
|
5324
|
+
'praxis.charts.editor.catalog.targetMissing': 'O catálogo de destinos é obrigatório para esta ação de evento governada.',
|
|
5325
|
+
'praxis.charts.editor.catalog.targetStale': 'O destino selecionado não está disponível para esta ação de evento.',
|
|
5326
|
+
'praxis.charts.editor.catalog.capabilitiesDenied': 'O acesso às capabilities do recurso selecionado foi negado.',
|
|
5327
|
+
'praxis.charts.editor.catalog.capabilitiesUnavailable': 'As capabilities do recurso selecionado estão temporariamente indisponíveis.',
|
|
5328
|
+
'praxis.charts.editor.catalog.contextUnavailable': 'Não foi possível resolver o contexto governado de authoring do gráfico.',
|
|
5329
|
+
'praxis.charts.widget.contextDiagnostics.title': 'Contexto de authoring',
|
|
5330
|
+
'praxis.charts.widget.contextDiagnostics.catalogDenied': 'O acesso ao catálogo governado de recursos foi negado.',
|
|
5331
|
+
'praxis.charts.widget.contextDiagnostics.catalogUnavailable': 'O catálogo governado de recursos está temporariamente indisponível.',
|
|
5332
|
+
'praxis.charts.widget.contextDiagnostics.catalogEmpty': 'Nenhum recurso de stats authorável foi publicado pelo catálogo governado.',
|
|
5333
|
+
'praxis.charts.widget.contextDiagnostics.catalogPathInvalid': 'O catálogo de recursos publicou um path operacional inseguro ou não relativo.',
|
|
5334
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesDenied': 'O acesso às capabilities do recurso selecionado foi negado.',
|
|
5335
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesUnavailable': 'As capabilities do recurso selecionado estão temporariamente indisponíveis.',
|
|
5336
|
+
'praxis.charts.widget.contextDiagnostics.operationsEmpty': 'O recurso selecionado não publica operações de stats authoráveis.',
|
|
5337
|
+
'praxis.charts.widget.contextDiagnostics.fieldsEmpty': 'O recurso selecionado não publica campos governados para a autoria do gráfico.',
|
|
5338
|
+
'praxis.charts.widget.contextDiagnostics.identityMismatch': 'A identidade do recurso selecionado não corresponde ao snapshot governado de capabilities.',
|
|
5339
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesPathInvalid': 'O snapshot de capabilities selecionado não publicou um path de recurso governado e seguro.',
|
|
5340
|
+
'praxis.charts.widget.contextDiagnostics.capabilitiesPathMismatch': 'O path do snapshot de capabilities não corresponde ao path operacional publicado pelo catálogo.',
|
|
5341
|
+
'praxis.charts.widget.contextDiagnostics.partial': 'Algumas opções governadas de authoring não puderam ser materializadas a partir do contexto atual da página.',
|
|
5342
|
+
'praxis.charts.editor.hint.sizingMode': 'Use preencher container apenas quando o widget host fornecer altura definida para o corpo.',
|
|
5343
|
+
'praxis.charts.editor.hint.height': 'Números são salvos como pixels; medidas CSS como 20rem também são aceitas.',
|
|
5344
|
+
'praxis.charts.editor.hint.minHeight': 'Defina um mínimo legível para widgets compactos de dashboard.',
|
|
5345
|
+
'praxis.charts.editor.hint.maxHeight': 'Deixe vazio exceto quando o gráfico não puder crescer dentro de um layout flexível.',
|
|
5346
|
+
'praxis.charts.editor.hint.aspectRatio': 'Opcional. Use valores como 1.777 ou 16 / 9.',
|
|
5347
|
+
'praxis.charts.editor.analytics.dimensionsTitle': 'Dimensões',
|
|
5348
|
+
'praxis.charts.editor.analytics.metricsTitle': 'Métricas',
|
|
5349
|
+
'praxis.charts.editor.analytics.addDimension': 'Adicionar dimensão',
|
|
5350
|
+
'praxis.charts.editor.analytics.addMetric': 'Adicionar métrica',
|
|
5351
|
+
'praxis.charts.editor.analytics.removeDimension': 'Remover dimensão',
|
|
5352
|
+
'praxis.charts.editor.analytics.removeMetric': 'Remover métrica',
|
|
5353
|
+
'praxis.charts.editor.specialization.timeseriesTitle': 'Opções de séries temporais',
|
|
5354
|
+
'praxis.charts.editor.specialization.distributionTitle': 'Opções de distribuição',
|
|
5355
|
+
'praxis.charts.editor.specialization.comparisonTitle': 'Período de comparação',
|
|
5356
|
+
'praxis.charts.editor.specialization.comboTitle': 'Guia de combo',
|
|
5357
|
+
'praxis.charts.editor.specialization.comboHint': 'Gráficos combo exigem pelo menos duas métricas e permitem configurar eixo e tipo de série por métrica.',
|
|
5358
|
+
'praxis.charts.editor.specialization.pieDonutTitle': 'Guia de composição',
|
|
5359
|
+
'praxis.charts.editor.themeVariant.none': 'Sem variante',
|
|
5360
|
+
'praxis.charts.editor.themeVariant.default': 'Padrão',
|
|
5361
|
+
'praxis.charts.editor.themeVariant.compact': 'Compacta',
|
|
5362
|
+
'praxis.charts.editor.themeVariant.executive': 'Executiva',
|
|
5363
|
+
'praxis.charts.editor.paletteMode.token': 'Token registrado',
|
|
5364
|
+
'praxis.charts.editor.paletteMode.custom': 'Cores customizadas',
|
|
5365
|
+
'praxis.charts.editor.paletteToken.brand-primary': 'Marca principal',
|
|
5366
|
+
'praxis.charts.editor.paletteToken.brand-balanced': 'Marca balanceada',
|
|
5367
|
+
'praxis.charts.editor.paletteToken.status': 'Status',
|
|
5368
|
+
'praxis.charts.editor.paletteToken.executive': 'Executiva',
|
|
5369
|
+
'praxis.charts.editor.specialization.pieDonutHint': 'Gráficos de pizza, rosca, funil e pirâmide mantêm uma métrica e usam a primeira dimensão como segmento categórico.',
|
|
5370
|
+
'praxis.charts.editor.specialization.scatterTitle': 'Guia de dispersão (scatter)',
|
|
5371
|
+
'praxis.charts.editor.specialization.scatterHint': 'Gráficos de dispersão usam a primeira dimensão como eixo X e a primeira métrica como eixo Y.',
|
|
5372
|
+
'praxis.charts.editor.events.pointClickTitle': 'Clique no ponto',
|
|
5373
|
+
'praxis.charts.editor.events.selectionChangeTitle': 'Mudança de seleção',
|
|
5374
|
+
'praxis.charts.editor.events.drillDownTitle': 'Drill down',
|
|
5375
|
+
'praxis.charts.editor.events.crossFilterTitle': 'Filtro cruzado',
|
|
5376
|
+
'praxis.charts.editor.events.none': 'Nenhuma',
|
|
5377
|
+
'praxis.charts.editor.sourceKind.praxisStats': 'praxis.stats',
|
|
5378
|
+
'praxis.charts.editor.sourceKind.derived': 'derivado',
|
|
5379
|
+
'praxis.charts.editor.sizing.fixed': 'Altura fixa',
|
|
5380
|
+
'praxis.charts.editor.sizing.fill-container': 'Preencher widget',
|
|
5381
|
+
'praxis.charts.editor.sizing.auto': 'Automático',
|
|
5382
|
+
'praxis.charts.editor.surface.auto': 'Automático',
|
|
5383
|
+
'praxis.charts.editor.surface.embedded': 'Embutido no widget',
|
|
5384
|
+
'praxis.charts.editor.surface.contained': 'Superfície contida',
|
|
5385
|
+
'praxis.charts.editor.operation.groupBy': 'agrupar por',
|
|
5386
|
+
'praxis.charts.editor.operation.timeseries': 'série temporal',
|
|
5387
|
+
'praxis.charts.editor.operation.distribution': 'distribuição',
|
|
5388
|
+
'praxis.charts.editor.operation.comparison': 'comparação',
|
|
5389
|
+
'praxis.charts.editor.granularity.day': 'dia',
|
|
5390
|
+
'praxis.charts.editor.granularity.week': 'semana',
|
|
5391
|
+
'praxis.charts.editor.granularity.month': 'mês',
|
|
5392
|
+
'praxis.charts.editor.distributionMode.terms': 'termos',
|
|
5393
|
+
'praxis.charts.editor.distributionMode.histogram': 'histograma',
|
|
5394
|
+
'praxis.charts.editor.comparisonPreset.TODAY': 'Hoje',
|
|
5395
|
+
'praxis.charts.editor.comparisonPreset.YESTERDAY': 'Ontem',
|
|
5396
|
+
'praxis.charts.editor.comparisonPreset.LAST_7_DAYS': 'Últimos 7 dias',
|
|
5397
|
+
'praxis.charts.editor.comparisonPreset.LAST_30_DAYS': 'Últimos 30 dias',
|
|
5398
|
+
'praxis.charts.editor.comparisonPreset.THIS_MONTH': 'Este mês',
|
|
5399
|
+
'praxis.charts.editor.comparisonPreset.LAST_MONTH': 'Mês anterior',
|
|
5400
|
+
'praxis.charts.editor.comparisonPreset.THIS_QUARTER': 'Este trimestre',
|
|
5401
|
+
'praxis.charts.editor.comparisonPreset.THIS_YEAR': 'Este ano',
|
|
5402
|
+
'praxis.charts.editor.comparisonMode.PREVIOUS_ALIGNED': 'Período anterior alinhado',
|
|
5403
|
+
'praxis.charts.editor.comparisonMode.PREVIOUS_CALENDAR_PERIOD': 'Período anterior do calendário',
|
|
5404
|
+
'praxis.charts.editor.motionPreset.subtle': 'sutil',
|
|
5405
|
+
'praxis.charts.editor.motionPreset.standard': 'padrão',
|
|
5406
|
+
'praxis.charts.editor.motionPreset.expressive': 'expressivo',
|
|
5407
|
+
'praxis.charts.editor.dimensionRole.category': 'categoria',
|
|
5408
|
+
'praxis.charts.editor.dimensionRole.series': 'série',
|
|
5409
|
+
'praxis.charts.editor.dimensionRole.segment': 'segmento',
|
|
5410
|
+
'praxis.charts.editor.dimensionRole.time': 'tempo',
|
|
5411
|
+
'praxis.charts.editor.dimensionRole.value': 'valor',
|
|
5412
|
+
'praxis.charts.editor.metricAggregation.sum': 'soma',
|
|
5413
|
+
'praxis.charts.editor.metricAggregation.count': 'contagem',
|
|
5414
|
+
'praxis.charts.editor.metricAggregation.distinct-count': 'contagem distinta',
|
|
5415
|
+
'praxis.charts.editor.metricAggregation.avg': 'média',
|
|
5416
|
+
'praxis.charts.editor.metricAggregation.min': 'mínimo',
|
|
5417
|
+
'praxis.charts.editor.metricAggregation.max': 'máximo',
|
|
5418
|
+
'praxis.charts.editor.metricAxis.primary': 'primário',
|
|
5419
|
+
'praxis.charts.editor.metricAxis.secondary': 'secundário',
|
|
5420
|
+
'praxis.charts.editor.metricSeriesKind.bar': 'barra',
|
|
5421
|
+
'praxis.charts.editor.metricSeriesKind.line': 'linha',
|
|
5422
|
+
'praxis.charts.editor.metricSeriesKind.area': 'área',
|
|
5423
|
+
'praxis.charts.editor.eventAction.filter-widget': 'filtrar widget',
|
|
5424
|
+
'praxis.charts.editor.eventAction.open-detail': 'abrir detalhes',
|
|
5425
|
+
'praxis.charts.editor.eventAction.navigate': 'navegar',
|
|
5426
|
+
'praxis.charts.editor.eventAction.update-context': 'atualizar contexto',
|
|
5427
|
+
'praxis.charts.editor.eventAction.emit': 'emitir',
|
|
5428
|
+
'praxis.charts.editor.kind.bar': 'Barra',
|
|
5429
|
+
'praxis.charts.editor.kind.horizontal-bar': 'Barra Horizontal',
|
|
5430
|
+
'praxis.charts.editor.kind.line': 'Linha',
|
|
5431
|
+
'praxis.charts.editor.kind.area': 'Área',
|
|
5432
|
+
'praxis.charts.editor.kind.stacked-bar': 'Barra Empilhada',
|
|
5433
|
+
'praxis.charts.editor.kind.stacked-area': 'Área Empilhada',
|
|
5434
|
+
'praxis.charts.editor.kind.combo': 'Combinado (Combo)',
|
|
5435
|
+
'praxis.charts.editor.kind.pie': 'Pizza (Pie)',
|
|
5436
|
+
'praxis.charts.editor.kind.donut': 'Rosca (Donut)',
|
|
5437
|
+
'praxis.charts.editor.kind.scatter': 'Dispersão (Scatter)',
|
|
5438
|
+
'praxis.charts.editor.kind.funnel': 'Funil',
|
|
5439
|
+
'praxis.charts.editor.kind.pyramid': 'Pirâmide',
|
|
5440
|
+
'praxis.charts.analyticsPresentation.selectorLabel': 'Apresentação analítica',
|
|
5441
|
+
'praxis.charts.analyticsPresentation.chart': 'Gráfico',
|
|
5442
|
+
'praxis.charts.analyticsPresentation.table': 'Tabela',
|
|
5443
|
+
'praxis.charts.analyticsPresentation.kpi': 'Indicadores',
|
|
5444
|
+
'praxis.charts.analyticsPresentation.kpiCollection': 'Indicadores principais',
|
|
5445
|
+
'praxis.charts.analyticsPresentation.kpiUnknownBucket': 'Categoria não identificada',
|
|
5446
|
+
'praxis.charts.analyticsPresentation.kpiItemAriaLabel': '{category}: {value} {metric}',
|
|
5447
|
+
'praxis.charts.analyticsPresentation.unavailable': 'Apresentação indisponível',
|
|
5448
|
+
'praxis.charts.analyticsPresentation.loading': 'Carregando dados analíticos…',
|
|
5449
|
+
'praxis.charts.analyticsPresentation.empty': 'Nenhum dado disponível.',
|
|
5450
|
+
'praxis.charts.analyticsPresentation.loadError': 'Não foi possível carregar os dados analíticos.',
|
|
5451
|
+
'praxis.charts.analyticsPresentation.resolutionError': 'Não foi possível resolver a apresentação analítica.',
|
|
5452
|
+
'praxis.charts.analyticsPresentation.projectionMissing': 'A projection analítica "{projectionId}" não foi encontrada.',
|
|
5453
|
+
'praxis.charts.analyticsPresentation.noRenderer': 'A projection analítica "{projectionId}" não possui renderer instalado elegível.',
|
|
5454
|
+
'praxis.charts.analyticsPresentation.familyIneligible': 'A família de apresentação "{family}" não é elegível para a projection "{projectionId}".',
|
|
5455
|
+
};
|
|
5456
|
+
|
|
5457
|
+
const PRAXIS_CHARTS_I18N = new InjectionToken('PRAXIS_CHARTS_I18N', {
|
|
5458
|
+
factory: () => ({}),
|
|
5459
|
+
});
|
|
5460
|
+
function createPraxisChartsI18nConfig(options = {}) {
|
|
5461
|
+
const localeDictionaries = {
|
|
5462
|
+
'pt-BR': {
|
|
5463
|
+
...PRAXIS_CHARTS_PT_BR,
|
|
5464
|
+
...(options.dictionaries?.['pt-BR'] ?? {}),
|
|
5465
|
+
},
|
|
5466
|
+
'en-US': {
|
|
5467
|
+
...PRAXIS_CHARTS_EN_US,
|
|
5468
|
+
...(options.dictionaries?.['en-US'] ?? {}),
|
|
5469
|
+
},
|
|
5470
|
+
};
|
|
5471
|
+
for (const [locale, dictionary] of Object.entries(options.dictionaries ?? {})) {
|
|
5472
|
+
if (locale === 'pt-BR' || locale === 'en-US') {
|
|
5473
|
+
continue;
|
|
5378
5474
|
}
|
|
5379
|
-
|
|
5380
|
-
|
|
5381
|
-
|
|
5382
|
-
&& categoryField
|
|
5383
|
-
&& categoryValue !== undefined
|
|
5384
|
-
? payload.data.find((row) => String(row[categoryField] ?? '') === categoryValue)
|
|
5385
|
-
: undefined;
|
|
5386
|
-
const sourceRow = usesCanonicalStatsRows
|
|
5387
|
-
? payload.data[categoryIndex]
|
|
5388
|
-
: fallbackSourceRow;
|
|
5389
|
-
const data = {
|
|
5390
|
-
...(sourceRow ?? {}),
|
|
5391
|
-
category: categoryValue,
|
|
5475
|
+
localeDictionaries[locale] = {
|
|
5476
|
+
...(localeDictionaries[locale] ?? {}),
|
|
5477
|
+
...dictionary,
|
|
5392
5478
|
};
|
|
5393
|
-
if (categoryField && categoryValue !== undefined) {
|
|
5394
|
-
data[categoryField] = categoryValue;
|
|
5395
|
-
}
|
|
5396
|
-
payload.onPointClick?.({
|
|
5397
|
-
chartId: payload.config.id,
|
|
5398
|
-
category: categoryValue,
|
|
5399
|
-
data,
|
|
5400
|
-
});
|
|
5401
|
-
}
|
|
5402
|
-
isDuplicateGridClick(signature) {
|
|
5403
|
-
const now = Date.now();
|
|
5404
|
-
const duplicate = this.lastGridClick?.signature === signature
|
|
5405
|
-
&& now - this.lastGridClick.at < 80;
|
|
5406
|
-
this.lastGridClick = { signature, at: now };
|
|
5407
|
-
return duplicate;
|
|
5408
5479
|
}
|
|
5409
|
-
|
|
5410
|
-
|
|
5480
|
+
return {
|
|
5481
|
+
locale: options.locale,
|
|
5482
|
+
fallbackLocale: options.fallbackLocale ?? 'pt-BR',
|
|
5483
|
+
namespaces: {
|
|
5484
|
+
charts: localeDictionaries,
|
|
5485
|
+
},
|
|
5486
|
+
};
|
|
5411
5487
|
}
|
|
5412
|
-
|
|
5413
|
-
|
|
5414
|
-
|
|
5415
|
-
|
|
5416
|
-
|
|
5488
|
+
function providePraxisChartsI18n(options = {}) {
|
|
5489
|
+
return [
|
|
5490
|
+
{
|
|
5491
|
+
provide: PRAXIS_CHARTS_I18N,
|
|
5492
|
+
useValue: {},
|
|
5493
|
+
},
|
|
5494
|
+
providePraxisI18n(createPraxisChartsI18nConfig(options)),
|
|
5495
|
+
];
|
|
5417
5496
|
}
|
|
5418
|
-
function
|
|
5419
|
-
if (
|
|
5420
|
-
return
|
|
5421
|
-
}
|
|
5422
|
-
if (value && typeof value === 'object' && 'value' in value) {
|
|
5423
|
-
return pointValue(value.value);
|
|
5497
|
+
function resolvePraxisChartsText(value, fallback) {
|
|
5498
|
+
if (typeof value === 'string') {
|
|
5499
|
+
return { text: value };
|
|
5424
5500
|
}
|
|
5425
|
-
|
|
5426
|
-
}
|
|
5427
|
-
function pointData(category, value) {
|
|
5428
|
-
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
5501
|
+
if (value?.key || value?.text) {
|
|
5429
5502
|
return value;
|
|
5430
5503
|
}
|
|
5431
|
-
return {
|
|
5432
|
-
category,
|
|
5433
|
-
value: pointValue(value),
|
|
5434
|
-
};
|
|
5504
|
+
return { text: fallback ?? '' };
|
|
5435
5505
|
}
|
|
5436
5506
|
|
|
5437
5507
|
class ChartEditorDefaultsService {
|
|
@@ -8836,7 +8906,7 @@ const PRAXIS_ANALYTICS_PRESENTATION_COMPONENT_METADATA = {
|
|
|
8836
8906
|
friendlyName: 'Apresentação analítica governada',
|
|
8837
8907
|
description: 'Alterna renderers elegíveis para uma projection x-ui.analytics selecionada por id, preservando o query context.',
|
|
8838
8908
|
icon: 'monitoring',
|
|
8839
|
-
tags: ['analytics', 'chart', 'table', 'projection', 'dashboard'],
|
|
8909
|
+
tags: ['analytics', 'chart', 'table', 'kpi', 'projection', 'dashboard'],
|
|
8840
8910
|
lib: '@praxisui/charts',
|
|
8841
8911
|
authoringManifestRef: {
|
|
8842
8912
|
componentId: 'praxis-analytics-presentation',
|
|
@@ -8857,14 +8927,14 @@ const PRAXIS_ANALYTICS_PRESENTATION_COMPONENT_METADATA = {
|
|
|
8857
8927
|
primaryDimension: { field: 'category', role: 'category', label: 'Categoria' },
|
|
8858
8928
|
primaryMetrics: [{ field: 'value', aggregation: 'sum', label: 'Valor' }],
|
|
8859
8929
|
},
|
|
8860
|
-
presentationHints: { preferredFamilies: ['chart', 'analytic-table'] },
|
|
8930
|
+
presentationHints: { preferredFamilies: ['chart', 'analytic-table', 'kpi'] },
|
|
8861
8931
|
}],
|
|
8862
8932
|
},
|
|
8863
8933
|
},
|
|
8864
8934
|
{ name: 'projectionId', type: 'string', description: 'Identidade exata da projection; labels não são usados para seleção.', default: 'analytics-presentation-sample' },
|
|
8865
|
-
{ name: 'availableFamilies', type: 'AnalyticsPresentationFamily[]', description: 'Famílias autorizadas após capabilities e renderers instalados.', default: ['chart', 'analytic-table'] },
|
|
8935
|
+
{ name: 'availableFamilies', type: 'AnalyticsPresentationFamily[]', description: 'Famílias autorizadas após capabilities e renderers instalados.', default: ['chart', 'analytic-table', 'kpi'] },
|
|
8866
8936
|
{ name: 'preferredFamily', type: 'AnalyticsPresentationFamily | null', description: 'Preferência persistida pelo host; a escolha temporária do usuário tem precedência.', default: null },
|
|
8867
|
-
{ name: 'queryContext', type: 'PraxisDataQueryContext | null', description: 'Contexto governado compartilhado por chart
|
|
8937
|
+
{ name: 'queryContext', type: 'PraxisDataQueryContext | null', description: 'Contexto governado compartilhado por chart, analytic-table e KPI.', default: null },
|
|
8868
8938
|
{ name: 'title', type: 'PraxisTextValue', description: 'Título compartilhado pelos renderers.' },
|
|
8869
8939
|
{ name: 'subtitle', type: 'PraxisTextValue', description: 'Subtítulo compartilhado pelos renderers.' },
|
|
8870
8940
|
{ name: 'enableCustomization', type: 'boolean', description: 'Habilita authoring interno do chart quando aplicável.', default: false },
|
|
@@ -10253,7 +10323,7 @@ class PraxisChartCompositionShowcaseComponent {
|
|
|
10253
10323
|
</article>
|
|
10254
10324
|
</div>
|
|
10255
10325
|
</section>
|
|
10256
|
-
`, isInline: true, styles: [":host{display:block}.showcase-shell{display:grid;gap:24px}.showcase-hero{display:grid;gap:20px;padding:28px;border-radius:28px;background:radial-gradient(circle at top right,rgba(18,99,180,.18),transparent 30%),linear-gradient(135deg,#071836f2,#1263b4c7);color:#f7fbff}.showcase-copy h2{margin:0 0 10px;font-size:clamp(1.8rem,3vw,2.6rem);line-height:1.05}.showcase-copy p{margin:0;max-width:52rem;color:#f7fbffe0}.showcase-eyebrow,.panel-kicker{margin:0 0 8px;font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:#f7fbffb8}.showcase-controls{display:flex;flex-wrap:wrap;gap:16px}.control-group{display:grid;gap:8px}.control-group span{font-size:.84rem;color:#f7fbffc2}.control-buttons{display:flex;flex-wrap:wrap;gap:8px}.control-buttons button{border:1px solid rgba(247,251,255,.22);background:#f7fbff14;color:#f7fbff;border-radius:999px;padding:10px 14px;cursor:pointer;transition:background .16s ease,transform .16s ease}.control-buttons button.active{background:#f7fbff;color:#0d2d5f}.showcase-grid{display:grid;gap:20px;grid-template-columns:minmax(0,1.3fr) minmax(320px,.9fr)}.runtime-panel,.payload-panel{display:grid;gap:16px;padding:20px;border-radius:24px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline, #c5c7ce) 76%,transparent);background:linear-gradient(180deg,#fffffff0,#f4f7fbf5)}.panel-header{display:flex;align-items:start;justify-content:space-between;gap:12px}.panel-header h3{margin:0;color:#142033}.panel-caption{margin:6px 0 0;color:#516074;font-size:.88rem;line-height:1.45}.panel-chip{border-radius:999px;padding:6px 10px;font-size:.76rem;background:#1263b41f;color:#1263b4}.payload-panel pre{margin:0;padding:16px;border-radius:18px;background:#09111f;color:#d7e6ff;overflow:auto;font-size:.84rem;line-height:1.5}@media(max-width:1080px){.showcase-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
10326
|
+
`, isInline: true, styles: [":host{display:block}.showcase-shell{display:grid;gap:24px}.showcase-hero{display:grid;gap:20px;padding:28px;border-radius:28px;background:radial-gradient(circle at top right,rgba(18,99,180,.18),transparent 30%),linear-gradient(135deg,#071836f2,#1263b4c7);color:#f7fbff}.showcase-copy h2{margin:0 0 10px;font-size:clamp(1.8rem,3vw,2.6rem);line-height:1.05}.showcase-copy p{margin:0;max-width:52rem;color:#f7fbffe0}.showcase-eyebrow,.panel-kicker{margin:0 0 8px;font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:#f7fbffb8}.showcase-controls{display:flex;flex-wrap:wrap;gap:16px}.control-group{display:grid;gap:8px}.control-group span{font-size:.84rem;color:#f7fbffc2}.control-buttons{display:flex;flex-wrap:wrap;gap:8px}.control-buttons button{border:1px solid rgba(247,251,255,.22);background:#f7fbff14;color:#f7fbff;border-radius:999px;padding:10px 14px;cursor:pointer;transition:background .16s ease,transform .16s ease}.control-buttons button.active{background:#f7fbff;color:#0d2d5f}.showcase-grid{display:grid;gap:20px;grid-template-columns:minmax(0,1.3fr) minmax(320px,.9fr)}.runtime-panel,.payload-panel{display:grid;gap:16px;padding:20px;border-radius:24px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline, #c5c7ce) 76%,transparent);background:linear-gradient(180deg,#fffffff0,#f4f7fbf5)}.panel-header{display:flex;align-items:start;justify-content:space-between;gap:12px}.panel-header h3{margin:0;color:#142033}.panel-caption{margin:6px 0 0;color:#516074;font-size:.88rem;line-height:1.45}.panel-chip{border-radius:999px;padding:6px 10px;font-size:.76rem;background:#1263b41f;color:#1263b4}.payload-panel pre{margin:0;padding:16px;border-radius:18px;background:#09111f;color:#d7e6ff;overflow:auto;font-size:.84rem;line-height:1.5}@media(max-width:1080px){.showcase-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
10257
10327
|
}
|
|
10258
10328
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisChartCompositionShowcaseComponent, decorators: [{
|
|
10259
10329
|
type: Component,
|
|
@@ -10867,7 +10937,7 @@ const PRAXIS_ANALYTICS_PRESENTATION_AUTHORING_MANIFEST = {
|
|
|
10867
10937
|
{ name: 'analytics', type: 'PraxisXUiAnalytics', description: 'Canonical x-ui.analytics projections.' },
|
|
10868
10938
|
{ name: 'projectionId', type: 'string', description: 'Stable projection identity; labels never select projections.' },
|
|
10869
10939
|
{ name: 'availableFamilies', type: 'AnalyticsPresentationFamily[]', description: 'Capability- and host-authorized renderer families.' },
|
|
10870
|
-
{ name: 'preferredFamily', type: 'AnalyticsPresentationFamily | null', allowedValues: ['chart', 'analytic-table'], description: 'Persisted host preference. Temporary user choice remains runtime-only.' },
|
|
10940
|
+
{ name: 'preferredFamily', type: 'AnalyticsPresentationFamily | null', allowedValues: ['chart', 'analytic-table', 'kpi'], description: 'Persisted host preference. Temporary user choice remains runtime-only.' },
|
|
10871
10941
|
{ name: 'queryContext', type: 'PraxisDataQueryContext | null', description: 'Shared governed query context forwarded to the selected renderer.' },
|
|
10872
10942
|
],
|
|
10873
10943
|
editableTargets: [
|
|
@@ -10894,7 +10964,7 @@ const PRAXIS_ANALYTICS_PRESENTATION_AUTHORING_MANIFEST = {
|
|
|
10894
10964
|
type: 'object',
|
|
10895
10965
|
additionalProperties: false,
|
|
10896
10966
|
required: ['family'],
|
|
10897
|
-
properties: { family: { enum: ['chart', 'analytic-table'] } },
|
|
10967
|
+
properties: { family: { enum: ['chart', 'analytic-table', 'kpi'] } },
|
|
10898
10968
|
},
|
|
10899
10969
|
effects: [{ kind: 'set-value', path: 'preferredFamily', inputPath: 'family' }],
|
|
10900
10970
|
destructive: false,
|
|
@@ -10926,7 +10996,7 @@ const PRAXIS_ANALYTICS_PRESENTATION_AUTHORING_MANIFEST = {
|
|
|
10926
10996
|
targetKind: 'analyticsPresentationPreference',
|
|
10927
10997
|
category: 'analytics-renderer',
|
|
10928
10998
|
description: 'Compatible presentation families resolved from the canonical projection and installed renderers.',
|
|
10929
|
-
options: ['chart', 'analytic-table'],
|
|
10999
|
+
options: ['chart', 'analytic-table', 'kpi'],
|
|
10930
11000
|
appliesToTypes: ['PraxisXUiAnalytics'],
|
|
10931
11001
|
unknownCompatible: false,
|
|
10932
11002
|
},
|
|
@@ -10941,10 +11011,17 @@ const PRAXIS_ANALYTICS_PRESENTATION_AUTHORING_MANIFEST = {
|
|
|
10941
11011
|
isPositive: true,
|
|
10942
11012
|
},
|
|
10943
11013
|
{
|
|
10944
|
-
id: '
|
|
10945
|
-
request: 'Use KPI
|
|
11014
|
+
id: 'prefer-kpi',
|
|
11015
|
+
request: 'Use the KPI presentation for projection supplier-procurement-funnel.',
|
|
10946
11016
|
operationId: 'analytics.presentation.prefer-family',
|
|
10947
11017
|
params: { family: 'kpi' },
|
|
11018
|
+
isPositive: true,
|
|
11019
|
+
},
|
|
11020
|
+
{
|
|
11021
|
+
id: 'reject-summary-list-without-renderer',
|
|
11022
|
+
request: 'Use summary-list even though no summary-list renderer is installed.',
|
|
11023
|
+
operationId: 'analytics.presentation.prefer-family',
|
|
11024
|
+
params: { family: 'summary-list' },
|
|
10948
11025
|
isPositive: false,
|
|
10949
11026
|
},
|
|
10950
11027
|
],
|