@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.
- package/assets/dashboard-builder.css +1 -1
- package/assets/i18n/ar.json +197 -1
- package/assets/i18n/en.json +197 -1
- package/fesm2022/{masterteam-dashboard-builder-dashboard-dialog.component-6PBzu1af.mjs → masterteam-dashboard-builder-dashboard-dialog.component-Xq2tqP-P.mjs} +74 -28
- package/fesm2022/masterteam-dashboard-builder-dashboard-dialog.component-Xq2tqP-P.mjs.map +1 -0
- package/fesm2022/masterteam-dashboard-builder.mjs +14784 -3160
- package/fesm2022/masterteam-dashboard-builder.mjs.map +1 -1
- package/package.json +3 -3
- package/types/masterteam-dashboard-builder.d.ts +1851 -28
- package/fesm2022/masterteam-dashboard-builder-dashboard-dialog.component-6PBzu1af.mjs.map +0 -1
|
@@ -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
|
|
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
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
3412
|
-
*
|
|
3413
|
-
*
|
|
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
|
-
/**
|
|
3632
|
-
|
|
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
|
-
/**
|
|
3980
|
-
|
|
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.
|
|
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
|
-
/**
|
|
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<"
|
|
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
|
-
|
|
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 };
|