@memberjunction/ng-clustering 0.0.1 → 5.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +441 -27
- package/dist/__tests__/clustering-service.test.d.ts +2 -0
- package/dist/__tests__/clustering-service.test.d.ts.map +1 -0
- package/dist/__tests__/clustering-service.test.js +487 -0
- package/dist/__tests__/clustering-service.test.js.map +1 -0
- package/dist/__tests__/clustering-types.test.d.ts +2 -0
- package/dist/__tests__/clustering-types.test.d.ts.map +1 -0
- package/dist/__tests__/clustering-types.test.js +254 -0
- package/dist/__tests__/clustering-types.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +7 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/scatter-component-logic.test.d.ts +2 -0
- package/dist/__tests__/scatter-component-logic.test.d.ts.map +1 -0
- package/dist/__tests__/scatter-component-logic.test.js +494 -0
- package/dist/__tests__/scatter-component-logic.test.js.map +1 -0
- package/dist/lib/cluster-config-panel.component.d.ts +274 -0
- package/dist/lib/cluster-config-panel.component.d.ts.map +1 -0
- package/dist/lib/cluster-config-panel.component.js +732 -0
- package/dist/lib/cluster-config-panel.component.js.map +1 -0
- package/dist/lib/cluster-scatter.component.d.ts +572 -0
- package/dist/lib/cluster-scatter.component.d.ts.map +1 -0
- package/dist/lib/cluster-scatter.component.js +1410 -0
- package/dist/lib/cluster-scatter.component.js.map +1 -0
- package/dist/lib/clustering.module.d.ts +12 -0
- package/dist/lib/clustering.module.d.ts.map +1 -0
- package/dist/lib/clustering.module.js +38 -0
- package/dist/lib/clustering.module.js.map +1 -0
- package/dist/lib/clustering.service.d.ts +43 -0
- package/dist/lib/clustering.service.d.ts.map +1 -0
- package/dist/lib/clustering.service.js +253 -0
- package/dist/lib/clustering.service.js.map +1 -0
- package/dist/lib/clustering.types.d.ts +271 -0
- package/dist/lib/clustering.types.d.ts.map +1 -0
- package/dist/lib/clustering.types.js +74 -0
- package/dist/lib/clustering.types.js.map +1 -0
- package/dist/public-api.d.ts +6 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +11 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +41 -6
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Floating glass-morphism configuration panel for clustering.
|
|
3
|
+
*
|
|
4
|
+
* `ClusterConfigPanelComponent` provides a draggable floating panel with
|
|
5
|
+
* entity picker, algorithm picker, parameter sliders, distance metric
|
|
6
|
+
* selector, max records input, run button, and result metrics display.
|
|
7
|
+
*
|
|
8
|
+
* It emits cancelable `BeforeXXX` events so consumers can intercept and
|
|
9
|
+
* validate before clustering starts or a visualization is saved.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```html
|
|
13
|
+
* <mj-cluster-config-panel
|
|
14
|
+
* [IsRunning]="isRunning"
|
|
15
|
+
* [Metrics]="result?.Metrics ?? null"
|
|
16
|
+
* [EntityOptions]="myEntityOptions"
|
|
17
|
+
* [ShowSaveButton]="true"
|
|
18
|
+
* [DefaultAlgorithm]="'dbscan'"
|
|
19
|
+
* [Collapsed]="false"
|
|
20
|
+
* (BeforeRunClustering)="onBeforeRun($event)"
|
|
21
|
+
* (RunClustering)="onRunClustering($event)"
|
|
22
|
+
* (ConfigChanged)="onConfigChanged($event)"
|
|
23
|
+
* (SaveVisualization)="onSave()">
|
|
24
|
+
* </mj-cluster-config-panel>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
28
|
+
import { ClusterConfig, ClusterConfigPanelEntityOption, ClusterConfigPanelEntityDocOption, ClusterMetrics, ClusterAlgorithm, ClusterDistanceMetric, CancelableEvent } from './clustering.types';
|
|
29
|
+
import * as i0 from "@angular/core";
|
|
30
|
+
export declare class ClusterConfigPanelComponent implements OnInit, OnDestroy {
|
|
31
|
+
private cdr;
|
|
32
|
+
/**
|
|
33
|
+
* Whether a clustering run is currently in progress.
|
|
34
|
+
*
|
|
35
|
+
* When `true`, the Run button is disabled and shows a spinner.
|
|
36
|
+
*
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
IsRunning: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Result metrics from the most recent clustering run.
|
|
42
|
+
*
|
|
43
|
+
* When non-null, the metrics section is displayed at the bottom
|
|
44
|
+
* of the panel showing silhouette score, cluster count, etc.
|
|
45
|
+
*/
|
|
46
|
+
Metrics: ClusterMetrics | null;
|
|
47
|
+
/**
|
|
48
|
+
* Entity options for the dropdown.
|
|
49
|
+
*
|
|
50
|
+
* The parent component is responsible for populating this list,
|
|
51
|
+
* typically from MJ Metadata or a subset filtered by
|
|
52
|
+
* `AvailableEntities`.
|
|
53
|
+
*/
|
|
54
|
+
private _entityOptions;
|
|
55
|
+
set EntityOptions(value: ClusterConfigPanelEntityOption[]);
|
|
56
|
+
get EntityOptions(): ClusterConfigPanelEntityOption[];
|
|
57
|
+
/** Entity Document options for the selected entity. Only shown when 2+ docs exist. */
|
|
58
|
+
EntityDocOptions: ClusterConfigPanelEntityDocOption[];
|
|
59
|
+
/**
|
|
60
|
+
* Whether to display the "Save this visualization" link.
|
|
61
|
+
*
|
|
62
|
+
* @default true
|
|
63
|
+
*/
|
|
64
|
+
ShowSaveButton: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Whether to display the algorithm picker dropdown.
|
|
67
|
+
*
|
|
68
|
+
* When `false`, the algorithm is fixed to `DefaultAlgorithm`.
|
|
69
|
+
*
|
|
70
|
+
* @default true
|
|
71
|
+
*/
|
|
72
|
+
ShowAlgorithmPicker: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Whether to display the distance metric picker dropdown.
|
|
75
|
+
*
|
|
76
|
+
* @default true
|
|
77
|
+
*/
|
|
78
|
+
ShowMetricPicker: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Default algorithm selection when the panel initializes.
|
|
81
|
+
*
|
|
82
|
+
* @default 'kmeans'
|
|
83
|
+
*/
|
|
84
|
+
DefaultAlgorithm: ClusterAlgorithm;
|
|
85
|
+
/**
|
|
86
|
+
* Restrict the entity picker to a specific list of entity names.
|
|
87
|
+
*
|
|
88
|
+
* When empty (the default), all entity options from the
|
|
89
|
+
* `EntityOptions` input are shown. When non-empty, only entities
|
|
90
|
+
* whose `Name` appears in this array are shown.
|
|
91
|
+
*
|
|
92
|
+
* @default []
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```html
|
|
96
|
+
* <mj-cluster-config-panel
|
|
97
|
+
* [AvailableEntities]="['Companies', 'Contacts', 'Deals']">
|
|
98
|
+
* </mj-cluster-config-panel>
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
AvailableEntities: string[];
|
|
102
|
+
/**
|
|
103
|
+
* Whether the panel starts in a collapsed (minimized) state.
|
|
104
|
+
*
|
|
105
|
+
* The user can toggle between collapsed and expanded by clicking
|
|
106
|
+
* the collapse chevron in the panel header.
|
|
107
|
+
*
|
|
108
|
+
* @default false
|
|
109
|
+
*/
|
|
110
|
+
Collapsed: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Emitted when the user clicks Run and `BeforeRunClustering` was not
|
|
113
|
+
* canceled. Payload is a snapshot of the current config.
|
|
114
|
+
*/
|
|
115
|
+
RunClustering: EventEmitter<ClusterConfig>;
|
|
116
|
+
/**
|
|
117
|
+
* Emitted when the user clicks the Save link and `BeforeSave` was
|
|
118
|
+
* not canceled.
|
|
119
|
+
*/
|
|
120
|
+
SaveVisualization: EventEmitter<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Fires **before** a clustering run starts. Set `event.Cancel = true`
|
|
123
|
+
* to prevent the run (e.g., for validation).
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* onBeforeRun(event: CancelableEvent<ClusterConfig>): void {
|
|
128
|
+
* if (!event.Data.EntityName) {
|
|
129
|
+
* event.Cancel = true;
|
|
130
|
+
* alert('Please select an entity first.');
|
|
131
|
+
* }
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
BeforeRunClustering: EventEmitter<CancelableEvent<ClusterConfig>>;
|
|
136
|
+
/**
|
|
137
|
+
* Fires **before** a visualization is saved. Set `event.Cancel = true`
|
|
138
|
+
* to prevent the save (e.g., to prompt for a name first).
|
|
139
|
+
*/
|
|
140
|
+
BeforeSave: EventEmitter<CancelableEvent<ClusterConfig>>;
|
|
141
|
+
/**
|
|
142
|
+
* Fires whenever any configuration value changes (entity, algorithm,
|
|
143
|
+
* K, epsilon, distance metric, max records, filter).
|
|
144
|
+
*
|
|
145
|
+
* Payload is a snapshot of the entire config at the time of change.
|
|
146
|
+
*/
|
|
147
|
+
ConfigChanged: EventEmitter<ClusterConfig>;
|
|
148
|
+
/**
|
|
149
|
+
* Fires specifically when the algorithm selection changes.
|
|
150
|
+
*
|
|
151
|
+
* Useful for showing/hiding algorithm-specific UI in the parent.
|
|
152
|
+
*/
|
|
153
|
+
AlgorithmChanged: EventEmitter<ClusterAlgorithm>;
|
|
154
|
+
/** The working configuration object. */
|
|
155
|
+
Config: ClusterConfig;
|
|
156
|
+
/** Filtered entity list for display (filtered by AvailableEntities). */
|
|
157
|
+
FilteredEntityOptions: ClusterConfigPanelEntityOption[];
|
|
158
|
+
/** Whether the panel body is currently visible. */
|
|
159
|
+
IsExpanded: boolean;
|
|
160
|
+
/** Algorithm options for the dropdown. */
|
|
161
|
+
AlgorithmOptions: Array<{
|
|
162
|
+
Value: ClusterAlgorithm;
|
|
163
|
+
Label: string;
|
|
164
|
+
}>;
|
|
165
|
+
/** Distance metric options for the dropdown. */
|
|
166
|
+
MetricOptions: Array<{
|
|
167
|
+
Value: ClusterDistanceMetric;
|
|
168
|
+
Label: string;
|
|
169
|
+
}>;
|
|
170
|
+
/** Current panel top offset in pixels. */
|
|
171
|
+
PanelTop: number;
|
|
172
|
+
/** Current panel left offset in pixels. */
|
|
173
|
+
PanelLeft: number;
|
|
174
|
+
private isDragging;
|
|
175
|
+
private dragStartX;
|
|
176
|
+
private dragStartY;
|
|
177
|
+
private dragStartTop;
|
|
178
|
+
private dragStartLeft;
|
|
179
|
+
private boundOnMouseMove;
|
|
180
|
+
private boundOnMouseUp;
|
|
181
|
+
private panelRef;
|
|
182
|
+
ngOnInit(): void;
|
|
183
|
+
ngOnDestroy(): void;
|
|
184
|
+
/**
|
|
185
|
+
* Whether the current algorithm is K-Means (controls which
|
|
186
|
+
* parameter sliders are shown).
|
|
187
|
+
*/
|
|
188
|
+
get IsKMeans(): boolean;
|
|
189
|
+
/**
|
|
190
|
+
* Handle algorithm dropdown change.
|
|
191
|
+
*
|
|
192
|
+
* @param value New algorithm value string.
|
|
193
|
+
*/
|
|
194
|
+
OnAlgorithmChanged(value: string): void;
|
|
195
|
+
/**
|
|
196
|
+
* Handle distance metric dropdown change.
|
|
197
|
+
*
|
|
198
|
+
* @param value New metric value string.
|
|
199
|
+
*/
|
|
200
|
+
OnMetricChanged(value: string): void;
|
|
201
|
+
/**
|
|
202
|
+
* Handle entity dropdown change.
|
|
203
|
+
*
|
|
204
|
+
* @param value New entity name.
|
|
205
|
+
*/
|
|
206
|
+
OnEntityChanged(value: string): void;
|
|
207
|
+
/**
|
|
208
|
+
* Handle changes to any numeric/text config field (K, Epsilon,
|
|
209
|
+
* MinPoints, MaxRecords, Filter).
|
|
210
|
+
*/
|
|
211
|
+
OnFieldChanged(): void;
|
|
212
|
+
/**
|
|
213
|
+
* Handle Run button click. Fires `BeforeRunClustering`, and if not
|
|
214
|
+
* canceled, emits `RunClustering`.
|
|
215
|
+
*/
|
|
216
|
+
OnRun(): void;
|
|
217
|
+
/**
|
|
218
|
+
* Handle Save link click. Fires `BeforeSave`, and if not canceled,
|
|
219
|
+
* emits `SaveVisualization`.
|
|
220
|
+
*/
|
|
221
|
+
OnSave(): void;
|
|
222
|
+
/**
|
|
223
|
+
* Toggle the panel between expanded and collapsed states.
|
|
224
|
+
*/
|
|
225
|
+
ToggleCollapse(): void;
|
|
226
|
+
/**
|
|
227
|
+
* Format a silhouette score to 2 decimal places.
|
|
228
|
+
*
|
|
229
|
+
* @param score The raw silhouette score.
|
|
230
|
+
* @returns Formatted string (e.g., `"0.72"`).
|
|
231
|
+
*/
|
|
232
|
+
FormatSilhouette(score: number): string;
|
|
233
|
+
/**
|
|
234
|
+
* Whether a silhouette score indicates good clustering quality.
|
|
235
|
+
*
|
|
236
|
+
* @param score The silhouette score to evaluate.
|
|
237
|
+
* @returns `true` if score >= 0.5.
|
|
238
|
+
*/
|
|
239
|
+
IsSilhouetteGood(score: number): boolean;
|
|
240
|
+
/**
|
|
241
|
+
* Format a computation time in milliseconds to a human-readable string.
|
|
242
|
+
*
|
|
243
|
+
* @param ms Milliseconds.
|
|
244
|
+
* @returns e.g., `"1.2s"` or `"450ms"`.
|
|
245
|
+
*/
|
|
246
|
+
FormatTime(ms: number): string;
|
|
247
|
+
/**
|
|
248
|
+
* Start dragging the panel via header mousedown.
|
|
249
|
+
*
|
|
250
|
+
* @param event The native mouse event.
|
|
251
|
+
*/
|
|
252
|
+
OnHeaderMouseDown(event: MouseEvent): void;
|
|
253
|
+
/** @internal TrackBy for algorithm options. */
|
|
254
|
+
TrackAlgorithmBy(_index: number, item: {
|
|
255
|
+
Value: string;
|
|
256
|
+
}): string;
|
|
257
|
+
/** @internal TrackBy for metric options. */
|
|
258
|
+
TrackMetricBy(_index: number, item: {
|
|
259
|
+
Value: string;
|
|
260
|
+
}): string;
|
|
261
|
+
/** @internal TrackBy for entity options. */
|
|
262
|
+
TrackEntityBy(_index: number, item: ClusterConfigPanelEntityOption): string;
|
|
263
|
+
/**
|
|
264
|
+
* Rebuild the filtered entity list based on `AvailableEntities`.
|
|
265
|
+
*/
|
|
266
|
+
private rebuildFilteredEntities;
|
|
267
|
+
/** Emit `ConfigChanged` with a snapshot of the current config. */
|
|
268
|
+
private emitConfigChanged;
|
|
269
|
+
private onMouseMove;
|
|
270
|
+
private onMouseUp;
|
|
271
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ClusterConfigPanelComponent, never>;
|
|
272
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ClusterConfigPanelComponent, "mj-cluster-config-panel", never, { "IsRunning": { "alias": "IsRunning"; "required": false; }; "Metrics": { "alias": "Metrics"; "required": false; }; "EntityOptions": { "alias": "EntityOptions"; "required": false; }; "EntityDocOptions": { "alias": "EntityDocOptions"; "required": false; }; "ShowSaveButton": { "alias": "ShowSaveButton"; "required": false; }; "ShowAlgorithmPicker": { "alias": "ShowAlgorithmPicker"; "required": false; }; "ShowMetricPicker": { "alias": "ShowMetricPicker"; "required": false; }; "DefaultAlgorithm": { "alias": "DefaultAlgorithm"; "required": false; }; "AvailableEntities": { "alias": "AvailableEntities"; "required": false; }; "Collapsed": { "alias": "Collapsed"; "required": false; }; }, { "RunClustering": "RunClustering"; "SaveVisualization": "SaveVisualization"; "BeforeRunClustering": "BeforeRunClustering"; "BeforeSave": "BeforeSave"; "ConfigChanged": "ConfigChanged"; "AlgorithmChanged": "AlgorithmChanged"; }, never, never, false, never>;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=cluster-config-panel.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-config-panel.component.d.ts","sourceRoot":"","sources":["../../src/lib/cluster-config-panel.component.ts"],"names":[],"mappings":"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"}
|