@masterteam/dashboard-builder 0.0.27 → 0.0.29

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.
@@ -1,19 +1,19 @@
1
1
  import * as _masterteam_dashboard_builder from '@masterteam/dashboard-builder';
2
2
  import * as _angular_core from '@angular/core';
3
- import { OnInit, OnDestroy, AfterViewInit, OnChanges, SimpleChanges, TemplateRef, PipeTransform } from '@angular/core';
3
+ import { OnInit, OnDestroy, ElementRef, AfterViewInit, OnChanges, SimpleChanges, TemplateRef, PipeTransform } from '@angular/core';
4
4
  import { GridsterItem, GridsterConfig } from 'angular-gridster2';
5
5
  import { ContextMenu } from 'primeng/contextmenu';
6
6
  import { MenuItem } from 'primeng/api';
7
+ import { MTMenuItem } from '@masterteam/components/menu';
7
8
  import * as _angular_forms from '@angular/forms';
8
9
  import { ControlValueAccessor, FormGroup, FormArray, ValidationErrors } from '@angular/forms';
9
- import { EntityData as EntityData$1 } from '@masterteam/components/entities';
10
10
  import { MTIcon } from '@masterteam/icons';
11
+ import { EntityData as EntityData$1 } from '@masterteam/components/entities';
11
12
  import * as rxjs from 'rxjs';
12
13
  import { Observable } from 'rxjs';
13
14
  import { ColumnDef, TableAction } from '@masterteam/components/table';
14
15
  import { ModalService } from '@masterteam/components/modal';
15
16
  import { ModalRef } from '@masterteam/components/dialog';
16
- import { MTMenuItem } from '@masterteam/components/menu';
17
17
 
18
18
  /**
19
19
  * Localized name with English and Arabic
@@ -475,6 +475,1378 @@ interface CustomApi {
475
475
  params?: Record<string, any>;
476
476
  }
477
477
 
478
+ /**
479
+ * Action emitted from the kebab menu. The host (`dashboard-builder`)
480
+ * routes each id to a single concrete owner (ManageItem, ChartSettingsDrawer,
481
+ * ChartFilterDrawer, inline title input, or destructive action).
482
+ */
483
+ type ItemCardMenuAction = {
484
+ type: 'configure-datasource';
485
+ } | {
486
+ type: 'style';
487
+ } | {
488
+ type: 'filters';
489
+ } | {
490
+ type: 'edit-title';
491
+ } | {
492
+ type: 'duplicate';
493
+ } | {
494
+ type: 'delete';
495
+ } | {
496
+ type: 'dialog-open';
497
+ } | {
498
+ type: 'dialog-edit';
499
+ } | {
500
+ type: 'dialog-remove';
501
+ };
502
+ declare class ItemCardMenuComponent {
503
+ private readonly transloco;
504
+ /** Whether to allow duplicate (excluded for layout/group widgets). */
505
+ readonly allowDuplicate: _angular_core.InputSignal<boolean>;
506
+ /** Whether the chart has a linked dialog already. */
507
+ readonly hasLinkedDialog: _angular_core.InputSignal<boolean>;
508
+ /** Whether the chart supports adding a linked dialog. */
509
+ readonly canLinkDialog: _angular_core.InputSignal<boolean>;
510
+ /** Action emitter — host wires each id to a single concrete owner. */
511
+ readonly action: _angular_core.OutputEmitterRef<ItemCardMenuAction>;
512
+ /**
513
+ * Build the menu model. Six primary entries plus optional dialog entries
514
+ * when the chart has (or supports) a linked dialog. Each menu item carries
515
+ * a stable `id` so `onItemSelect` can route deterministically.
516
+ */
517
+ readonly items: _angular_core.Signal<MTMenuItem[]>;
518
+ onItemSelect(item: MTMenuItem): void;
519
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemCardMenuComponent, never>;
520
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ItemCardMenuComponent, "mt-item-card-menu", never, { "allowDuplicate": { "alias": "allowDuplicate"; "required": false; "isSignal": true; }; "hasLinkedDialog": { "alias": "hasLinkedDialog"; "required": false; "isSignal": true; }; "canLinkDialog": { "alias": "canLinkDialog"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
521
+ }
522
+
523
+ /**
524
+ * Chart Capability Registry — types
525
+ *
526
+ * One manifest entry per active chart/widget. Every other layer
527
+ * (chart picker, data-source settings, query/display UI, save/load
528
+ * pipeline, runtime expansion) reads from the manifest instead of
529
+ * branching on serviceType / componentName / functionName.
530
+ */
531
+ /** Backend ChartType enum names that the host BE accepts in execution payloads. */
532
+ type BackendChartType = 'BarChart' | 'PropertiesBarChar' | 'DonutChart' | 'TableChart' | 'SplitterChart' | 'BarStackChart' | 'TimeLine' | 'OverviewCard' | 'TableView' | 'PercentagePieChart' | 'Properties' | 'FormulaBarChart' | 'ComparisonChart' | 'BarV2Chart' | 'PieV2Chart' | 'StackBarV2Chart' | 'CardViewV2Chart' | 'GaugeChart' | 'LineChart' | 'SplitChart' | 'GaugeComponentChart' | 'PropertyCardView';
533
+ type RequestType$1 = 'level' | 'levellog' | 'log' | 'custom' | 'snapShot' | 'levelCards' | 'timelineProjectDependencies' | 'customSplus' | 'phaseGate';
534
+ type QueryEditorKind = 'none' | 'general' | 'table' | 'properties' | 'timeline' | 'timelineMultiLevel' | 'map' | 'splitter' | 'snapshot' | 'phaseGate' | 'repeater';
535
+ type RendererKey = 'chart' | 'map' | 'table' | 'phaseGateTable' | 'timeline' | 'listStatistic' | 'levelCards' | 'properties' | 'entityPreview' | 'performanceCard' | 'performanceGaugeCard' | 'splitter' | 'phaseGateStepper' | 'header' | 'topbar' | 'repeater' | 'group' | 'raw';
536
+ type Product = 'pplus' | 'splus' | 'report';
537
+ /** Generic display schema field key. Open string to allow registry-specific extensions. */
538
+ type DisplayField = string;
539
+ /** Generic query schema field key. */
540
+ type QueryField = 'valueProperty' | 'aggregateFunction' | 'groupByProperties' | 'autoStack' | 'stackProperties' | 'autoStackByProperty' | 'categoryProperty' | 'color' | 'formula' | 'filters' | 'extraProperties' | 'showAdvancedSettings' | 'barType';
541
+ interface QuerySchema {
542
+ /** Visible chart-specific fields (subset of QueryField, in chosen order). */
543
+ fields: QueryField[];
544
+ /** Required fields before save. */
545
+ required: QueryField[];
546
+ }
547
+ interface DisplaySchema {
548
+ /** Visible display-config fields. */
549
+ fields: DisplayField[];
550
+ }
551
+ interface ChartCapabilityLegacyAliases {
552
+ /** Old chart ids that should resolve to this manifest entry. */
553
+ ids?: string[];
554
+ /** Legacy serviceType strings (e.g., `splitChart`). */
555
+ serviceTypes?: string[];
556
+ /** Legacy componentName strings (e.g., `listOfLevelCards`). */
557
+ componentNames?: string[];
558
+ /** Legacy functionName strings (e.g., `handleTableChart`). */
559
+ functionNames?: string[];
560
+ }
561
+ interface ChartCapability {
562
+ /** Stable chart id used by the palette and saved dashboards. */
563
+ id: string;
564
+ /** Human-readable label. */
565
+ name: string;
566
+ /** Icon key from the new FE icon system. */
567
+ icon: string;
568
+ /** Group in the chart palette. */
569
+ category: 'chart' | 'card' | 'table' | 'special' | 'layout';
570
+ /** Products this widget is exposed in. */
571
+ products: Product[];
572
+ /** Hide from picker but allow legacy edit. */
573
+ hideInList?: boolean;
574
+ /** Whether the chart needs the manage-item drawer. */
575
+ hasManageItem: boolean;
576
+ /** Default grid size when added. */
577
+ defaultSize?: {
578
+ cols: number;
579
+ rows: number;
580
+ };
581
+ /** Stored serviceConfig.chartType (FE-side). May differ from backend enum. */
582
+ serviceType: string;
583
+ /** Stored clientConfig.componentName. */
584
+ componentName: string;
585
+ /** Stored clientConfig.functionName. */
586
+ functionName: string;
587
+ /** Stored clientConfig.requestType. */
588
+ requestType?: RequestType$1;
589
+ /** Backend ChartType enum that this widget should be sent as during execution. */
590
+ backendChartType?: BackendChartType;
591
+ /** Renderer key for the dashboard-item switch. */
592
+ renderer: RendererKey;
593
+ /** Capability flags driving UX visibility. */
594
+ selection: {
595
+ /** Whether the selection block is shown. */
596
+ visible: boolean;
597
+ /** Whether multiple selections are allowed. */
598
+ allowMultiple: boolean;
599
+ };
600
+ supportsSourceLinks: boolean;
601
+ supportsCustomApi: boolean;
602
+ supportsGroupByMultiple: boolean;
603
+ supportsRepeater?: boolean;
604
+ /** Query editor and schema. */
605
+ query: {
606
+ editor: QueryEditorKind;
607
+ schema?: QuerySchema;
608
+ };
609
+ /** Display schema. */
610
+ display: DisplaySchema;
611
+ /** Legacy aliases honored by the legacy adapter when resolving manifests. */
612
+ legacyAliases?: ChartCapabilityLegacyAliases;
613
+ }
614
+ /** Minimum shape needed to resolve a manifest from a saved config. */
615
+ interface ConfigLookupShape {
616
+ serviceConfig?: {
617
+ chartType?: string | null;
618
+ [k: string]: unknown;
619
+ };
620
+ clientConfig?: {
621
+ componentName?: string | null;
622
+ functionName?: string | null;
623
+ [k: string]: unknown;
624
+ };
625
+ /** When known, provided directly by the chart picker. */
626
+ chartTypeId?: string | null;
627
+ }
628
+
629
+ /**
630
+ * Chart Capability Registry — manifest data.
631
+ *
632
+ * Each entry is the single source of truth for a chart/widget. Consumers:
633
+ * - widget-palette / chart picker
634
+ * - manage-item DataSourceSettings
635
+ * - GeneralQuery / TableQuery / etc. visibility rules
636
+ * - DisplaySettings
637
+ * - chart-data.service request handler resolution
638
+ * - dashboard-item renderer key
639
+ * - save / load / request normalization
640
+ */
641
+
642
+ declare const CHART_CAPABILITIES: ChartCapability[];
643
+ /** Lookup by stable id. */
644
+ declare function getCapabilityById(id: string | null | undefined): ChartCapability | null;
645
+ /**
646
+ * Resolve a manifest entry from a saved config.
647
+ *
648
+ * Resolution order:
649
+ * 1. chartTypeId (palette / saved field)
650
+ * 2. (serviceType + componentName + functionName) exact key
651
+ * 3. legacyAliases.ids
652
+ * 4. legacyAliases.componentNames + serviceType match
653
+ * 5. legacyAliases.serviceTypes + componentName match
654
+ * 6. legacyAliases.functionNames
655
+ */
656
+ declare function resolveCapability(input: {
657
+ chartTypeId?: string | null;
658
+ serviceType?: string | null;
659
+ componentName?: string | null;
660
+ functionName?: string | null;
661
+ }): ChartCapability | null;
662
+
663
+ /**
664
+ * Chart Type Aliases — single source of truth for backend-safe chart type mapping.
665
+ *
666
+ * BE enum (DashboardBuilder.Shared.ChartType) accepts:
667
+ * BarV2Chart, PieV2Chart, StackBarV2Chart, CardViewV2Chart, GaugeChart,
668
+ * LineChart, SplitChart, PropertyCardView, TableView, Properties, ...
669
+ *
670
+ * Old/new FE may store legacy values such as `LineV2Chart`, `splitChart`,
671
+ * `SplitterChart`, `snapShot`, `phaseGate`, `levelCards`. Special types are
672
+ * never sent to BE chart execution — they go to legacy host endpoints.
673
+ */
674
+
675
+ /**
676
+ * Maps any FE chart type / alias string to a backend-safe ChartType,
677
+ * or returns null when the value is not a backend execution chart type
678
+ * (legacy special types: snapShot, phaseGate, levelCards, header, topbar).
679
+ */
680
+ declare function toBackendChartType(raw: string | null | undefined): BackendChartType | null;
681
+ /**
682
+ * Returns the backend-safe chart type or, when there is no mapping,
683
+ * preserves the original FE value so that legacy/special endpoints still receive it.
684
+ */
685
+ declare function normalizeChartTypeForRequest(raw: string | null | undefined): string;
686
+
687
+ interface AnyConfig {
688
+ serviceConfig?: Record<string, any> | undefined;
689
+ clientConfig?: Record<string, any> | undefined;
690
+ /** Optional grid metadata that the report link DTO expects to keep. */
691
+ [k: string]: any;
692
+ }
693
+ /** Normalize a single filter operation (BE expects `Equals`, never `Equal`). */
694
+ declare function normalizeFilterOperation(op: unknown): unknown;
695
+ /** Normalize an array of filters in place (returns a new array). */
696
+ declare function normalizeFilters(filters: any[] | undefined): any[] | undefined;
697
+ /**
698
+ * Build a backend-safe selector from legacy moduleType / moduleId pair.
699
+ */
700
+ declare function selectorFromLegacy(moduleType: string | null | undefined, moduleId: string | number | null | undefined): string | null;
701
+ /**
702
+ * Extract numeric/string id from `Type:Id` selector. Used by legacy
703
+ * host endpoints (`GetCards/{moduleId}`, `Levels/{levelId}/PhaseGates`)
704
+ * which never accepted a selector.
705
+ */
706
+ declare function moduleIdFromSelector(selector: string | null | undefined): string | null;
707
+ /**
708
+ * Map an FE source-link entry to the backend SourceLink DTO shape.
709
+ *
710
+ * BE: { id, sourceLinkId?, sourceLinkId2?, sourceId1, sourceId2,
711
+ * source1LinkProperty, source2LinkProperty, isFilterLinkage, isLeftJoin }
712
+ */
713
+ declare function toBackendSourceLink(link: any, fallbackId: number): any;
714
+ /**
715
+ * Normalize a config that may be old (moduleType/moduleId, fuctionName,
716
+ * root repeaterDashboardId) into canonical new shape, without losing data.
717
+ *
718
+ * Pure: returns a new object.
719
+ */
720
+ declare function normalizeOnLoad(config: AnyConfig | null | undefined): AnyConfig;
721
+ /**
722
+ * Normalize before a chart link / report save.
723
+ *
724
+ * Strips runtime/UI-only fields and converts to canonical names.
725
+ */
726
+ declare function normalizeBeforeSave(config: AnyConfig | null | undefined): AnyConfig;
727
+ /**
728
+ * Normalize before a chart execution request.
729
+ *
730
+ * - Maps chart type to BE-safe enum (LineV2Chart→LineChart, etc).
731
+ * - Returns a new ServiceConfig-like payload that filter handling can be
732
+ * layered on top of.
733
+ *
734
+ * The actual filter substitution happens in handleFiltersForCustom, which
735
+ * stays a single function and is consistent across services.
736
+ */
737
+ declare function normalizeBeforeRequest(serviceConfig: Record<string, any> | null | undefined): Record<string, any>;
738
+
739
+ /**
740
+ * Config Domain Registry (Pass 3).
741
+ *
742
+ * The dashboard-builder configuration is split into separate **domains** so
743
+ * the contextual popover can render compact, focused controls without leaking
744
+ * cross-domain concerns. The persisted shape (`ItemConfig.serviceConfig` /
745
+ * `ItemConfig.clientConfig`) is **unchanged** — domains are thin facets that
746
+ * read and write to specific paths.
747
+ *
748
+ * Each domain is keyed by a `ConfigDomainKey` so the popover, validators, and
749
+ * presets can address them uniformly.
750
+ *
751
+ * IMPORTANT: This module is **persistence-neutral**. It does not introduce new
752
+ * BE shapes or new save/load paths. Adapters in `./adapters.*.ts` convert
753
+ * between persisted ItemConfig and small UI view-models per domain.
754
+ */
755
+
756
+ /** Stable identifier for a configuration domain shown in the contextual popover. */
757
+ type ConfigDomainKey = 'title' | 'datasource' | 'fields' | 'filters' | 'style' | 'layout' | 'labelLegendFormat' | 'behavior' | 'advanced';
758
+ /** Top-level tab a domain belongs to in the popover. */
759
+ type PopoverTab = 'data' | 'filters' | 'style' | 'behavior' | 'advanced';
760
+ interface ConfigDomainSpec {
761
+ key: ConfigDomainKey;
762
+ /** Human label key (transloco). Falls back to en string. */
763
+ labelKey: string;
764
+ /** Default English label. */
765
+ label: string;
766
+ /** Icon (mt icon name) shown next to the domain in the popover. */
767
+ icon: string;
768
+ /** Tab in the popover this domain belongs to. */
769
+ tab: PopoverTab;
770
+ /** Whether this domain is shown in the SIMPLE mode by default. */
771
+ simple: boolean;
772
+ /** Whether this domain is shown in ADVANCED mode (drawer). */
773
+ advanced: boolean;
774
+ }
775
+ /**
776
+ * The canonical list of configuration domains. Order is the order of
777
+ * appearance in the popover.
778
+ */
779
+ declare const CONFIG_DOMAINS: readonly ConfigDomainSpec[];
780
+ /** Domains supported by a chart capability (manifest-driven). */
781
+ interface ChartDomainSupport {
782
+ domains: ConfigDomainKey[];
783
+ }
784
+ /**
785
+ * Determine which domains apply to a given chart capability.
786
+ *
787
+ * Layout widgets (header/topbar/group) only support title + style + advanced.
788
+ * Special endpoint widgets (snapshot/phaseGate/repeater) skip filters where
789
+ * filters are not honored. Everything else gets the full domain set.
790
+ *
791
+ * Pure: never mutates the capability.
792
+ */
793
+ declare function domainsForCapability(cap: ChartCapability | null | undefined): ChartDomainSupport;
794
+ /** Find a domain spec by key. */
795
+ declare function findDomain(key: ConfigDomainKey): ConfigDomainSpec | undefined;
796
+ /** All popover tabs. */
797
+ declare const POPOVER_TABS: readonly PopoverTab[];
798
+ interface PopoverTabSpec {
799
+ key: PopoverTab;
800
+ label: string;
801
+ icon: string;
802
+ }
803
+ declare const POPOVER_TAB_SPECS: readonly PopoverTabSpec[];
804
+
805
+ /**
806
+ * Pass 3 Config Models.
807
+ *
808
+ * Three layered views over the same persisted ItemConfig:
809
+ * - PersistedItemConfig — what BE accepts and what we save (= existing
810
+ * `ItemConfig`). Unchanged shape so old dashboards keep loading.
811
+ * - UiItemConfig — domain-bounded view-models the popover/contextual
812
+ * components consume. Friendly fields, validated, no leaked BE keys.
813
+ * - RuntimeItemConfig — what the renderer reads at runtime. Includes
814
+ * transient flags (loading, __substituted, etc.) that are NEVER persisted.
815
+ *
816
+ * Adapters (see `./adapters.*.ts`) translate between layers in both directions.
817
+ * If you ever feel the urge to persist a UI/runtime field, instead extend
818
+ * `PersistedItemConfig` deliberately and add a normalizer entry — DO NOT mutate
819
+ * runtime state into the persisted view.
820
+ */
821
+
822
+ /** Backend-compatible config (alias for the existing ItemConfig). */
823
+ type PersistedItemConfig = ItemConfig;
824
+ /** Friendly title view-model. */
825
+ interface TitleUi {
826
+ title: string;
827
+ /** Subtitle (optional, lives under clientConfig.subtitle). */
828
+ subtitle: string;
829
+ showSubtitle: boolean;
830
+ icon: string;
831
+ iconColor: string;
832
+ iconBackgroundColor: string;
833
+ /** Hold the localized payload to round-trip both languages safely. */
834
+ localizedTitle?: LocalizedName;
835
+ localizedSubtitle?: LocalizedName;
836
+ }
837
+ /** Compact data-source view-model (fields specific to the chart's manifest). */
838
+ interface DatasourceUi {
839
+ /** Top-level chart enum (BarV2Chart, etc.) — read-only in popover. */
840
+ chartType: string;
841
+ /** Number of selections configured. */
842
+ selectionCount: number;
843
+ /** Whether the chart uses a custom API rather than module selection. */
844
+ hasCustomApi: boolean;
845
+ /** Function name (read-only summary). */
846
+ functionName?: string;
847
+ /** Whether at least one selection has a `selector`. */
848
+ hasValidSelection: boolean;
849
+ }
850
+ /** Single field assignment (value/group/category). */
851
+ interface FieldAssignment {
852
+ role: 'value' | 'groupBy' | 'category' | 'property' | 'extra';
853
+ propertyKey: string;
854
+ propertyLabel?: string;
855
+ }
856
+ /** Friendly field assignments derived from `serviceConfig.query`. */
857
+ interface FieldsUi {
858
+ value?: FieldAssignment;
859
+ groupBy: FieldAssignment[];
860
+ category?: FieldAssignment;
861
+ properties: FieldAssignment[];
862
+ extras: FieldAssignment[];
863
+ formula?: string;
864
+ }
865
+ /** Operator that the BE accepts. */
866
+ type FilterOperator = 'Equals' | 'NotEquals' | 'OneOf' | 'Between' | 'Contains' | 'GreaterThan' | 'LessThan' | 'IsNull' | 'IsNotNull';
867
+ /** Where the filter is enforced. */
868
+ type FilterScope = 'chart' | 'page' | 'source' | 'repeater';
869
+ /** Where the filter originated in the persisted shape. */
870
+ type FilterSource = 'static' | 'dynamic' | 'selection' | 'page' | 'repeater';
871
+ interface FilterChip {
872
+ /** Stable id within the UI session. */
873
+ id: string;
874
+ scope: FilterScope;
875
+ source: FilterSource;
876
+ propertyKey: string;
877
+ propertyLabel?: string;
878
+ operator: FilterOperator;
879
+ value: unknown;
880
+ /** Dynamic key if scoped to a page placeholder. */
881
+ dynamicKey?: string;
882
+ /** Optional metadata (selectionId, etc.). */
883
+ meta?: Record<string, unknown>;
884
+ /** UI on/off toggle. Persisted. */
885
+ active: boolean;
886
+ }
887
+ interface FiltersUi {
888
+ chips: FilterChip[];
889
+ /** Whether this chart honors page-wide filters (`!ignoreQueryFilter`). */
890
+ honorsPageFilters: boolean;
891
+ }
892
+ interface StyleUi {
893
+ /** Title color override (clientConfig.displayConfig.StyleConfig.color). */
894
+ titleColor: string;
895
+ /** Title font size. */
896
+ titleFontSize: number;
897
+ /** Card background color. */
898
+ backgroundColor: string;
899
+ /** Card border color. */
900
+ borderColor: string;
901
+ /** Subtitle color. */
902
+ subtitleColor: string;
903
+ /** Subtitle font size. */
904
+ subtitleFontSize: number;
905
+ /** Default palette for series colors. */
906
+ paletteColors: string[];
907
+ }
908
+ interface LayoutUi {
909
+ borderRadius: number;
910
+ padding: number;
911
+ shadow: 'none' | 'soft' | 'medium' | 'strong';
912
+ density: 'compact' | 'comfortable' | 'presentation';
913
+ }
914
+ interface LabelLegendFormatUi {
915
+ legendShow: boolean;
916
+ legendPosition: 'top' | 'right' | 'bottom' | 'left';
917
+ legendIconType: 'circle' | 'rect' | 'roundRect' | 'triangle' | 'diamond';
918
+ labelShow: boolean;
919
+ labelPosition: 'inside' | 'outside' | 'top';
920
+ formatType: 'number' | 'currency' | 'percentage';
921
+ formatCurrencyCode?: string;
922
+ formatDecimals?: number;
923
+ }
924
+ interface BehaviorUi {
925
+ filtersBarVisible: boolean;
926
+ cardActions: number;
927
+ /** Whether the per-card refresh button is shown (driven by filterConfig.show). */
928
+ showRefreshButton: boolean;
929
+ }
930
+ interface UiItemConfig {
931
+ title: TitleUi;
932
+ datasource: DatasourceUi;
933
+ fields: FieldsUi;
934
+ filters: FiltersUi;
935
+ style: StyleUi;
936
+ layout: LayoutUi;
937
+ labelLegendFormat: LabelLegendFormatUi;
938
+ behavior: BehaviorUi;
939
+ }
940
+ /**
941
+ * Runtime-only state on a chart item. Never persisted.
942
+ *
943
+ * Builder/viewer track these in component signals or item-store; they are
944
+ * documented here so engineers can reason about which state is volatile.
945
+ */
946
+ interface RuntimeItemConfig {
947
+ /** True while a request is in flight. */
948
+ loading: boolean;
949
+ /** True when the most recent request failed. */
950
+ hasError: boolean;
951
+ /** Last error message. */
952
+ errorMessage?: string;
953
+ /** True when the chart has no datasource and is showing the Configure CTA. */
954
+ needsConfiguration: boolean;
955
+ /** Repeater clone marker (set by repeater-runtime). */
956
+ substituted?: boolean;
957
+ }
958
+ /** A complete view assembly used by the contextual popover. */
959
+ interface ConfigViewAssembly {
960
+ ui: UiItemConfig;
961
+ persisted: PersistedItemConfig;
962
+ runtime: RuntimeItemConfig;
963
+ }
964
+
965
+ declare function titleToUi(persisted: PersistedItemConfig): TitleUi;
966
+ declare function applyTitleToPersisted(persisted: PersistedItemConfig, patch: Partial<TitleUi>, activeLang?: string): PersistedItemConfig;
967
+ declare function datasourceToUi(persisted: PersistedItemConfig): {
968
+ chartType: string;
969
+ selectionCount: any;
970
+ hasCustomApi: boolean;
971
+ functionName: string | undefined;
972
+ hasValidSelection: any;
973
+ };
974
+ declare function fieldsToUi(persisted: PersistedItemConfig): FieldsUi;
975
+ declare function filtersToUi(persisted: PersistedItemConfig): FiltersUi;
976
+ declare function styleToUi(persisted: PersistedItemConfig): StyleUi;
977
+ declare function applyStyleToPersisted(persisted: PersistedItemConfig, patch: Partial<StyleUi>): PersistedItemConfig;
978
+ declare function layoutToUi(persisted: PersistedItemConfig): LayoutUi;
979
+ declare function applyLayoutToPersisted(persisted: PersistedItemConfig, patch: Partial<LayoutUi>): PersistedItemConfig;
980
+ declare function labelLegendFormatToUi(persisted: PersistedItemConfig): LabelLegendFormatUi;
981
+ declare function applyLabelLegendFormatToPersisted(persisted: PersistedItemConfig, patch: Partial<LabelLegendFormatUi>): PersistedItemConfig;
982
+ declare function behaviorToUi(persisted: PersistedItemConfig): BehaviorUi;
983
+ declare function applyBehaviorToPersisted(persisted: PersistedItemConfig, patch: Partial<BehaviorUi>): PersistedItemConfig;
984
+ /**
985
+ * Apply chip edits back to the persisted shape. Replaces the chart-local
986
+ * staticFilters block in full (chips of source 'static') and updates dynamic
987
+ * filter active/operator hints. Selection-source chips are read-only here —
988
+ * those flow through DataSourceSettings advanced.
989
+ */
990
+ declare function applyFilterChipsToPersisted(persisted: PersistedItemConfig, chips: FilterChip[]): PersistedItemConfig;
991
+ declare function persistedToUi(persisted: PersistedItemConfig): UiItemConfig;
992
+ declare function buildAssembly(persisted: PersistedItemConfig, runtime: RuntimeItemConfig): ConfigViewAssembly;
993
+
994
+ /**
995
+ * Pass 3 Config Presets.
996
+ *
997
+ * Sensible defaults per chart capability for the contextual popover. These
998
+ * are *defaults* the popover applies when the user picks a preset; they
999
+ * never overwrite previously saved values silently.
1000
+ *
1001
+ * Presets are persisted using the same paths the manual controls use, so
1002
+ * applying a preset is functionally equivalent to a user-made config.
1003
+ */
1004
+
1005
+ type StylePresetKey = 'compact' | 'standard' | 'presentation' | 'kpi-card' | 'table-dense' | 'table-comfortable';
1006
+ interface StylePreset {
1007
+ key: StylePresetKey;
1008
+ label: string;
1009
+ description: string;
1010
+ layout: Partial<LayoutUi>;
1011
+ style: Partial<StyleUi>;
1012
+ labelLegendFormat: Partial<LabelLegendFormatUi>;
1013
+ }
1014
+ declare const STYLE_PRESETS: readonly StylePreset[];
1015
+ /**
1016
+ * Recommend the relevant presets for a chart capability — table presets only
1017
+ * for tables, KPI presets only for cards. The popover surfaces this list.
1018
+ */
1019
+ declare function presetsForCapability(cap: ChartCapability | null | undefined): readonly StylePreset[];
1020
+ declare function findPreset(key: StylePresetKey): StylePreset | undefined;
1021
+
1022
+ /**
1023
+ * Pass 3 Config Validators.
1024
+ *
1025
+ * Domain-aware validation for the contextual popover and Save flow. Each
1026
+ * validator returns a flat array of `ValidationIssue` so the popover can
1027
+ * surface them next to the right control.
1028
+ *
1029
+ * Validators are read-only — they never mutate the input. They DO honor
1030
+ * the manifest schema (`capability.query.schema.required`) so a chart can
1031
+ * declare which fields must be present before save is allowed.
1032
+ */
1033
+
1034
+ type ValidationSeverity = 'error' | 'warning' | 'info';
1035
+ interface ValidationIssue {
1036
+ domain: ConfigDomainKey;
1037
+ severity: ValidationSeverity;
1038
+ /** Stable code for tests / i18n. */
1039
+ code: string;
1040
+ /** Human message. */
1041
+ message: string;
1042
+ /** Optional dotted path to the persisted field for focusing. */
1043
+ path?: string;
1044
+ }
1045
+ interface ValidateOptions {
1046
+ capability?: ChartCapability | null;
1047
+ filterChips?: FilterChip[];
1048
+ }
1049
+ declare function validate(persisted: PersistedItemConfig, options?: ValidateOptions): ValidationIssue[];
1050
+ declare function hasBlockingIssues(issues: ValidationIssue[]): boolean;
1051
+ declare function groupIssuesByDomain(issues: ValidationIssue[]): Record<ConfigDomainKey, ValidationIssue[]>;
1052
+
1053
+ /**
1054
+ * Pass 3 Advanced Config Bridge.
1055
+ *
1056
+ * Centralized JSON merge helpers used by the Advanced tab in the contextual
1057
+ * popover and by the existing `chart-settings-drawer` Advanced JSON editor.
1058
+ *
1059
+ * Responsibilities:
1060
+ * - Parse a JSON draft, return either a typed value or a friendly error.
1061
+ * - Deep-merge a parsed object into the existing clientConfig (keeping
1062
+ * nested keys intact unless explicitly overridden).
1063
+ * - Never persist invalid JSON; never accept a top-level array or scalar.
1064
+ */
1065
+ type ParseResult = {
1066
+ ok: true;
1067
+ value: Record<string, unknown>;
1068
+ } | {
1069
+ ok: false;
1070
+ error: string;
1071
+ };
1072
+ declare function parseAdvancedJson(draft: string): ParseResult;
1073
+ /**
1074
+ * Deep-merge `source` into `target`. Arrays and primitives in source REPLACE
1075
+ * the target value; nested plain objects are merged recursively.
1076
+ *
1077
+ * Pure: returns a new object.
1078
+ */
1079
+ declare function deepMerge(target: Record<string, any> | null | undefined, source: Record<string, any> | null | undefined): Record<string, any>;
1080
+ /** Convert a typed value to a pretty-printed JSON string for editor use. */
1081
+ declare function formatForEditor(value: unknown): string;
1082
+
1083
+ /**
1084
+ * Pass 4 — Control Schema Types
1085
+ *
1086
+ * Schema-driven control generator. Every supported chart/item type declares a
1087
+ * `ControlSchema` (or inherits one) describing the controls it exposes in the
1088
+ * contextual popover. A single generic renderer (`SchemaControlRendererComponent`)
1089
+ * walks the schema, reads from `PersistedItemConfig` via the field's `path`,
1090
+ * and emits patches that the host applies through the existing adapters.
1091
+ *
1092
+ * Why schema instead of one component per chart:
1093
+ * - 27+ existing chart/item types share most of their controls.
1094
+ * - One renderer keeps UX consistent and avoids component sprawl.
1095
+ * - Adding a control to a chart is a one-line registry change.
1096
+ * - Coverage is verifiable from data.
1097
+ *
1098
+ * The schema does NOT replace the persisted shape. The generic renderer reads
1099
+ * and writes the same paths the renderer-handler consumes, so a control added
1100
+ * to the schema affects rendering through the existing pipeline.
1101
+ */
1102
+
1103
+ /** Canonical control field types the generic renderer can render. */
1104
+ type ControlFieldType = 'text' | 'multilineText' | 'number' | 'boolean' | 'color' | 'select' | 'multiselect' | 'iconPicker' | 'palette' | 'json' | 'numberRange' | 'cssDimension';
1105
+ /** Where the control lives in the popover. */
1106
+ type ControlSectionScope = 'simple' | 'advanced';
1107
+ /** Domain bucket — used by the popover to group controls and validation. */
1108
+ type ControlDomain = 'title' | 'header' | 'style' | 'layout' | 'labelLegendFormat' | 'behavior' | 'chart' | 'table' | 'card' | 'gauge' | 'timeline' | 'map' | 'entity' | 'levelCards' | 'splitter' | 'snapshot' | 'phaseGate' | 'repeater' | 'advanced';
1109
+ /** A select option. Static list (or capability-derived if dynamic). */
1110
+ interface ControlOption {
1111
+ label: string;
1112
+ value: string | number | boolean;
1113
+ /** Optional icon name. */
1114
+ icon?: string;
1115
+ /** Optional tooltip / description. */
1116
+ hint?: string;
1117
+ }
1118
+ /** Predicate signature for visibleWhen. */
1119
+ type ControlVisiblePredicate = (cfg: PersistedItemConfig, cap: ChartCapability | null) => boolean;
1120
+ /**
1121
+ * One controllable field in the schema.
1122
+ *
1123
+ * `path` is a dotted accessor over `PersistedItemConfig` — e.g.
1124
+ * `clientConfig.displayConfig.StyleConfig.color` or `serviceConfig.query.valueProperty`.
1125
+ * Read/write helpers in `control-schema.access.ts` use it to translate between
1126
+ * the schema and the persisted shape so renderers continue to consume the
1127
+ * same paths.
1128
+ */
1129
+ interface ControlField {
1130
+ /** Stable id for tests, telemetry, validation routing. */
1131
+ key: string;
1132
+ /** Human label (English fallback). */
1133
+ label: string;
1134
+ /** Optional helper text shown under the control. */
1135
+ description?: string;
1136
+ /** Renderer kind. */
1137
+ type: ControlFieldType;
1138
+ /** Persisted dotted path (read/write target). */
1139
+ path: string;
1140
+ /**
1141
+ * Default value applied when the field is missing on the persisted shape.
1142
+ * The default is *only* read for display — it is never silently written.
1143
+ */
1144
+ default?: unknown;
1145
+ /** Min/max for numeric inputs. */
1146
+ min?: number;
1147
+ max?: number;
1148
+ /** Step for numeric inputs. */
1149
+ step?: number;
1150
+ /** Static options for select/multiselect. */
1151
+ options?: ControlOption[];
1152
+ /**
1153
+ * Dynamic options provider — receives the capability and the persisted
1154
+ * config and returns options derived from the dashboard model (e.g. the
1155
+ * list of selected properties for a value-field picker).
1156
+ */
1157
+ optionsFrom?: (cfg: PersistedItemConfig, cap: ChartCapability | null) => ControlOption[];
1158
+ /** Whether the control is shown only in advanced mode. */
1159
+ scope?: ControlSectionScope;
1160
+ /** Whether the control is required for save. */
1161
+ required?: boolean;
1162
+ /** Hide the control unless the predicate returns true. */
1163
+ visibleWhen?: ControlVisiblePredicate;
1164
+ /** Optional placeholder text. */
1165
+ placeholder?: string;
1166
+ }
1167
+ /** A logical group of fields in the popover. */
1168
+ interface ControlSection {
1169
+ /** Stable id for the section. */
1170
+ key: string;
1171
+ /** Human label (English fallback). */
1172
+ label: string;
1173
+ /** Icon (mt icon) shown in the section header. */
1174
+ icon: string;
1175
+ /** Domain grouping (used by validators and the popover). */
1176
+ domain: ControlDomain;
1177
+ /** Default scope — fields can override per-field. */
1178
+ scope: ControlSectionScope;
1179
+ /** Optional helper paragraph at the top of the section. */
1180
+ description?: string;
1181
+ /** Hide the section unless the predicate returns true. */
1182
+ visibleWhen?: ControlVisiblePredicate;
1183
+ /** Fields in display order. */
1184
+ fields: ControlField[];
1185
+ }
1186
+ /**
1187
+ * Complete schema for a chart/item type.
1188
+ *
1189
+ * - `id` matches a `ChartCapability.id`.
1190
+ * - `extends` lets a chart inherit common sections.
1191
+ * - `sections` are merged with parent — duplicate `key`s in the child override
1192
+ * the parent (NOT a shallow merge of fields; each section is replaced atomically).
1193
+ */
1194
+ interface ControlSchema {
1195
+ /** Capability id this schema belongs to. */
1196
+ id: string;
1197
+ /** Short name for documentation/coverage matrices. */
1198
+ name: string;
1199
+ /** Optional parent schema id (for inheritance). */
1200
+ extends?: string;
1201
+ /** Section list. */
1202
+ sections: ControlSection[];
1203
+ }
1204
+ /**
1205
+ * What the renderer emits when a field changes — the host translates this
1206
+ * patch into a persisted config patch via `applyControlPatchToPersisted`.
1207
+ */
1208
+ interface ControlPatch {
1209
+ /** Field path (matches the `ControlField.path`). */
1210
+ path: string;
1211
+ /** New value (any JSON-serializable). */
1212
+ value: unknown;
1213
+ }
1214
+ /** Convenience: a flat (non-grouped) control list — used by coverage checks. */
1215
+ interface FlattenedControl {
1216
+ sectionKey: string;
1217
+ sectionLabel: string;
1218
+ domain: ControlDomain;
1219
+ scope: ControlSectionScope;
1220
+ field: ControlField;
1221
+ }
1222
+
1223
+ /**
1224
+ * Pass 4 - Control Schema Access Helpers
1225
+ *
1226
+ * Pure read/write helpers for the schema-driven control system.
1227
+ *
1228
+ * - readByPath reads a value out of a PersistedItemConfig using a dotted
1229
+ * path (e.g. clientConfig.displayConfig.StyleConfig.color).
1230
+ * - applyControlPatchToPersisted returns a deep-cloned copy of the config
1231
+ * with the value at path set, creating intermediate objects as needed.
1232
+ *
1233
+ * No third-party dependencies - keeps the bundle small and deterministic.
1234
+ */
1235
+
1236
+ declare function readByPath(cfg: PersistedItemConfig | null | undefined, path: string): unknown;
1237
+ declare function setByPath(cfg: PersistedItemConfig, path: string, value: unknown): PersistedItemConfig;
1238
+ declare function applyControlPatchToPersisted(cfg: PersistedItemConfig, patch: ControlPatch): PersistedItemConfig;
1239
+ declare function applyControlPatchesToPersisted(cfg: PersistedItemConfig, patches: ControlPatch[]): PersistedItemConfig;
1240
+
1241
+ /**
1242
+ * Pass 4 - Control Schema Registry
1243
+ *
1244
+ * One ControlSchema per supported chart/item type. Sections are grouped by
1245
+ * domain so the popover can render compact, focused control surfaces.
1246
+ *
1247
+ * Many charts share common controls (title, header, card style, label/legend,
1248
+ * format, palette). Those live in COMMON_SECTION_FACTORIES and are composed
1249
+ * into per-chart schemas, then per-chart schemas add chart-specific sections
1250
+ * (bar settings, pie label center, ring gauge config, table format, etc.).
1251
+ *
1252
+ * IMPORTANT: paths point to the same persisted locations the renderer-handlers
1253
+ * already consume. Adding a control here makes the value editable end-to-end
1254
+ * without changing the renderer or the persistence pipeline.
1255
+ */
1256
+
1257
+ declare function getControlSchema(capabilityId: string | null | undefined): ControlSchema;
1258
+ declare function listControlSchemaIds(): string[];
1259
+ declare function listControlSchemas(): ControlSchema[];
1260
+ declare function getFallbackControlSchema(): ControlSchema;
1261
+ declare function flattenSchema(schema: ControlSchema): {
1262
+ sectionKey: string;
1263
+ sectionLabel: string;
1264
+ fieldKey: string;
1265
+ fieldPath: string;
1266
+ fieldLabel: string;
1267
+ type: ControlField["type"];
1268
+ }[];
1269
+
1270
+ /**
1271
+ * Pass 4 - Display field visibility helper.
1272
+ *
1273
+ * The legacy `DisplaySettings` component used to own a giant in-component map
1274
+ * (`chartTypeFieldsMap`) that listed which display-config fields appear for
1275
+ * each chart type. Adding a chart meant editing the map by hand.
1276
+ *
1277
+ * This helper derives the same visibility set from the manifest
1278
+ * (`ChartCapability.display.fields`) so:
1279
+ * - DisplaySettings does not need to know about every chart type.
1280
+ * - Adding a chart in the manifest automatically gives it the right fields.
1281
+ * - The popover and the legacy drawer share one source of truth.
1282
+ *
1283
+ * Backwards compatibility is preserved by merging the manifest's field set
1284
+ * with the legacy map for charts that still have a hand-curated entry there;
1285
+ * a chart with both is the union (manifest wins on additions).
1286
+ */
1287
+
1288
+ interface DisplayFieldQuery {
1289
+ capabilityId?: string | null;
1290
+ serviceType?: string | null;
1291
+ componentName?: string | null;
1292
+ }
1293
+ /**
1294
+ * Resolve the visible display-fields list for a chart. Manifest is the
1295
+ * primary source - the legacy hand-curated map only kicks in when the
1296
+ * manifest entry doesn't supply any fields, AND it gets unioned with the
1297
+ * manifest list otherwise so we never lose hand-tuned entries.
1298
+ */
1299
+ declare function resolveDisplayFields(cap: ChartCapability | null | undefined, query?: DisplayFieldQuery): string[];
1300
+ /**
1301
+ * For a given DisplayFieldQuery, expand the resolved field list into a quick
1302
+ * predicate function. Used by DisplaySettings so it can skip the giant
1303
+ * `shouldShowField` switch and ask the helper instead.
1304
+ */
1305
+ declare function buildDisplayFieldPredicate(cap: ChartCapability | null | undefined, query?: DisplayFieldQuery): (field: string) => boolean;
1306
+
1307
+ /**
1308
+ * Pass 5 — Renderer-Control Binding Metadata.
1309
+ *
1310
+ * One canonical metadata record per chart-type+control combination. The schema
1311
+ * registry, runtime adapters, the renderer-handlers (via `BINDING_LEGACY_READ`)
1312
+ * and the verification script all consult these records so that:
1313
+ *
1314
+ * 1. The path a control writes to is the path the renderer reads from.
1315
+ * 2. Old persisted configs still load (legacy read paths are resolved by
1316
+ * the runtime helper `readBoundValue` so the renderer can prefer a
1317
+ * legacy field if the canonical field is missing — the inverse of how
1318
+ * a fresh popover write would propagate).
1319
+ * 3. Coverage and binding mismatches can be verified statically without
1320
+ * booting the app.
1321
+ *
1322
+ * Each binding records:
1323
+ * - `chartId` : capability id (e.g. `chart-line-chart`).
1324
+ * - `controlId` : matches the schema field key.
1325
+ * - `domain` : same domain bucket the schema section uses.
1326
+ * - `uiPath` : UI-friendly read path used by the popover.
1327
+ * - `persistedPath` : path written by the schema renderer + adapters.
1328
+ * - `runtimePath` : path the runtime adapter exposes (often the
1329
+ * same as persistedPath).
1330
+ * - `rendererReadPaths` : paths the renderer/handler actually consumes
1331
+ * at render time. The first item is the canonical
1332
+ * renderer path; later items are accepted legacy
1333
+ * aliases.
1334
+ * - `legacyPersistPaths` : extra persisted paths that previous passes
1335
+ * wrote to. Migrations and fallbacks consult
1336
+ * these so old configs keep working.
1337
+ * - `valueAdapter` : optional runtime transform (e.g. mapping a
1338
+ * 'horizontal'/'vertical' string to a boolean).
1339
+ * - `simpleOrAdvanced` : popover scope (`simple` | `advanced`).
1340
+ * - `notes` : freeform notes that surface in audit reports.
1341
+ *
1342
+ * The `valueAdapter` is intentionally simple — it never reaches into the rest
1343
+ * of the config — so JSON-only fields and complex nested transforms remain
1344
+ * inside the renderer. This keeps binding metadata declarative.
1345
+ */
1346
+ type BindingScope = 'simple' | 'advanced';
1347
+ interface ControlBindingValueAdapter {
1348
+ /** Transform a UI value into the persisted shape (one-way). */
1349
+ toPersisted?: (uiValue: unknown) => unknown;
1350
+ /** Transform a persisted/runtime value into the UI display value. */
1351
+ fromPersisted?: (persistedValue: unknown) => unknown;
1352
+ }
1353
+ interface ControlBinding {
1354
+ /** Capability id this binding belongs to. */
1355
+ chartId: string;
1356
+ /** Stable id matching a `ControlField.key` in the schema. */
1357
+ controlId: string;
1358
+ /** Domain bucket — mirrors the schema section domain. */
1359
+ domain: string;
1360
+ /** UI display label (same as schema label). */
1361
+ label: string;
1362
+ /** UI read path (popover-side). */
1363
+ uiPath: string;
1364
+ /** Persisted path the schema/popover writes to. */
1365
+ persistedPath: string;
1366
+ /** Runtime adapter exposes this path. Usually identical to persistedPath. */
1367
+ runtimePath: string;
1368
+ /**
1369
+ * Renderer read paths in priority order. The first entry is the canonical
1370
+ * path the renderer prefers when present. Later entries are legacy paths the
1371
+ * renderer also accepts (so old configs still work).
1372
+ */
1373
+ rendererReadPaths: string[];
1374
+ /**
1375
+ * Persisted paths that earlier passes wrote to. Migrations and adapters
1376
+ * consult these so a previously persisted value still loads as-if written
1377
+ * to the canonical persistedPath.
1378
+ */
1379
+ legacyPersistPaths?: string[];
1380
+ /** Optional runtime transform between UI and persisted shapes. */
1381
+ valueAdapter?: ControlBindingValueAdapter;
1382
+ /** Default popover scope. */
1383
+ simpleOrAdvanced: BindingScope;
1384
+ /** Freeform documentation lines. */
1385
+ notes?: string[];
1386
+ }
1387
+ /** Index by `${chartId}::${controlId}`. */
1388
+ type ControlBindingIndex = Map<string, ControlBinding>;
1389
+ declare function bindingKey(chartId: string, controlId: string): string;
1390
+
1391
+ /**
1392
+ * Pass 5 — Canonical control binding registry.
1393
+ *
1394
+ * Single source of truth for "which control writes where, and which renderer
1395
+ * path actually consumes the value". Each binding declares:
1396
+ *
1397
+ * - the persisted path the schema/popover writes to,
1398
+ * - the path the runtime exposes,
1399
+ * - one or more renderer read paths (first is canonical; the rest are
1400
+ * accepted legacy aliases for old configs),
1401
+ * - any legacy persist paths earlier passes wrote to (so migrations and
1402
+ * fallbacks still work).
1403
+ *
1404
+ * The schema registry, runtime helpers, and the verification script all
1405
+ * consult these records so:
1406
+ *
1407
+ * 1. Adding a control without a binding is a verification failure.
1408
+ * 2. Schema and renderer cannot drift in opposite directions silently.
1409
+ * 3. Old persisted configs keep working because legacy paths remain in the
1410
+ * renderer's accepted list.
1411
+ *
1412
+ * Bindings here are intentionally chart-specific. Common shared controls
1413
+ * (title, palette, density) declare one binding per consuming chart so the
1414
+ * verification script catches drift even when the same logical control is
1415
+ * shared.
1416
+ */
1417
+
1418
+ declare function getBinding(chartId: string, controlId: string): ControlBinding | undefined;
1419
+ declare function listBindings(): ControlBinding[];
1420
+ declare function listBindingsForChart(chartId: string): ControlBinding[];
1421
+ /**
1422
+ * Resolve a renderer-bound value at runtime.
1423
+ *
1424
+ * The renderer receives a `clientConfig`/`serviceConfig` pair and asks for the
1425
+ * value at a logical control id. This function consults the binding's
1426
+ * `rendererReadPaths` in order, returning the first defined value. If none of
1427
+ * the bound paths produces a value, the default is returned. Old configs that
1428
+ * persisted to a legacy path therefore still resolve to a usable runtime
1429
+ * value without the renderer needing chart-specific fallbacks scattered
1430
+ * everywhere.
1431
+ */
1432
+ declare function readBoundValue(chartId: string, controlId: string, cfg: {
1433
+ serviceConfig?: any;
1434
+ clientConfig?: any;
1435
+ } | null | undefined, fallback?: unknown): unknown;
1436
+
1437
+ /**
1438
+ * Pass-6 item guidance model.
1439
+ *
1440
+ * Eight discrete states that a chart card can be in. Each state declares a
1441
+ * primary action (translated), an optional secondary action, an icon, and a
1442
+ * severity so the chrome (chart-card / dashboard-item) renders one
1443
+ * consistent surface instead of scattering ad-hoc conditionals across
1444
+ * templates.
1445
+ */
1446
+
1447
+ type ItemGuidanceState = 'unconfigured' | 'missingDatasource' | 'missingFields' | 'invalidFilters' | 'readyToPreview' | 'noData' | 'dataError' | 'configured';
1448
+ type ItemGuidanceSeverity = 'info' | 'warn' | 'error' | 'success';
1449
+ interface ItemGuidanceAction {
1450
+ /**
1451
+ * Stable identifier that the chrome dispatches to its host. Hosts map
1452
+ * the id to a router action (open guided wizard on a specific step,
1453
+ * open kebab menu, open legacy editor, retry, etc.).
1454
+ */
1455
+ id: 'open-guided' | 'open-guided-source' | 'open-guided-fields' | 'open-guided-filters' | 'open-guided-preview' | 'open-guided-advanced' | 'open-legacy-editor' | 'edit-title' | 'open-more' | 'retry' | 'refresh';
1456
+ /** Translation key for the label. */
1457
+ labelKey: string;
1458
+ /** Optional MT icon. */
1459
+ icon?: MTIcon;
1460
+ /** Optional translation key for the tooltip / aria-label. */
1461
+ tooltipKey?: string;
1462
+ }
1463
+ interface ItemGuidanceDescriptor {
1464
+ /** State id. */
1465
+ state: ItemGuidanceState;
1466
+ /** Severity (drives chip color). */
1467
+ severity: ItemGuidanceSeverity;
1468
+ /** MT icon for the surface. */
1469
+ icon: MTIcon;
1470
+ /** Translation key for the title heading. */
1471
+ titleKey: string;
1472
+ /** Translation key for the description / hint. */
1473
+ descriptionKey: string;
1474
+ /** Primary CTA. */
1475
+ primaryAction: ItemGuidanceAction;
1476
+ /** Optional secondary CTA. */
1477
+ secondaryAction?: ItemGuidanceAction;
1478
+ /** Whether to render the center primary CTA card. */
1479
+ showCenterCta: boolean;
1480
+ /** Whether the inline title editor should be visible (builder mode). */
1481
+ showTitleEdit: boolean;
1482
+ /** Whether the top-end "More actions" kebab should be visible (builder). */
1483
+ showTopEndMenu: boolean;
1484
+ }
1485
+
1486
+ /**
1487
+ * Pass-6 item guidance registry.
1488
+ *
1489
+ * Static descriptor table for each `ItemGuidanceState`. The registry is the
1490
+ * single source of truth for "what should the user see in this state?".
1491
+ * Templates query this registry instead of hard-coding strings/icons.
1492
+ */
1493
+
1494
+ declare const ITEM_GUIDANCE_REGISTRY: Record<ItemGuidanceState, ItemGuidanceDescriptor>;
1495
+ declare function describeGuidance(state: ItemGuidanceState): ItemGuidanceDescriptor;
1496
+
1497
+ interface GuidanceInput {
1498
+ /** Persisted config (from store) — null while initial load is in flight. */
1499
+ config: ItemConfig | null;
1500
+ /** Whether the chart is currently loading data from the backend. */
1501
+ isLoading: boolean;
1502
+ /** Whether the last request failed. */
1503
+ hasError: boolean;
1504
+ /** Whether handler returned non-empty data. */
1505
+ hasData: boolean;
1506
+ /** Whether the host is in builder mode (CTA + chrome show). */
1507
+ builderMode: boolean;
1508
+ }
1509
+ declare class ItemGuidanceService {
1510
+ /**
1511
+ * Resolve a single guidance state from the persisted config + runtime
1512
+ * flags. Falls back to `'configured'` when nothing else applies.
1513
+ *
1514
+ * Note: returns `null` when the host is not in builder mode and the chart
1515
+ * has data — viewer mode does not show guidance overlays.
1516
+ */
1517
+ resolveState(input: GuidanceInput): ItemGuidanceState | null;
1518
+ /**
1519
+ * Whether the guidance state is a "needs user intervention" state. Useful
1520
+ * for the chrome to decide whether the center CTA card should obscure the
1521
+ * underlying chart skeleton.
1522
+ */
1523
+ isInterventionState(state: ItemGuidanceState | null): boolean;
1524
+ private resolveCapability;
1525
+ private isLayoutOrSpecial;
1526
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemGuidanceService, never>;
1527
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ItemGuidanceService>;
1528
+ }
1529
+
1530
+ declare class ChartFilterDrawer {
1531
+ private readonly dialogRef;
1532
+ private readonly drawerConfig;
1533
+ readonly workingItem: _angular_core.WritableSignal<DashboardChartItem | null>;
1534
+ readonly workingChips: _angular_core.WritableSignal<FilterChip[]>;
1535
+ /** Track that we have changes so cancel-without-apply discards them. */
1536
+ private dirty;
1537
+ /** Computed accessor to the persisted item config for the filter builder. */
1538
+ readonly persisted: _angular_core.Signal<_masterteam_dashboard_builder.ItemConfig | null>;
1539
+ constructor();
1540
+ onChipsChange(next: FilterChip[]): void;
1541
+ apply(): void;
1542
+ cancel(): void;
1543
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartFilterDrawer, never>;
1544
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartFilterDrawer, "mt-chart-filter-drawer", never, {}, {}, never, never, true, never>;
1545
+ }
1546
+
1547
+ /**
1548
+ * The action triggered by the toolbar. The host (dashboard-builder /
1549
+ * dashboard-item) is responsible for opening the appropriate surface.
1550
+ */
1551
+ type ItemContextAction = {
1552
+ type: 'open-popover';
1553
+ tab: PopoverTab;
1554
+ } | {
1555
+ type: 'edit-title';
1556
+ } | {
1557
+ type: 'duplicate';
1558
+ } | {
1559
+ type: 'remove';
1560
+ } | {
1561
+ type: 'open-advanced-editor';
1562
+ };
1563
+ declare class ItemContextToolbarComponent {
1564
+ /** Whether to render the compact (single-button) variant. */
1565
+ readonly compact: _angular_core.InputSignal<boolean>;
1566
+ /** Whether duplicate is allowed (false for layout/group widgets). */
1567
+ readonly allowDuplicate: _angular_core.InputSignal<boolean>;
1568
+ /** Action emitter — host wires this to popover/dialog/edit handlers. */
1569
+ readonly action: _angular_core.OutputEmitterRef<ItemContextAction>;
1570
+ readonly allActions: _angular_core.Signal<({
1571
+ id: string;
1572
+ labelEn: string;
1573
+ icon: string;
1574
+ actionPayload: {
1575
+ type: "open-popover";
1576
+ tab: PopoverTab;
1577
+ };
1578
+ } | {
1579
+ id: string;
1580
+ labelEn: string;
1581
+ icon: string;
1582
+ actionPayload: {
1583
+ type: "duplicate";
1584
+ tab?: undefined;
1585
+ };
1586
+ } | {
1587
+ id: string;
1588
+ labelEn: string;
1589
+ icon: string;
1590
+ actionPayload: {
1591
+ type: "open-advanced-editor";
1592
+ tab?: undefined;
1593
+ };
1594
+ } | {
1595
+ id: string;
1596
+ labelEn: string;
1597
+ icon: string;
1598
+ actionPayload: {
1599
+ type: "remove";
1600
+ tab?: undefined;
1601
+ };
1602
+ })[]>;
1603
+ emitAction(action: ItemContextAction): void;
1604
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemContextToolbarComponent, never>;
1605
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ItemContextToolbarComponent, "mt-item-context-toolbar", never, { "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "allowDuplicate": { "alias": "allowDuplicate"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
1606
+ }
1607
+
1608
+ interface ItemConfigPopoverData {
1609
+ item: DashboardChartItem;
1610
+ /** Initial tab - defaults to 'data'. */
1611
+ defaultTab?: PopoverTab;
1612
+ }
1613
+ type ItemConfigPopoverResult = {
1614
+ type: 'apply';
1615
+ item: DashboardChartItem;
1616
+ } | {
1617
+ type: 'cancel';
1618
+ } | {
1619
+ type: 'open-advanced-editor';
1620
+ tab: 'general' | 'dataSource' | 'actions';
1621
+ } | {
1622
+ type: 'open-chart-settings-drawer';
1623
+ item: DashboardChartItem;
1624
+ };
1625
+ declare class ItemConfigPopoverComponent {
1626
+ private readonly dialogRef;
1627
+ private readonly dialogConfig;
1628
+ /** Working item - deep-cloned so cancel does not mutate canvas state. */
1629
+ readonly item: _angular_core.WritableSignal<DashboardChartItem | null>;
1630
+ /** Tabs (constant). */
1631
+ readonly tabs: _angular_core.WritableSignal<{
1632
+ value: PopoverTab;
1633
+ key: PopoverTab;
1634
+ label: string;
1635
+ icon: string;
1636
+ }[]>;
1637
+ /** Active tab. */
1638
+ readonly activeTab: _angular_core.WritableSignal<PopoverTab>;
1639
+ /**
1640
+ * Style/Behavior/Advanced controls scope. Simple shows the most-common
1641
+ * controls; advanced reveals every field from the chart's control schema.
1642
+ */
1643
+ readonly controlScope: _angular_core.WritableSignal<ControlSectionScope>;
1644
+ /** Capability for this item. */
1645
+ readonly capability: _angular_core.Signal<_masterteam_dashboard_builder.ChartCapability | null>;
1646
+ /** Control schema for this chart capability. */
1647
+ readonly schema: _angular_core.Signal<ControlSchema>;
1648
+ /** Available presets for the capability. */
1649
+ readonly presets: _angular_core.Signal<readonly StylePreset[]>;
1650
+ /** UI snapshot for read paths. */
1651
+ readonly ui: _angular_core.Signal<_masterteam_dashboard_builder.UiItemConfig | null>;
1652
+ /** Filter chips (UI representation). */
1653
+ readonly chips: _angular_core.Signal<FilterChip[]>;
1654
+ /** Persisted config for the schema renderer. */
1655
+ readonly persistedConfig: _angular_core.Signal<ItemConfig | null>;
1656
+ /** Validation issues. */
1657
+ readonly issues: _angular_core.Signal<_masterteam_dashboard_builder.ValidationIssue[]>;
1658
+ readonly issuesByDomain: _angular_core.Signal<Record<_masterteam_dashboard_builder.ConfigDomainKey, _masterteam_dashboard_builder.ValidationIssue[]>>;
1659
+ readonly hasErrors: _angular_core.Signal<boolean>;
1660
+ /** Advanced JSON draft. */
1661
+ readonly advancedJsonDraft: _angular_core.WritableSignal<string>;
1662
+ readonly advancedJsonError: _angular_core.WritableSignal<string>;
1663
+ private advancedJsonInitialized;
1664
+ constructor();
1665
+ /** Selected style preset key (computed from the current layout). */
1666
+ readonly selectedPresetKey: _angular_core.Signal<StylePresetKey | null>;
1667
+ onTitleChange(title: string): void;
1668
+ onStylePatch(patch: Partial<StyleUi>): void;
1669
+ onLayoutPatch(patch: Partial<LayoutUi>): void;
1670
+ /**
1671
+ * Apply a preset across all declared domains. Pass 4 fix: the previous
1672
+ * implementation only applied layout + style; presets that declared
1673
+ * `labelLegendFormat` overrides were silently dropped. This now applies
1674
+ * every domain the preset declares so the renderer receives the same
1675
+ * values the preset shape promises.
1676
+ */
1677
+ onApplyPreset(preset: StylePreset): void;
1678
+ onChipsChange(chips: FilterChip[]): void;
1679
+ onServiceConfigPatch(partial: Partial<ServiceConfig>): void;
1680
+ onShowFiltersBarChange(show: boolean): void;
1681
+ onSchemaPatch(patch: ControlPatch): void;
1682
+ toggleControlScope(): void;
1683
+ initAdvancedJsonIfNeeded(): void;
1684
+ onAdvancedJsonChange(value: string): void;
1685
+ applyAdvancedJson(): void;
1686
+ apply(): void;
1687
+ cancel(): void;
1688
+ openAdvancedEditor(tab?: 'general' | 'dataSource' | 'actions'): void;
1689
+ /**
1690
+ * Hand-off to the chart-settings-drawer (legacy bar/pie/stack drawer for
1691
+ * power users). Pre-applies the in-popover edits so the drawer opens on
1692
+ * the latest state.
1693
+ */
1694
+ openChartSettingsDrawer(): void;
1695
+ private patchPersisted;
1696
+ private cloneItem;
1697
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemConfigPopoverComponent, never>;
1698
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ItemConfigPopoverComponent, "mt-item-config-popover", never, {}, {}, never, never, true, never>;
1699
+ }
1700
+
1701
+ /** Five steps. The host can request a default. */
1702
+ type GuidedStep = 'source' | 'fields' | 'filters' | 'preview' | 'advanced';
1703
+ interface GuidedConfigDialogData {
1704
+ item: DashboardChartItem;
1705
+ /** Initial step — defaults to 'source' for new charts. */
1706
+ defaultStep?: GuidedStep;
1707
+ /** Optional popover-tab compat (the kebab still emits PopoverTab values). */
1708
+ defaultTab?: PopoverTab;
1709
+ }
1710
+ type GuidedConfigDialogResult = {
1711
+ type: 'apply';
1712
+ item: DashboardChartItem;
1713
+ } | {
1714
+ type: 'cancel';
1715
+ } | {
1716
+ type: 'open-advanced-editor';
1717
+ };
1718
+ declare class GuidedConfigDialogComponent {
1719
+ private readonly dialogRef;
1720
+ private readonly dialogConfig;
1721
+ private readonly transloco;
1722
+ private readonly guidance;
1723
+ /** Working copy — deep-cloned so cancel does not mutate canvas state. */
1724
+ readonly item: _angular_core.WritableSignal<DashboardChartItem | null>;
1725
+ /** Current step. */
1726
+ readonly activeStep: _angular_core.WritableSignal<GuidedStep>;
1727
+ /** Step order. */
1728
+ private readonly STEPS;
1729
+ readonly stepOptions: _angular_core.Signal<{
1730
+ label: string;
1731
+ value: string;
1732
+ icon: string;
1733
+ }[]>;
1734
+ readonly progressPercent: _angular_core.Signal<number>;
1735
+ readonly isLastStep: _angular_core.Signal<boolean>;
1736
+ readonly canGoBack: _angular_core.Signal<boolean>;
1737
+ /** Capability for this item. */
1738
+ readonly capability: _angular_core.Signal<_masterteam_dashboard_builder.ChartCapability | null>;
1739
+ /** Control schema for the current chart capability. */
1740
+ readonly schema: _angular_core.Signal<ControlSchema>;
1741
+ /** Persisted config snapshot. */
1742
+ readonly persistedConfig: _angular_core.Signal<ItemConfig | null>;
1743
+ /** UI snapshot. */
1744
+ readonly ui: _angular_core.Signal<_masterteam_dashboard_builder.UiItemConfig | null>;
1745
+ /** Filter chips (UI representation). */
1746
+ readonly chips: _angular_core.Signal<FilterChip[]>;
1747
+ /** Validation issues. */
1748
+ readonly issues: _angular_core.Signal<_masterteam_dashboard_builder.ValidationIssue[]>;
1749
+ readonly issuesByDomain: _angular_core.Signal<Record<_masterteam_dashboard_builder.ConfigDomainKey, _masterteam_dashboard_builder.ValidationIssue[]>>;
1750
+ readonly hasErrors: _angular_core.Signal<boolean>;
1751
+ /** Resolved guidance state for the chip in the header. */
1752
+ readonly state: _angular_core.Signal<ItemGuidanceState | null>;
1753
+ readonly stateDescriptor: _angular_core.Signal<_masterteam_dashboard_builder.ItemGuidanceDescriptor>;
1754
+ /** Summary chips for Step 4. */
1755
+ readonly summaryChips: _angular_core.Signal<{
1756
+ id: string;
1757
+ label: string;
1758
+ icon: "dev.database-01" | "layout.list" | "general.filter-funnel-01" | "alert.alert-circle" | "general.check-circle";
1759
+ tone: "ok" | "missing";
1760
+ }[]>;
1761
+ /** Advanced JSON draft. */
1762
+ readonly advancedJsonDraft: _angular_core.WritableSignal<string>;
1763
+ readonly advancedJsonError: _angular_core.WritableSignal<string>;
1764
+ private advancedJsonInitialized;
1765
+ constructor();
1766
+ onTitleChange(title: string): void;
1767
+ onChipsChange(chips: FilterChip[]): void;
1768
+ onServiceConfigPatch(partial: Partial<ServiceConfig>): void;
1769
+ onSchemaPatch(patch: ControlPatch): void;
1770
+ initAdvancedJsonIfNeeded(): void;
1771
+ onAdvancedJsonChange(value: string): void;
1772
+ applyAdvancedJson(): void;
1773
+ goNext(): void;
1774
+ goBack(): void;
1775
+ apply(): void;
1776
+ cancel(): void;
1777
+ openAdvancedEditor(): void;
1778
+ private patchPersisted;
1779
+ private cloneItem;
1780
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GuidedConfigDialogComponent, never>;
1781
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GuidedConfigDialogComponent, "mt-guided-config-dialog", never, {}, {}, never, never, true, never>;
1782
+ }
1783
+
1784
+ declare class FilterChipsBarComponent {
1785
+ readonly chips: _angular_core.InputSignal<FilterChip[]>;
1786
+ readonly chipsChange: _angular_core.OutputEmitterRef<FilterChip[]>;
1787
+ readonly editingChipId: _angular_core.WritableSignal<string | null>;
1788
+ readonly showReadonly: _angular_core.WritableSignal<boolean>;
1789
+ readonly visibleChips: _angular_core.Signal<FilterChip[]>;
1790
+ readonly hiddenCount: _angular_core.Signal<number>;
1791
+ scopeLabel(chip: FilterChip): string;
1792
+ operatorLabel(chip: FilterChip): string;
1793
+ formatValue(chip: FilterChip): string;
1794
+ editableScope(source: FilterChip['source']): boolean;
1795
+ toggle(chip: FilterChip): void;
1796
+ remove(chip: FilterChip): void;
1797
+ beginEdit(chip: FilterChip): void;
1798
+ updateValue(chip: FilterChip, value: string): void;
1799
+ commitEdit(): void;
1800
+ cancelEdit(): void;
1801
+ addStaticChip(): void;
1802
+ toggleShowReadonly(): void;
1803
+ private emit;
1804
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterChipsBarComponent, never>;
1805
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterChipsBarComponent, "mt-filter-chips-bar", never, { "chips": { "alias": "chips"; "required": true; "isSignal": true; }; }, { "chipsChange": "chipsChange"; }, never, never, true, never>;
1806
+ }
1807
+
1808
+ interface FieldOption {
1809
+ key: string;
1810
+ label: string;
1811
+ source: 'query' | 'selectedProperties' | 'extraProperties' | 'manual';
1812
+ viewType?: string;
1813
+ }
1814
+ declare class FilterBuilderComponent {
1815
+ readonly chips: _angular_core.InputSignal<FilterChip[]>;
1816
+ readonly persisted: _angular_core.InputSignal<ItemConfig | null>;
1817
+ readonly chipsChange: _angular_core.OutputEmitterRef<FilterChip[]>;
1818
+ readonly showReadOnly: _angular_core.WritableSignal<boolean>;
1819
+ readonly OPERATOR_OPTIONS: {
1820
+ value: FilterOperator;
1821
+ label: string;
1822
+ group: "common" | "string" | "number" | "list" | "null";
1823
+ }[];
1824
+ readonly editableChips: _angular_core.Signal<FilterChip[]>;
1825
+ readonly readOnlyChips: _angular_core.Signal<FilterChip[]>;
1826
+ readonly readOnlyCount: _angular_core.Signal<number>;
1827
+ readonly fieldOptions: _angular_core.Signal<FieldOption[]>;
1828
+ isKnownField(key: string): boolean;
1829
+ scopeLabel(chip: FilterChip): string;
1830
+ operatorReadonlyLabel(op: FilterOperator): string;
1831
+ formatReadonlyValue(chip: FilterChip): string;
1832
+ formatList(value: unknown): string;
1833
+ getBetween(chip: FilterChip, idx: 0 | 1): string | number;
1834
+ valueKind(chip: FilterChip): 'list' | 'between' | 'boolean' | 'number' | 'text';
1835
+ toggleActive(chip: FilterChip): void;
1836
+ remove(chip: FilterChip): void;
1837
+ setField(chip: FilterChip, propertyKey: string): void;
1838
+ setOperator(chip: FilterChip, raw: string): void;
1839
+ setValue(chip: FilterChip, value: unknown): void;
1840
+ setNumber(chip: FilterChip, raw: unknown): void;
1841
+ setListValue(chip: FilterChip, raw: string): void;
1842
+ setBetween(chip: FilterChip, idx: 0 | 1, raw: unknown): void;
1843
+ addStaticFilter(): void;
1844
+ toggleShowReadOnly(): void;
1845
+ private emit;
1846
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterBuilderComponent, never>;
1847
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterBuilderComponent, "mt-filter-builder", never, { "chips": { "alias": "chips"; "required": true; "isSignal": true; }; "persisted": { "alias": "persisted"; "required": false; "isSignal": true; }; }, { "chipsChange": "chipsChange"; }, never, never, true, never>;
1848
+ }
1849
+
478
1850
  /**
479
1851
  * Chart Type Configuration
480
1852
  */
@@ -569,7 +1941,10 @@ interface SourceLink {
569
1941
  sourceLinkId?: number | null;
570
1942
  }
571
1943
  /**
572
- * Available chart types - matching old groupedCharts implementation
1944
+ * Available chart types derived from the chart capability registry.
1945
+ *
1946
+ * The registry (`CHART_CAPABILITIES`) is the single source of truth.
1947
+ * Adding a new chart means adding a manifest entry, not editing this array.
573
1948
  */
574
1949
  declare const CHART_TYPES: ChartTypeConfig[];
575
1950
  /**
@@ -666,6 +2041,54 @@ declare class ManageItemService {
666
2041
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ManageItemService>;
667
2042
  }
668
2043
 
2044
+ declare class DatasourcePanelComponent {
2045
+ readonly item: _angular_core.InputSignal<DashboardChartItem | null>;
2046
+ readonly serviceConfigChange: _angular_core.OutputEmitterRef<Partial<ServiceConfig>>;
2047
+ readonly openAdvanced: _angular_core.OutputEmitterRef<void>;
2048
+ readonly config: _angular_core.Signal<ItemConfig | null>;
2049
+ readonly chartTypeConfig: _angular_core.Signal<ChartTypeConfig | null>;
2050
+ readonly summary: _angular_core.Signal<{
2051
+ chartType: string;
2052
+ sourceStatus: string;
2053
+ sourceIcon: string;
2054
+ sourceLabel: string;
2055
+ fieldsStatus: "missing" | "ok";
2056
+ fieldsIcon: string;
2057
+ fieldsLabel: string;
2058
+ missing: string[];
2059
+ }>;
2060
+ onServiceConfigChange(patch: Partial<ServiceConfig>): void;
2061
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatasourcePanelComponent, never>;
2062
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatasourcePanelComponent, "mt-datasource-panel", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; }, { "serviceConfigChange": "serviceConfigChange"; "openAdvanced": "openAdvanced"; }, never, never, true, never>;
2063
+ }
2064
+
2065
+ declare class SchemaControlRendererComponent {
2066
+ readonly schema: _angular_core.InputSignal<ControlSchema>;
2067
+ readonly persisted: _angular_core.InputSignal<_masterteam_dashboard_builder.ItemConfig | null>;
2068
+ readonly capability: _angular_core.InputSignal<ChartCapability | null>;
2069
+ readonly scope: _angular_core.InputSignal<ControlSectionScope>;
2070
+ readonly patch: _angular_core.OutputEmitterRef<ControlPatch>;
2071
+ readonly jsonError: _angular_core.Signal<Record<string, string>>;
2072
+ readonly visibleSections: _angular_core.Signal<ControlSection[]>;
2073
+ visibleFields(section: ControlSection): ControlField[];
2074
+ readValue(field: ControlField): unknown;
2075
+ readString(field: ControlField): string;
2076
+ readBoolean(field: ControlField): boolean;
2077
+ readJson(field: ControlField): string;
2078
+ readPalette(field: ControlField): string;
2079
+ optionsFor(field: ControlField): _masterteam_dashboard_builder.ControlOption[];
2080
+ multiselectChecked(field: ControlField, value: unknown): boolean;
2081
+ emit(field: ControlField, value: unknown): void;
2082
+ emitNumber(field: ControlField, raw: unknown): void;
2083
+ emitMultiselect(field: ControlField, optionValue: unknown, checked: boolean): void;
2084
+ emitPalette(field: ControlField, raw: string): void;
2085
+ emitJson(field: ControlField, raw: string): void;
2086
+ private emitShadowPreset;
2087
+ private fieldShouldRender;
2088
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SchemaControlRendererComponent, never>;
2089
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SchemaControlRendererComponent, "mt-schema-control-renderer", never, { "schema": { "alias": "schema"; "required": true; "isSignal": true; }; "persisted": { "alias": "persisted"; "required": true; "isSignal": true; }; "capability": { "alias": "capability"; "required": false; "isSignal": true; }; "scope": { "alias": "scope"; "required": false; "isSignal": true; }; }, { "patch": "patch"; }, never, never, true, never>;
2090
+ }
2091
+
669
2092
  /**
670
2093
  * Dashboard Builder Component
671
2094
  *
@@ -780,7 +2203,59 @@ declare class DashboardBuilder implements OnInit, OnDestroy {
780
2203
  pasteSelectedCharts(): void;
781
2204
  private pasteItemInChart;
782
2205
  addItem(): void;
783
- editItem(chart: DashboardChartItem, parentItem?: DashboardChartItem): void;
2206
+ /**
2207
+ * Pass 7 — primary data-config entry point. The center "Configure
2208
+ * datasource" CTA on an unconfigured chart and the kebab's "Configure
2209
+ * datasource" entry both route here. ManageItem (the full advanced
2210
+ * editor) is the **only** datasource flow.
2211
+ */
2212
+ configureChart(chart: DashboardChartItem): void;
2213
+ /**
2214
+ * Pass 7 — open the dedicated chart filter drawer. Sole owner of
2215
+ * chart-level filter editing (replaces the duplicated filter editing
2216
+ * surfaces inside the deactivated popover/wizard).
2217
+ */
2218
+ openItemFilterDrawer(chart: DashboardChartItem): void;
2219
+ /**
2220
+ * Apply a partial chart-config update produced by one of the dedicated
2221
+ * drawers (filters, style, manage-item). Updates the chart in place,
2222
+ * re-renders it, and emits to the host.
2223
+ */
2224
+ private applyChartConfigUpdate;
2225
+ /**
2226
+ * Pass 7 — sole card-menu action handler. The kebab emits a single
2227
+ * `ItemCardMenuAction` and the host routes each id to one obvious owner:
2228
+ *
2229
+ * - configure-datasource → ManageItem (advanced editor)
2230
+ * - style → ChartSettingsDrawer
2231
+ * - filters → ChartFilterDrawer
2232
+ * - edit-title → focuses the inline title input on the card
2233
+ * - duplicate / delete → host helpers
2234
+ * - dialog-* → linked-dialog actions (only present when
2235
+ * the chart is configured to open a dialog)
2236
+ *
2237
+ * No surface duplicates another. There is no other code path that opens
2238
+ * a separate popover/wizard.
2239
+ */
2240
+ onItemCardMenuAction(chart: DashboardChartItem, action: ItemCardMenuAction): void;
2241
+ /**
2242
+ * Pass 7 — focus the inline title input for the given chart. Both the
2243
+ * unconfigured chart surface (`dashboard-item.html` overlay) and the
2244
+ * configured chart heading (`card-content.component.html`) carry
2245
+ * `data-dashboard-action="edit-title"`; the gridster-item carries the
2246
+ * matching `data-chart-id`. The kebab's "Edit title" entry routes here
2247
+ * without opening any other surface.
2248
+ */
2249
+ private requestEditTitle;
2250
+ /** Whether the chart has a linked dialog (Manage menu shows dialog entries). */
2251
+ hasLinkedDialog(chart: DashboardChartItem): boolean;
2252
+ /** Whether the chart can have a linked dialog added (chart cards that aren't dialogs themselves). */
2253
+ canLinkDialog(chart: DashboardChartItem): boolean;
2254
+ /** Duplicate a chart on the canvas. */
2255
+ duplicateChart(chart: DashboardChartItem): void;
2256
+ /** Whether the kebab menu should appear on this chart card. */
2257
+ showContextToolbar(chart: DashboardChartItem): boolean;
2258
+ editItem(chart: DashboardChartItem, parentItem?: DashboardChartItem, defaultTab?: 'general' | 'dataSource' | 'actions'): void;
784
2259
  deleteItem(chart: DashboardChartItem): void;
785
2260
  private removeChartLocally;
786
2261
  newChart(value: any): void;
@@ -793,11 +2268,29 @@ declare class DashboardBuilder implements OnInit, OnDestroy {
793
2268
  toggleWidgetPalette(): void;
794
2269
  /** Close widget palette drawer */
795
2270
  closeWidgetPalette(): void;
796
- /** Add widget based on type configuration */
2271
+ /**
2272
+ * Pass 7 — add widget based on type configuration.
2273
+ *
2274
+ * Layout widgets (header/topbar/group) land on the canvas directly because
2275
+ * they don't have a datasource. For chart-type widgets we restore the
2276
+ * old, simpler behavior: open `ManageItem` (the advanced editor) first
2277
+ * and only place a chart on the canvas after the user saves. Cancel
2278
+ * never lands a half-configured chart.
2279
+ */
797
2280
  addWidgetByType(widgetType: ChartTypeConfig): void;
2281
+ /**
2282
+ * Pass-2: persist an inline title edit committed from the chart card.
2283
+ * Updates `clientConfig.title.{en,ar}` for the matched chart.
2284
+ */
2285
+ onChartTitleEdited(chart: DashboardChartItem, newTitle: string): void;
798
2286
  /** Add layout widget directly (header, topbar, group) */
799
2287
  private addLayoutWidget;
800
- /** Open manage-item drawer for a specific widget type */
2288
+ /**
2289
+ * Open the ManageItem advanced editor with the widget type pre-selected.
2290
+ * The chart only lands on the canvas if the user clicks Save — Cancel
2291
+ * leaves the canvas untouched (Pass 7 reset of the Pass-2 "drop empty
2292
+ * card on canvas" pattern that produced unconfigured cards).
2293
+ */
801
2294
  private openManageItemForType;
802
2295
  /** Create new chart with specified size */
803
2296
  private newChartWithSize;
@@ -851,7 +2344,9 @@ declare class DashboardViewer implements OnInit, OnDestroy {
851
2344
  private dashboardService;
852
2345
  private storeService;
853
2346
  private itemStoreService;
2347
+ private limitedHttp;
854
2348
  private route;
2349
+ private get repeaterUrlConfig();
855
2350
  /** Whether to wrap content in mt-page component */
856
2351
  readonly isPage: _angular_core.InputSignal<boolean>;
857
2352
  /** Page title when isPage is true */
@@ -1270,6 +2765,7 @@ declare class DashboardItem implements OnInit, OnDestroy {
1270
2765
  private readonly chartDataService;
1271
2766
  private readonly actionService;
1272
2767
  private readonly transloco;
2768
+ private readonly guidance;
1273
2769
  private subscription;
1274
2770
  private readonly destroy$;
1275
2771
  /** Chart configuration */
@@ -1290,8 +2786,24 @@ declare class DashboardItem implements OnInit, OnDestroy {
1290
2786
  readonly extraFilters: _angular_core.InputSignal<Record<string, any>>;
1291
2787
  /** Skip global route/query filters for this item */
1292
2788
  readonly ignoreQueryFilter: _angular_core.InputSignal<boolean>;
2789
+ /**
2790
+ * Whether the host is rendering in builder mode (not viewer). Enables
2791
+ * the inline title edit + Configure datasource CTA on the chart card.
2792
+ */
2793
+ readonly builderMode: _angular_core.InputSignal<boolean>;
1293
2794
  /** Emitted when an action is triggered (useful for dialog communication) */
1294
2795
  readonly actionTriggered: _angular_core.OutputEmitterRef<any>;
2796
+ /**
2797
+ * Emitted when the empty card asks the host to open the manage-item drawer
2798
+ * for this widget. Host (dashboard-builder) should open manage-item with
2799
+ * `chart` set to this item.
2800
+ */
2801
+ readonly configureRequested: _angular_core.OutputEmitterRef<void>;
2802
+ /**
2803
+ * Emitted when the user inline-edits the chart title. Host (dashboard-builder)
2804
+ * should persist the new title into clientConfig.title.{en,ar}.
2805
+ */
2806
+ readonly titleEdited: _angular_core.OutputEmitterRef<string>;
1295
2807
  /** Dashboard ID - derived from config or chartTypeId */
1296
2808
  readonly dashboardId: _angular_core.Signal<string | null>;
1297
2809
  /** Component name */
@@ -1306,6 +2818,39 @@ declare class DashboardItem implements OnInit, OnDestroy {
1306
2818
  readonly languageCode: _angular_core.Signal<string>;
1307
2819
  /** Chart type from service config */
1308
2820
  readonly chartType: _angular_core.Signal<string | undefined>;
2821
+ /** Whether the inline title input should be shown in the needs-config overlay. */
2822
+ readonly titleEditableEnabled: _angular_core.Signal<boolean>;
2823
+ /** Current title in active language (or English / Arabic fallback). */
2824
+ readonly currentTitle: _angular_core.Signal<string>;
2825
+ /**
2826
+ * Whether the chart needs configuration to render (no selection, no
2827
+ * customApi, and not a layout/special-endpoint widget). Displayed at the
2828
+ * host level so every renderer (chart, table, statistic, properties,
2829
+ * entity-preview, etc.) benefits from a single, consistent CTA.
2830
+ */
2831
+ readonly needsConfiguration: _angular_core.Signal<boolean>;
2832
+ /**
2833
+ * Pass-6 guidance state. Surfaces the right title/hint/CTA for the
2834
+ * user's current situation (unconfigured, missingDatasource, missingFields,
2835
+ * invalidFilters, noData, dataError, configured).
2836
+ */
2837
+ readonly guidanceState: _angular_core.Signal<ItemGuidanceState>;
2838
+ /** Stable string fed to `data-dashboard-ux-state` for verification. */
2839
+ readonly guidanceUxState: _angular_core.Signal<string>;
2840
+ /** Translated heading shown above the center CTA. */
2841
+ readonly guidanceTitle: _angular_core.Signal<string>;
2842
+ /** Translated hint shown below the heading. */
2843
+ readonly guidanceHint: _angular_core.Signal<string>;
2844
+ /** Icon for the center surface. */
2845
+ readonly guidanceIcon: _angular_core.Signal<string>;
2846
+ /** Translated label for the primary CTA. */
2847
+ readonly guidancePrimaryLabel: _angular_core.Signal<string>;
2848
+ /** Icon for the primary CTA. */
2849
+ readonly guidancePrimaryIcon: _angular_core.Signal<string>;
2850
+ /** Translated label for the secondary CTA, or empty string. */
2851
+ readonly guidanceSecondaryLabel: _angular_core.Signal<string>;
2852
+ /** Icon for the secondary CTA. */
2853
+ readonly guidanceSecondaryIcon: _angular_core.Signal<string>;
1309
2854
  /** Loading state - SINGLE SOURCE OF TRUTH */
1310
2855
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1311
2856
  /** Has error */
@@ -1347,12 +2892,30 @@ declare class DashboardItem implements OnInit, OnDestroy {
1347
2892
  * Handle actions from child components (charts, tables, etc.)
1348
2893
  * This is the main entry point for action handling.
1349
2894
  */
2895
+ /**
2896
+ * Handle the Configure datasource CTA on an empty chart card.
2897
+ * Forwarded to the host so the manage-item drawer can be opened on the
2898
+ * Data Source tab for this widget.
2899
+ */
2900
+ onConfigureRequested(): void;
2901
+ /**
2902
+ * Pass-6: handle the secondary CTA. Currently routed to the same
2903
+ * `configureRequested` event so the host can open the legacy advanced
2904
+ * editor or refresh, depending on the guidance state's secondary action.
2905
+ */
2906
+ onSecondaryRequested(): void;
2907
+ /**
2908
+ * Handle inline title edit committed by the chart card. Forwarded to host
2909
+ * to persist into clientConfig.title.{en,ar}. We also patch the local
2910
+ * store so the change shows immediately.
2911
+ */
2912
+ onTitleChange(newTitle: string): void;
1350
2913
  doActions(eventData: any, eventType: string): void;
1351
2914
  private buildRequestFilters;
1352
2915
  private buildParentFilter;
1353
2916
  private mergeRequestFilters;
1354
2917
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DashboardItem, never>;
1355
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DashboardItem, "mt-dashboard-item", never, { "config": { "alias": "config"; "required": false; "isSignal": true; }; "chartTypeId": { "alias": "chartTypeId"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "pageName": { "alias": "pageName"; "required": false; "isSignal": true; }; "inGroup": { "alias": "inGroup"; "required": false; "isSignal": true; }; "isDialog": { "alias": "isDialog"; "required": false; "isSignal": true; }; "queryParams": { "alias": "queryParams"; "required": false; "isSignal": true; }; "extraFilters": { "alias": "extraFilters"; "required": false; "isSignal": true; }; "ignoreQueryFilter": { "alias": "ignoreQueryFilter"; "required": false; "isSignal": true; }; }, { "actionTriggered": "actionTriggered"; }, never, never, true, never>;
2918
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DashboardItem, "mt-dashboard-item", never, { "config": { "alias": "config"; "required": false; "isSignal": true; }; "chartTypeId": { "alias": "chartTypeId"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "pageName": { "alias": "pageName"; "required": false; "isSignal": true; }; "inGroup": { "alias": "inGroup"; "required": false; "isSignal": true; }; "isDialog": { "alias": "isDialog"; "required": false; "isSignal": true; }; "queryParams": { "alias": "queryParams"; "required": false; "isSignal": true; }; "extraFilters": { "alias": "extraFilters"; "required": false; "isSignal": true; }; "ignoreQueryFilter": { "alias": "ignoreQueryFilter"; "required": false; "isSignal": true; }; "builderMode": { "alias": "builderMode"; "required": false; "isSignal": true; }; }, { "actionTriggered": "actionTriggered"; "configureRequested": "configureRequested"; "titleEdited": "titleEdited"; }, never, never, true, never>;
1356
2919
  }
1357
2920
 
1358
2921
  interface HeaderCardConfig$1 {
@@ -1406,6 +2969,13 @@ declare class CardContentComponent {
1406
2969
  readonly styleConfig: _angular_core.InputSignal<CardBorderStyleConfig | null>;
1407
2970
  /** Card style configuration (background, shadows, border radius) */
1408
2971
  readonly cardStyleConfig: _angular_core.InputSignal<CardStyleConfig$1 | null>;
2972
+ /**
2973
+ * Pass-3: density preset hint (`compact` | `comfortable` | `presentation`).
2974
+ * Read from `clientConfig.configAsType.density` and applied as a
2975
+ * `data-density` attribute that CSS can target. Old configs without this
2976
+ * key fall back to `comfortable` via the absence-of-attribute baseline.
2977
+ */
2978
+ readonly density: _angular_core.InputSignal<string | null>;
1409
2979
  /** Whether to show header */
1410
2980
  readonly showHeader: _angular_core.InputSignal<boolean>;
1411
2981
  /** Whether header is clickable */
@@ -1416,6 +2986,20 @@ declare class CardContentComponent {
1416
2986
  readonly isChart: _angular_core.InputSignal<boolean>;
1417
2987
  /** Header click event */
1418
2988
  readonly headerClick: _angular_core.OutputEmitterRef<void>;
2989
+ /**
2990
+ * Whether the title is click-to-edit (builder mode only). Falsy by
2991
+ * default so view-mode cards keep their existing behavior.
2992
+ */
2993
+ readonly titleEditable: _angular_core.InputSignal<boolean>;
2994
+ /** Emitted when the user commits an edited title (Enter / blur). */
2995
+ readonly titleChange: _angular_core.OutputEmitterRef<string>;
2996
+ /** Internal: whether the title input is currently being edited. */
2997
+ readonly editingTitle: _angular_core.WritableSignal<boolean>;
2998
+ /** Internal: draft text while editing. */
2999
+ readonly titleDraft: _angular_core.WritableSignal<string>;
3000
+ /** Reference to the inline title input (if visible). */
3001
+ readonly titleInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
3002
+ constructor();
1419
3003
  /** Computed show header */
1420
3004
  readonly showHeaderState: _angular_core.Signal<boolean>;
1421
3005
  /** Computed header clickable */
@@ -1427,8 +3011,20 @@ declare class CardContentComponent {
1427
3011
  /** Computed border radius style */
1428
3012
  readonly borderRadiusStyle: _angular_core.Signal<string>;
1429
3013
  onHeaderClick(): void;
3014
+ /**
3015
+ * Begin inline title editing. Only triggered when `titleEditable` is true.
3016
+ * The title text is replaced by an `<input>` until Enter/blur (commit) or
3017
+ * Escape (cancel).
3018
+ */
3019
+ onStartEditTitle(event: Event): void;
3020
+ /** Commit the in-progress title edit. */
3021
+ onCommitTitle(): void;
3022
+ /** Cancel the in-progress title edit. */
3023
+ onCancelTitle(): void;
3024
+ /** Track input changes during edit. */
3025
+ onTitleInput(value: string): void;
1430
3026
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardContentComponent, never>;
1431
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardContentComponent, "mt-card-content", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "inGroup": { "alias": "inGroup"; "required": false; "isSignal": true; }; "headerConfig": { "alias": "headerConfig"; "required": false; "isSignal": true; }; "styleConfig": { "alias": "styleConfig"; "required": false; "isSignal": true; }; "cardStyleConfig": { "alias": "cardStyleConfig"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "headerClickable": { "alias": "headerClickable"; "required": false; "isSignal": true; }; "isNoTopEnd": { "alias": "isNoTopEnd"; "required": false; "isSignal": true; }; "isChart": { "alias": "isChart"; "required": false; "isSignal": true; }; }, { "headerClick": "headerClick"; }, never, ["[topEnd]", "[body]", "[footer]"], true, never>;
3027
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardContentComponent, "mt-card-content", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "inGroup": { "alias": "inGroup"; "required": false; "isSignal": true; }; "headerConfig": { "alias": "headerConfig"; "required": false; "isSignal": true; }; "styleConfig": { "alias": "styleConfig"; "required": false; "isSignal": true; }; "cardStyleConfig": { "alias": "cardStyleConfig"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "headerClickable": { "alias": "headerClickable"; "required": false; "isSignal": true; }; "isNoTopEnd": { "alias": "isNoTopEnd"; "required": false; "isSignal": true; }; "isChart": { "alias": "isChart"; "required": false; "isSignal": true; }; "titleEditable": { "alias": "titleEditable"; "required": false; "isSignal": true; }; }, { "headerClick": "headerClick"; "titleChange": "titleChange"; }, never, ["[topEnd]", "[body]", "[footer]"], true, never>;
1432
3028
  }
1433
3029
 
1434
3030
  declare class CardFilterComponent implements OnInit {
@@ -1663,6 +3259,16 @@ declare class CardInfoComponent {
1663
3259
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardInfoComponent, "mt-card-info", never, { "cardInfo": { "alias": "cardInfo"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1664
3260
  }
1665
3261
 
3262
+ /**
3263
+ * Inline view-mode the body should render with.
3264
+ *
3265
+ * - 'echart' — handler returned ECharts options.
3266
+ * - 'splitter' — handler returned `{ positive, negative }`.
3267
+ * - 'timeline' — handler returned `{ calendarOptions, ... }`.
3268
+ * - 'phaseGateStepper' — handler returned `{ steps, currentIndex }`.
3269
+ * - 'raw' — fallback to ECharts (we still try to render).
3270
+ */
3271
+ type CardViewMode = 'echart' | 'splitter' | 'timeline' | 'phaseGateStepper' | 'raw';
1666
3272
  declare class ChartCardComponent implements OnInit, OnDestroy {
1667
3273
  private readonly storeService;
1668
3274
  private readonly actionService;
@@ -1672,13 +3278,19 @@ declare class ChartCardComponent implements OnInit, OnDestroy {
1672
3278
  readonly dashboardId: _angular_core.InputSignal<string | number>;
1673
3279
  /** Whether card is inside a group */
1674
3280
  readonly inGroup: _angular_core.InputSignal<boolean>;
1675
- /** Config mode flag */
3281
+ /** Config mode flag (drawer preview) */
1676
3282
  readonly isConfigMode: _angular_core.InputSignal<boolean>;
3283
+ /** Whether title is click-to-edit (builder mode only). */
3284
+ readonly titleEditable: _angular_core.InputSignal<boolean>;
1677
3285
  /** Action event output */
1678
3286
  readonly onAction: _angular_core.OutputEmitterRef<{
1679
3287
  type: string;
1680
3288
  data: any;
1681
3289
  }>;
3290
+ /** Emitted when the empty card "Configure datasource" CTA is clicked. */
3291
+ readonly onConfigure: _angular_core.OutputEmitterRef<void>;
3292
+ /** Emitted when title is edited inline. */
3293
+ readonly onTitleChange: _angular_core.OutputEmitterRef<string>;
1682
3294
  /** Configuration item */
1683
3295
  readonly configurationItem: _angular_core.WritableSignal<ItemConfig | null>;
1684
3296
  /** Handled chart data */
@@ -1704,12 +3316,41 @@ declare class ChartCardComponent implements OnInit, OnDestroy {
1704
3316
  readonly showStaticFilters: _angular_core.Signal<boolean | undefined>;
1705
3317
  /** Show dynamic filters */
1706
3318
  readonly showDynamicFilters: _angular_core.Signal<boolean>;
3319
+ /**
3320
+ * The visual mode the body should use, derived from componentName.
3321
+ * Falls back to 'echart' when not a special widget.
3322
+ */
3323
+ readonly componentViewMode: _angular_core.Signal<CardViewMode>;
3324
+ /**
3325
+ * Whether the chart needs configuration (no selection, no customApi, and
3326
+ * not a layout/special-endpoint widget).
3327
+ */
3328
+ readonly needsConfiguration: _angular_core.Signal<boolean>;
3329
+ /** Whether the user can act on the Configure CTA (builder mode). */
3330
+ readonly canConfigure: _angular_core.Signal<boolean>;
3331
+ readonly hasSplitterData: _angular_core.Signal<boolean>;
3332
+ readonly splitterOrientation: _angular_core.Signal<"vertical" | "horizontal">;
3333
+ readonly splitterGap: _angular_core.Signal<number>;
3334
+ readonly hasTimelineData: _angular_core.Signal<boolean>;
3335
+ readonly timelineEvents: _angular_core.Signal<any[]>;
3336
+ readonly timelineResources: _angular_core.Signal<any[]>;
3337
+ readonly timelineLabels: _angular_core.Signal<any[]>;
3338
+ readonly timelineEventsLimited: _angular_core.Signal<any[]>;
3339
+ readonly timelineEventsTruncated: _angular_core.Signal<boolean>;
3340
+ readonly hasPhaseGateData: _angular_core.Signal<boolean>;
3341
+ readonly phaseGateSteps: _angular_core.Signal<any[]>;
3342
+ readonly phaseGateCurrentIndex: _angular_core.Signal<number>;
3343
+ readonly phaseGateShowLabels: _angular_core.Signal<boolean>;
3344
+ readonly phaseGateCompact: _angular_core.Signal<boolean>;
1707
3345
  ngOnInit(): void;
1708
3346
  ngOnDestroy(): void;
1709
3347
  onChartClick(event: any): void;
1710
3348
  onHeaderClick(): void;
3349
+ onConfigureClick(event: Event): void;
3350
+ /** Format an ISO date for inline timeline display. */
3351
+ formatDate(value: any): string;
1711
3352
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartCardComponent, never>;
1712
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartCardComponent, "mt-chart-card", never, { "dashboardId": { "alias": "dashboardId"; "required": true; "isSignal": true; }; "inGroup": { "alias": "inGroup"; "required": false; "isSignal": true; }; "isConfigMode": { "alias": "isConfigMode"; "required": false; "isSignal": true; }; }, { "onAction": "onAction"; }, never, never, true, never>;
3353
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartCardComponent, "mt-chart-card", never, { "dashboardId": { "alias": "dashboardId"; "required": true; "isSignal": true; }; "inGroup": { "alias": "inGroup"; "required": false; "isSignal": true; }; "isConfigMode": { "alias": "isConfigMode"; "required": false; "isSignal": true; }; "titleEditable": { "alias": "titleEditable"; "required": false; "isSignal": true; }; }, { "onAction": "onAction"; "onConfigure": "onConfigure"; "onTitleChange": "onTitleChange"; }, never, never, true, never>;
1713
3354
  }
1714
3355
 
1715
3356
  type EChartsType = any;
@@ -2577,6 +4218,10 @@ declare class TableViewHandler {
2577
4218
  * Returns data directly (not wrapped in { type, data, config })
2578
4219
  */
2579
4220
  handleTableView(dataResponse: any, config: ItemConfig): any;
4221
+ /**
4222
+ * Legacy alias used by some old saved configs.
4223
+ */
4224
+ handleTableChart(dataResponse: any, config: ItemConfig): any;
2580
4225
  /**
2581
4226
  * Handle projects by execution period (special case)
2582
4227
  * Returns eCharts bar chart config directly (like old HandleProjectsByExecutionPeriod)
@@ -2839,6 +4484,25 @@ declare class RingGaugeChartHandler {
2839
4484
  * Returns ECharts option directly (same as old RingGaugeChartService)
2840
4485
  */
2841
4486
  handleRingGaugeChart(dataResponse: any, config: ItemConfig): any;
4487
+ /**
4488
+ * handleRingGaugeChartWithFormula
4489
+ *
4490
+ * Wraps the BarV2Chart formula response (series-based) into the same
4491
+ * `{ values: [object] }` shape that handleRingGaugeChart consumes, then
4492
+ * delegates rendering. Old FE method name is preserved so legacy configs
4493
+ * continue to resolve.
4494
+ *
4495
+ * Old configs sometimes used numeric/index-based property keys; we map
4496
+ * them to the named ring-gauge keys when configAsType.ringGaugeConfig is
4497
+ * available and otherwise fall back to whatever the response provides.
4498
+ */
4499
+ handleRingGaugeChartWithFormula(dataResponse: any, config: ItemConfig): any;
4500
+ /**
4501
+ * Convert BarV2Chart formula response into the ring-gauge `{ values: [obj] }`
4502
+ * shape expected by handleRingGaugeChart. Tolerant of multiple legacy
4503
+ * shapes.
4504
+ */
4505
+ private adaptFormulaResponseToRingGauge;
2842
4506
  /**
2843
4507
  * Helper method to return empty chart options
2844
4508
  */
@@ -2867,6 +4531,19 @@ declare class SPlusChartHandler {
2867
4531
  * Matches old SplusChartsService.handleGaugeChartSplus return format
2868
4532
  */
2869
4533
  handleGaugeChartSplus(data: any, config: ItemConfig): any;
4534
+ /**
4535
+ * handlePerformanceGaugeCardSplus
4536
+ *
4537
+ * Old SplusChartsService method. Extracts the current numeric value from
4538
+ * the chart response, resolves the configured component statuses, sorts
4539
+ * them, and chooses the active status based on the value's range. The
4540
+ * shape returned is what the `performanceGaugeCard` renderer consumes:
4541
+ * { performance: number, status: any, statuses: any[] }
4542
+ *
4543
+ * Compatible with old configs that stored componentId either as a numeric
4544
+ * id, `{type}_{id}` format inside selection.moduleId, or via selector.
4545
+ */
4546
+ handlePerformanceGaugeCardSplus(data: any, config: ItemConfig): any;
2870
4547
  /**
2871
4548
  * Handle S+ Component Cards Chart - returns transformed array directly
2872
4549
  * Matches old SplusChartsService.handleComponentsCardsChart return format
@@ -2946,7 +4623,12 @@ declare class PhaseGateStepperHandler {
2946
4623
  private readonly storeService;
2947
4624
  /**
2948
4625
  * handlePhaseGateStepperCard - matches functionName from CHART_TYPES
2949
- * Returns data directly matching old PhaseGateStepperService format
4626
+ * Returns data directly matching old PhaseGateStepperService format.
4627
+ *
4628
+ * Tolerates BE responses that arrive as: an array, an object with `phases`,
4629
+ * an object with `phaseGates`, or an object with `data`. Always returns
4630
+ * `{ phases, checkList, currentIndex, noData }` so the chart-card
4631
+ * phase-gate view-mode can render safely without further branching.
2950
4632
  */
2951
4633
  handlePhaseGateStepperCard(data: any, _configurationItem: any): any;
2952
4634
  /**
@@ -3408,9 +5090,22 @@ declare class DashboardBuilderService {
3408
5090
  */
3409
5091
  linkChart(request: LinkChartRequest): Observable<ApiResponse<void>>;
3410
5092
  /**
3411
- * Bulk link charts to a report (creates or updates links)
3412
- * @param requests Array of link requests
3413
- * @returns Array of link responses with id and chartComponentId
5093
+ * Bulk link charts to a report.
5094
+ *
5095
+ * Backend contract (Docs/DASHBOARD_BUILDER_API.md and ReportService.cs)
5096
+ * does not expose a `/charts/link/bulk` route. Old FE and the documented
5097
+ * surface only ship `POST /reports/charts/link` (single create-or-update).
5098
+ *
5099
+ * Strategy:
5100
+ * 1. Issue one POST per request to the documented single-link endpoint.
5101
+ * 2. Aggregate the responses into the same response shape consumers
5102
+ * expect (`BulkLinkChartResponse[]`), preserving order.
5103
+ * 3. Surface partial failures as null entries so the caller can still
5104
+ * patch the successful charts back to the grid (mirrors old behavior
5105
+ * where save was non-fatal per chart).
5106
+ *
5107
+ * If a host backend ever exposes a real bulk route, swap the inner call
5108
+ * for a single POST and keep the same outer signature.
3414
5109
  */
3415
5110
  linkChartsBulk(requests: BulkLinkChartRequest[]): Observable<ApiResponse<BulkLinkChartResponse[]>>;
3416
5111
  /**
@@ -3628,8 +5323,13 @@ declare class ManageFilterOnPage implements OnInit {
3628
5323
  ngOnInit(): void;
3629
5324
  /** Handle filter configuration changes */
3630
5325
  onFiltersChange(filters: FilterField[]): void;
3631
- /** Load level logs for a specific schema level (placeholder for API call) */
3632
- onLoadLevelLogs(schemaLevelId: number): void;
5326
+ /**
5327
+ * Hook for hosts that want to feed level-log values into the filter
5328
+ * dialog. The host listens to `(loadLevelLogs)` (when consumers wire it)
5329
+ * and pushes into `levelLogs`. Left intentionally unbound here so the
5330
+ * library does not depend on a specific level-logs endpoint shape.
5331
+ */
5332
+ onLoadLevelLogs(_schemaLevelId: number): void;
3633
5333
  /** Save and close the dialog */
3634
5334
  save(): void;
3635
5335
  /** Cancel and close the dialog */
@@ -3730,6 +5430,7 @@ declare class DefaultControlUi implements ControlValueAccessor {
3730
5430
 
3731
5431
  declare class ChartSettingsDrawer {
3732
5432
  private dialogRef;
5433
+ private transloco;
3733
5434
  private drawerConfig;
3734
5435
  readonly modal: ModalService;
3735
5436
  /** The chart item signal - reactive for proper change detection */
@@ -3747,12 +5448,44 @@ declare class ChartSettingsDrawer {
3747
5448
  value: string;
3748
5449
  icon: string;
3749
5450
  }[]>;
5451
+ /**
5452
+ * Pass-2: JSON draft for the Advanced Override tab. Initialized lazily
5453
+ * from the current clientConfig and held as a string so users can edit
5454
+ * freely. We validate before applying.
5455
+ */
5456
+ readonly advancedJsonDraft: _angular_core.WritableSignal<string>;
5457
+ /** Last known parse error (empty when JSON is currently valid). */
5458
+ readonly advancedJsonError: _angular_core.WritableSignal<string>;
5459
+ /** Whether the JSON draft has been initialized. */
5460
+ private advancedJsonInitialized;
5461
+ /** Initialize draft from current item if not yet seeded. */
5462
+ initAdvancedJsonIfNeeded(): void;
5463
+ /** Track edits to the JSON draft. */
5464
+ onAdvancedJsonChange(value: string): void;
5465
+ /**
5466
+ * Validate and DEEP-merge the Advanced JSON into the current
5467
+ * clientConfig. Never persists invalid JSON. Nested objects are merged
5468
+ * key-by-key so a partial patch like `{ configAsType: { icon: 'x' } }`
5469
+ * does not wipe out other `configAsType` keys. Arrays and primitives in
5470
+ * the draft replace the existing values.
5471
+ */
5472
+ applyAdvancedJson(): void;
3750
5473
  /** Resolve ChartTypeConfig from CHART_TYPES based on item config */
3751
5474
  readonly resolvedChartType: _angular_core.Signal<ChartTypeConfig | null>;
3752
5475
  /** ItemConfig computed for DisplaySettings input */
3753
5476
  readonly itemConfig: _angular_core.Signal<ItemConfig | null>;
3754
5477
  /** Determine the type of manage UI to show */
3755
5478
  readonly manageType: _angular_core.Signal<QuickManageType>;
5479
+ /**
5480
+ * Pass-4: capability + control schema used by the schema-driven default
5481
+ * branch. Resolved from the working item via the manifest, with the same
5482
+ * legacy-alias resolution the rest of the popover/drawer uses.
5483
+ */
5484
+ readonly capability: _angular_core.Signal<_masterteam_dashboard_builder.ChartCapability | null>;
5485
+ /** Schema for the current chart type (or fallback). */
5486
+ readonly schemaForItem: _angular_core.Signal<_masterteam_dashboard_builder.ControlSchema>;
5487
+ /** Apply a single schema-driven control patch to the working item. */
5488
+ onSchemaPatch(patch: ControlPatch): void;
3756
5489
  /** Default control config mapped from item config */
3757
5490
  readonly defaultControlConfig: _angular_core.Signal<DefaultControlConfig>;
3758
5491
  /** Pie chart config - note: typo "Overried" matches old implementation */
@@ -3976,8 +5709,14 @@ declare class DisplaySettings {
3976
5709
  * Each chart type maps to comma-separated list of visible fields
3977
5710
  */
3978
5711
  private readonly chartTypeFieldsMap;
3979
- /** Computed fields to show based on chart type */
3980
- readonly fieldsToShow: _angular_core.Signal<string>;
5712
+ /**
5713
+ * Pass-4: visible field list is now derived from the manifest's
5714
+ * `display.fields` via `buildDisplayFieldPredicate` (with the legacy
5715
+ * hand-curated map preserved as a union fallback). Adding a chart in the
5716
+ * manifest now automatically gives it the correct field surface — the
5717
+ * giant in-component map no longer needs editing per chart type.
5718
+ */
5719
+ private readonly fieldPredicate;
3981
5720
  /** Check if a field should be shown */
3982
5721
  shouldShowField(fieldName: string): boolean;
3983
5722
  shouldShowPropertiesViewSettings(): boolean;
@@ -4510,6 +6249,7 @@ declare class ManageItem implements OnInit {
4510
6249
  private _dialogConfig;
4511
6250
  readonly modal: ModalService;
4512
6251
  ref: ModalRef<any> | null;
6252
+ private transloco;
4513
6253
  /** Input data from drawer - supports both input() and dialog data */
4514
6254
  readonly data: _angular_core.InputSignal<{
4515
6255
  chart?: DashboardChartItem;
@@ -4522,11 +6262,17 @@ declare class ManageItem implements OnInit {
4522
6262
  };
4523
6263
  services?: readonly string[] | null;
4524
6264
  informativeContext?: DashboardInformativeContext | null;
6265
+ /**
6266
+ * Pass-2: which tab to open the drawer on. Configure CTA on the empty
6267
+ * chart card sends `dataSource` so the user lands directly on the
6268
+ * datasource flow rather than on General.
6269
+ */
6270
+ defaultTab?: "general" | "dataSource" | "actions";
4525
6271
  } | null>;
4526
6272
  /** Whether chart type is pre-selected (hides type selection) */
4527
6273
  readonly hasPreselectedType: _angular_core.Signal<boolean>;
4528
6274
  /** Tab options with translation keys */
4529
- readonly tabOptions: _angular_core.WritableSignal<{
6275
+ readonly tabOptions: _angular_core.Signal<{
4530
6276
  label: string;
4531
6277
  value: string;
4532
6278
  icon: string;
@@ -4766,6 +6512,7 @@ type QueryComponentType = 'general' | 'table' | 'timeline' | 'timelineMultiLevel
4766
6512
  */
4767
6513
  declare class DataSourceSettings {
4768
6514
  private dashboardService;
6515
+ private transloco;
4769
6516
  /** Current configuration */
4770
6517
  readonly config: _angular_core.InputSignal<ItemConfig | null>;
4771
6518
  /** Selected chart type */
@@ -4792,21 +6539,40 @@ declare class DataSourceSettings {
4792
6539
  * Built from selections with their loaded module info
4793
6540
  */
4794
6541
  readonly selectionModules: _angular_core.Signal<SelectionModule[]>;
4795
- /** Query component type based on chart type and component name */
6542
+ /**
6543
+ * Query component type — driven by the chart capability registry.
6544
+ *
6545
+ * Resolution order:
6546
+ * 1. Manifest by chart id (most precise).
6547
+ * 2. Manifest by (serviceType, componentName, functionName) tuple,
6548
+ * including legacy aliases.
6549
+ * 3. Default to 'general' (matches old FE behavior for unknown charts).
6550
+ */
4796
6551
  readonly queryComponentType: _angular_core.Signal<QueryComponentType>;
4797
6552
  /** Loading states */
4798
6553
  readonly loadingProperties: _angular_core.WritableSignal<boolean>;
6554
+ /**
6555
+ * Pass-2: progressive-disclosure mode. `simple` shows only required fields
6556
+ * + the most-common fields per chart type. `advanced` reveals every field
6557
+ * (including custom API, source links, and per-property advanced options).
6558
+ * No fields are removed in either mode — only their visibility is gated.
6559
+ */
6560
+ readonly disclosureMode: _angular_core.WritableSignal<"advanced" | "simple">;
6561
+ /** Whether the user is in advanced mode. */
6562
+ readonly isAdvanced: _angular_core.Signal<boolean>;
6563
+ /** Toggle simple/advanced. */
6564
+ onDisclosureToggle(advanced: boolean): void;
4799
6565
  /** Tab state: 'selection' or 'customApi' */
4800
6566
  readonly activeTab: _angular_core.WritableSignal<"selection" | "customApi">;
4801
6567
  /** Selection mode inside the selection tab */
4802
- readonly selectionMode: _angular_core.WritableSignal<"context" | "advanced">;
6568
+ readonly selectionMode: _angular_core.WritableSignal<"advanced" | "context">;
4803
6569
  readonly contextTargetSelector: _angular_core.WritableSignal<string | null>;
4804
6570
  readonly contextTargetApplyToken: _angular_core.WritableSignal<number>;
4805
6571
  /** Tab options for display */
4806
- readonly tabOptions: {
6572
+ readonly tabOptions: _angular_core.Signal<{
4807
6573
  id: string;
4808
6574
  label: string;
4809
- }[];
6575
+ }[]>;
4810
6576
  /** Custom API configuration */
4811
6577
  readonly customApi: _angular_core.WritableSignal<CustomApi | null>;
4812
6578
  /** Internal selections state */
@@ -4836,6 +6602,13 @@ declare class DataSourceSettings {
4836
6602
  private readonly moduleKeysSignature;
4837
6603
  /** Track last loaded module signature to prevent duplicate requests */
4838
6604
  private lastLoadedSignature;
6605
+ /**
6606
+ * Pass-2 guard: track whether we've already initialized the activeTab from
6607
+ * a saved config. The Custom API ↔ Selection auto-switch should only run
6608
+ * on the first config load, not on every subsequent edit; otherwise the
6609
+ * user gets yanked off the Custom API tab when editing a sibling field.
6610
+ */
6611
+ private tabInitializedFromConfig;
4839
6612
  constructor();
4840
6613
  /**
4841
6614
  * Load properties for all selections using bulk API
@@ -4904,9 +6677,59 @@ declare class DataSourceSettings {
4904
6677
  */
4905
6678
  onGroupByMultipleChange(values: string[]): void;
4906
6679
  /**
4907
- * Handle repeater dashboard selection
6680
+ * Handle repeater dashboard selection.
6681
+ *
6682
+ * Canonical persisted shape: `serviceConfig.query = { dashboardRepeated, selectedProperties }`.
6683
+ * The legacy root `repeaterDashboardId` is no longer written.
6684
+ */
6685
+ onRepeaterDashboardChange(dashboardId: number | null): void;
6686
+ /**
6687
+ * Selected properties for repeater (also used for timeline multi-level
6688
+ * extra columns and phaseGate input fallback).
6689
+ */
6690
+ onRepeaterSelectedPropertiesChange(values: string[]): void;
6691
+ /**
6692
+ * Phase Gate query: a single levelId field (static or dynamic placeholder).
6693
+ */
6694
+ onPhaseGateLevelIdChange(value: string): void;
6695
+ /**
6696
+ * Timeline Multi-Level: list of per-level configurations + extra
6697
+ * selected properties. Auto-fills selectedProperties.
6698
+ */
6699
+ onTimelineMultiLevelChange(query: any): void;
6700
+ /**
6701
+ * Add an empty timeline-multi-level entry.
6702
+ */
6703
+ addTimelineLevel(): void;
6704
+ /**
6705
+ * Remove a level by index.
6706
+ */
6707
+ removeTimelineLevel(index: number): void;
6708
+ /**
6709
+ * Update a single field on a single level.
6710
+ */
6711
+ updateTimelineLevelField(index: number, field: string, value: any): void;
6712
+ /**
6713
+ * Reads the current repeater query — convenience accessor for the template.
6714
+ */
6715
+ readonly repeaterSelectedProperties: _angular_core.Signal<string[]>;
6716
+ /**
6717
+ * Reads the phaseGate levelId — convenience accessor for the template.
6718
+ */
6719
+ readonly phaseGateLevelId: _angular_core.Signal<string>;
6720
+ /**
6721
+ * Reads the current timeline-multi-level query for the template.
6722
+ */
6723
+ readonly timelineLevels: _angular_core.Signal<any[]>;
6724
+ readonly timeFrameOptions: {
6725
+ value: string;
6726
+ label: string;
6727
+ }[];
6728
+ /**
6729
+ * Loads available dashboards for the repeater dropdown by hitting the
6730
+ * configured reports list. Uses Dashboard type only.
4908
6731
  */
4909
- onRepeaterDashboardChange(dashboardId: number): void;
6732
+ private loadAvailableDashboardsForRepeater;
4910
6733
  /**
4911
6734
  * Handle isNormalized change
4912
6735
  */
@@ -5096,5 +6919,5 @@ declare class GetChartActionsPipe implements PipeTransform {
5096
6919
  */
5097
6920
  declare function cloneDeep<T>(obj: T): T;
5098
6921
 
5099
- export { ActionsSettings, BarChartHandler, BarControlUi, CHART_TYPES, CardContentComponent, CardFilterComponent, CardInfoComponent, ChartCardComponent, ChartDataService, ChartSettingsDrawer, ChartViewer, ComparisonChartHandler, DashboardBuilder, DashboardBuilderService, DashboardItem, DashboardItemStoreService, DashboardList, DashboardStoreService, DashboardViewer, DataSourceSettings, DefaultControlUi, DisplaySettings, DynamicFiltersComponent, DynamicFiltersConfig, EChartComponent, PropertiesCardComponent as EntitiesPreviewCardComponent, EntityInfoComponent, EntityPreviewCardComponent, FilterByGroupPipe, GaugeChartHandler, GeneralSettings, GetChartActionsPipe, HTTPMethod, HeaderCardComponent, LevelCardHandler, LineChartHandler, ListStatisticCardComponent, ManageBreadcrumb, ManageFilterOnPage, ManageItem, ManageItemService, ManagePages, MapChartHandler, OverviewCardHandler, PhaseGateStepperHandler, PieChartHandler, PieControlUi, PropertiesCardComponent, RingGaugeChartHandler, SPlusChartHandler, SkeletonCardComponent, SnapshotHandler, SplitterChartHandler, StackBarChartHandler, StackBarControlUi, StaticFiltersComponent, StatisticCardComponent, TableCardComponent, TableViewHandler, TimelineHandler, TopbarCardComponent, addCommasToNumber, axisFormatters, cloneDeep, createAxisFormatter, createTooltipFormatter, dynamicReorder, dynamicTextReplace, formatCurrency, formatDate, formatNumber, formatPercentage, formatValue, formatWordsUnderBar, formatXAxis, generalConfiguration, getColorFromConditions, getLocalizedTitle, getNestedData, groupDatesByYearAndMonth, handleFilterForCard, handleFilterForSnapshot, handleFiltersForCustom, isMobilePlatform, sortChartData, sortDataTableView, switchAllKeysSmall, switchAllKeysToLower };
5100
- export type { ActionConfig, ApiResponse, BarChartData, BreadcrumbItem, BulkLinkChartRequest, BulkLinkChartResponse, BulkPropertiesRequest, BulkPropertiesResponse, BulkPropertiesResponseItem, BulkPropertiesResponseItemDto, BulkPropertyRequestItem, CardBorderStyleConfig, CardInfoConfig$1 as CardInfoConfig, CardStyleConfig$1 as CardStyleConfig, CatalogPropertyDto, ChartActionEvent, ChartActionsContext, ChartData, ChartDataHandled, ChartLabel, ChartLinkConfiguration, ChartTypeConfig, ClientConfig, ComponentType, CustomApi, DashboardBuilderData, DashboardChartItem, DashboardChartTemplate, DashboardDialogItem, DashboardInformativeContext, DashboardItemStore, DashboardListEvent, DashboardPage, DashboardTargetOption, DashboardTargetPathStep, DashboardTargetTemplateFilter, DashboardTargetTemplateSelection, DashboardTargetTemplateSourceLink, DashboardTargetsContextInfo, DashboardTargetsResponse, DisplayConfig, EChartSeriesItem, ExcelSheet, FilterConfig, FilterOption, FormatXAxisConfig$1 as FormatXAxisConfig, GroupedModuleOption, HandleAction, HeaderCardConfig$1 as HeaderCardConfig, IModule, IModuleType, IProperty, IPropertyWithGroup, ISelection, ItemConfig, LevelCardData, LevelCardProperty, LinkChartRequest, LocalizedName, ModuleItem, ModuleSelectOption, ModuleType, ModuleValue, ModulesTreeRequest, ModulesTreeResponse, PhaseGateProperty, PhaseGateStep, PieChartData, PropertiesResponse, PropertyItem, PropertyItemOption, PropertyItemsResponse, QuickManageType, Report, ReportChartLink, ReportDashboardConfig, ReportExcelConfig, ReportType, ReportUrl, RequestType, SelectionFilter, ServiceConfig, ServiceItem, SourceLink, StaticFilterConfig, StaticFilterItem, StatisticCardData, StyleConfig, TableColumn$1 as TableColumn, TableViewData, TimelineData, TimelineItem, UnlinkChartRequest };
6922
+ export { ActionsSettings, BarChartHandler, BarControlUi, CHART_CAPABILITIES, CHART_TYPES, CONFIG_DOMAINS, CardContentComponent, CardFilterComponent, CardInfoComponent, ChartCardComponent, ChartDataService, ChartFilterDrawer, ChartSettingsDrawer, ChartViewer, ComparisonChartHandler, DashboardBuilder, DashboardBuilderService, DashboardItem, DashboardItemStoreService, DashboardList, DashboardStoreService, DashboardViewer, DataSourceSettings, DatasourcePanelComponent, DefaultControlUi, DisplaySettings, DynamicFiltersComponent, DynamicFiltersConfig, EChartComponent, PropertiesCardComponent as EntitiesPreviewCardComponent, EntityInfoComponent, EntityPreviewCardComponent, FilterBuilderComponent, FilterByGroupPipe, FilterChipsBarComponent, GaugeChartHandler, GeneralSettings, GetChartActionsPipe, GuidedConfigDialogComponent, HTTPMethod, HeaderCardComponent, ITEM_GUIDANCE_REGISTRY, ItemCardMenuComponent, ItemConfigPopoverComponent, ItemContextToolbarComponent, ItemGuidanceService, LevelCardHandler, LineChartHandler, ListStatisticCardComponent, ManageBreadcrumb, ManageFilterOnPage, ManageItem, ManageItemService, ManagePages, MapChartHandler, OverviewCardHandler, POPOVER_TABS, POPOVER_TAB_SPECS, PhaseGateStepperHandler, PieChartHandler, PieControlUi, PropertiesCardComponent, RingGaugeChartHandler, SPlusChartHandler, STYLE_PRESETS, SchemaControlRendererComponent, SkeletonCardComponent, SnapshotHandler, SplitterChartHandler, StackBarChartHandler, StackBarControlUi, StaticFiltersComponent, StatisticCardComponent, TableCardComponent, TableViewHandler, TimelineHandler, TopbarCardComponent, addCommasToNumber, applyBehaviorToPersisted, applyControlPatchToPersisted, applyControlPatchesToPersisted, applyFilterChipsToPersisted, applyLabelLegendFormatToPersisted, applyLayoutToPersisted, applyStyleToPersisted, applyTitleToPersisted, axisFormatters, behaviorToUi, bindingKey, buildAssembly, buildDisplayFieldPredicate, cloneDeep, createAxisFormatter, createTooltipFormatter, datasourceToUi, deepMerge, describeGuidance, domainsForCapability, dynamicReorder, dynamicTextReplace, fieldsToUi, filtersToUi, findDomain, findPreset, flattenSchema, formatCurrency, formatDate, formatForEditor, formatNumber, formatPercentage, formatValue, formatWordsUnderBar, formatXAxis, generalConfiguration, getBinding, getCapabilityById, getColorFromConditions, getControlSchema, getFallbackControlSchema, getLocalizedTitle, getNestedData, groupDatesByYearAndMonth, groupIssuesByDomain, handleFilterForCard, handleFilterForSnapshot, handleFiltersForCustom, hasBlockingIssues, isMobilePlatform, labelLegendFormatToUi, layoutToUi, listBindings, listBindingsForChart, listControlSchemaIds, listControlSchemas, moduleIdFromSelector, normalizeBeforeRequest, normalizeBeforeSave, normalizeChartTypeForRequest, normalizeFilterOperation, normalizeFilters, normalizeOnLoad, parseAdvancedJson, persistedToUi, presetsForCapability, readBoundValue, readByPath, resolveCapability, resolveDisplayFields, selectorFromLegacy, setByPath, sortChartData, sortDataTableView, styleToUi, switchAllKeysSmall, switchAllKeysToLower, titleToUi, toBackendChartType, toBackendSourceLink, validate };
6923
+ export type { ActionConfig, ApiResponse, BackendChartType, BarChartData, BehaviorUi, BindingScope, BreadcrumbItem, BulkLinkChartRequest, BulkLinkChartResponse, BulkPropertiesRequest, BulkPropertiesResponse, BulkPropertiesResponseItem, BulkPropertiesResponseItemDto, BulkPropertyRequestItem, CardBorderStyleConfig, CardInfoConfig$1 as CardInfoConfig, CardStyleConfig$1 as CardStyleConfig, CatalogPropertyDto, ChartActionEvent, ChartActionsContext, ChartCapability, ChartCapabilityLegacyAliases, RequestType$1 as ChartCapabilityRequestType, ChartData, ChartDataHandled, ChartDomainSupport, ChartLabel, ChartLinkConfiguration, ChartTypeConfig, ClientConfig, ComponentType, ConfigDomainKey, ConfigDomainSpec, ConfigLookupShape, ConfigViewAssembly, ControlBinding, ControlBindingIndex, ControlBindingValueAdapter, ControlDomain, ControlField, ControlFieldType, ControlOption, ControlPatch, ControlSchema, ControlSection, ControlSectionScope, ControlVisiblePredicate, CustomApi, DashboardBuilderData, DashboardChartItem, DashboardChartTemplate, DashboardDialogItem, DashboardInformativeContext, DashboardItemStore, DashboardListEvent, DashboardPage, DashboardTargetOption, DashboardTargetPathStep, DashboardTargetTemplateFilter, DashboardTargetTemplateSelection, DashboardTargetTemplateSourceLink, DashboardTargetsContextInfo, DashboardTargetsResponse, DatasourceUi, DisplayConfig, DisplayField, DisplayFieldQuery, DisplaySchema, EChartSeriesItem, ExcelSheet, FieldAssignment, FieldsUi, FilterChip, FilterConfig, FilterOperator, FilterOption, FilterScope, FilterSource, FiltersUi, FlattenedControl, FormatXAxisConfig$1 as FormatXAxisConfig, GroupedModuleOption, GuidanceInput, GuidedConfigDialogData, GuidedConfigDialogResult, GuidedStep, HandleAction, HeaderCardConfig$1 as HeaderCardConfig, IModule, IModuleType, IProperty, IPropertyWithGroup, ISelection, ItemCardMenuAction, ItemConfig, ItemConfigPopoverData, ItemConfigPopoverResult, ItemContextAction, ItemGuidanceAction, ItemGuidanceDescriptor, ItemGuidanceSeverity, ItemGuidanceState, LabelLegendFormatUi, LayoutUi, LevelCardData, LevelCardProperty, LinkChartRequest, LocalizedName, ModuleItem, ModuleSelectOption, ModuleType, ModuleValue, ModulesTreeRequest, ModulesTreeResponse, ParseResult, PersistedItemConfig, PhaseGateProperty, PhaseGateStep, PieChartData, PopoverTab, PopoverTabSpec, Product, PropertiesResponse, PropertyItem, PropertyItemOption, PropertyItemsResponse, QueryEditorKind, QueryField, QuerySchema, QuickManageType, RendererKey, Report, ReportChartLink, ReportDashboardConfig, ReportExcelConfig, ReportType, ReportUrl, RequestType, RuntimeItemConfig, SelectionFilter, ServiceConfig, ServiceItem, SourceLink, StaticFilterConfig, StaticFilterItem, StatisticCardData, StyleConfig, StylePreset, StylePresetKey, StyleUi, TableColumn$1 as TableColumn, TableViewData, TimelineData, TimelineItem, TitleUi, UiItemConfig, UnlinkChartRequest, ValidateOptions, ValidationIssue, ValidationSeverity };