@smartnet360/svelte-components 0.0.103 โ 0.0.104
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/dist/apps/site-check/SiteCheck.svelte +11 -77
- package/dist/apps/site-check/SiteCheckControls.svelte +0 -7
- package/dist/apps/site-check/helper.js +0 -33
- package/dist/apps/site-check/transforms.js +15 -65
- package/dist/core/CellTable/CellTable.svelte +456 -0
- package/dist/core/CellTable/CellTable.svelte.d.ts +27 -0
- package/dist/core/CellTable/CellTablePanel.svelte +211 -0
- package/dist/core/CellTable/CellTablePanel.svelte.d.ts +49 -0
- package/dist/core/CellTable/CellTableToolbar.svelte +218 -0
- package/dist/core/CellTable/CellTableToolbar.svelte.d.ts +32 -0
- package/dist/core/CellTable/column-config.d.ts +63 -0
- package/dist/core/CellTable/column-config.js +465 -0
- package/dist/core/CellTable/index.d.ts +10 -0
- package/dist/core/CellTable/index.js +11 -0
- package/dist/core/CellTable/types.d.ts +166 -0
- package/dist/core/CellTable/types.js +6 -0
- package/dist/core/Charts/ChartCard.svelte +0 -23
- package/dist/core/Charts/ChartComponent.svelte +0 -25
- package/dist/core/Charts/data-processor.js +1 -19
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +2 -0
- package/package.json +3 -2
- package/dist/apps/site-check/transforms-old.d.ts +0 -56
- package/dist/apps/site-check/transforms-old.js +0 -273
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
import { ChartComponent, type Layout, type CellStylingConfig } from '../../core/Charts';
|
|
6
6
|
import { buildTreeNodes, filterChartData, transformChartData, type CellTrafficRecord, defaultCellStyling, type TreeGroupingConfig, type TreeGroupField, type ColorDimension, defaultTreeGrouping } from './index';
|
|
7
7
|
import { expandLayoutForCells } from './helper';
|
|
8
|
-
import { log } from '../../core/logger';
|
|
9
8
|
import type {ChartMarker, Mode } from '../../index.js';
|
|
10
9
|
import { checkHealth } from '../../core/FeatureRegistry';
|
|
11
10
|
import SiteCheckControls from './SiteCheckControls.svelte';
|
|
@@ -52,24 +51,16 @@
|
|
|
52
51
|
|
|
53
52
|
// Rebuild tree whenever treeGrouping, singleRootSelect, or singleLevel1Select changes
|
|
54
53
|
$effect(() => {
|
|
55
|
-
|
|
56
|
-
log('๐ Rebuilding tree with grouping', { treeGrouping, singleRootSelect, singleLevel1Select });
|
|
57
|
-
|
|
58
54
|
// Clear any existing localStorage data to prevent stale state
|
|
59
55
|
// This includes both tree state AND chart settings to avoid cell mismatches
|
|
60
56
|
if (typeof window !== 'undefined') {
|
|
61
57
|
localStorage.removeItem('site-check:treeState');
|
|
62
58
|
localStorage.removeItem('charts:globalControls');
|
|
63
|
-
log('๐งน Cleared localStorage: tree state and chart settings');
|
|
64
59
|
}
|
|
65
60
|
|
|
66
61
|
// Build tree nodes from raw data with custom grouping
|
|
67
62
|
const treeNodes = buildTreeNodes(rawData, treeGrouping);
|
|
68
|
-
|
|
69
|
-
nodeCount: treeNodes.length,
|
|
70
|
-
firstNode: treeNodes[0],
|
|
71
|
-
grouping: treeGrouping
|
|
72
|
-
});
|
|
63
|
+
|
|
73
64
|
if(!isHealthy) {
|
|
74
65
|
return;
|
|
75
66
|
}
|
|
@@ -82,55 +73,24 @@
|
|
|
82
73
|
singleRootSelect, // Pass single root select mode
|
|
83
74
|
singleLevel1Select // Pass single Level 1 select mode
|
|
84
75
|
});
|
|
85
|
-
log('โ
Tree Store Created', {
|
|
86
|
-
namespace: 'site-check',
|
|
87
|
-
grouping: treeGrouping,
|
|
88
|
-
singleRootSelect,
|
|
89
|
-
singleLevel1Select
|
|
90
|
-
});
|
|
91
76
|
});
|
|
92
77
|
|
|
93
78
|
// Derive chart data from tree selection
|
|
94
79
|
let filteredData = $derived.by(() => {
|
|
95
80
|
if (!treeStore) return [];
|
|
96
|
-
|
|
97
|
-
log('๐ Filtered Data:', {
|
|
98
|
-
totalRaw: rawData.length,
|
|
99
|
-
checkedPaths: Array.from(treeStore.state.checkedPaths),
|
|
100
|
-
filteredCount: filtered.length,
|
|
101
|
-
cells: Array.from(new Set(filtered.map(r => r.cellName)))
|
|
102
|
-
});
|
|
103
|
-
return filtered;
|
|
81
|
+
return filterChartData(rawData, treeStore.state.checkedPaths);
|
|
104
82
|
});
|
|
105
83
|
|
|
106
84
|
// Transform data using base metrics from layout
|
|
107
85
|
let chartData = $derived.by(() => {
|
|
108
|
-
|
|
109
|
-
log('๐ Chart Data:', {
|
|
110
|
-
filteredRows: filteredData.length,
|
|
111
|
-
transformedRows: transformed.length,
|
|
112
|
-
baseMetrics,
|
|
113
|
-
sampleRow: transformed[0],
|
|
114
|
-
columns: transformed[0] ? Object.keys(transformed[0]) : []
|
|
115
|
-
});
|
|
116
|
-
return transformed;
|
|
86
|
+
return transformChartData(filteredData, baseMetrics);
|
|
117
87
|
});
|
|
118
88
|
|
|
119
89
|
// Expand layout based on selected cells and chosen base layout
|
|
120
90
|
let chartLayout = $derived.by(() => {
|
|
121
91
|
// Pass cellStyling, treeGrouping, colorDimension, and useSectorLineStyles - helper will decide per-section whether to use styling,
|
|
122
92
|
// and generate appropriate labels based on grouping, colors based on colorDimension, and line styles based on useSectorLineStyles
|
|
123
|
-
|
|
124
|
-
log('๐ Chart Layout:', {
|
|
125
|
-
layoutName: selectedBaseLayout.layoutName,
|
|
126
|
-
layoutDefaultColors: selectedBaseLayout.useDefaultChartColors ?? false,
|
|
127
|
-
sectionsCount: expanded.sections.length,
|
|
128
|
-
totalCharts: expanded.sections.reduce((sum, s) => sum + s.charts.length, 0),
|
|
129
|
-
firstSection: expanded.sections[0],
|
|
130
|
-
grouping: treeGrouping,
|
|
131
|
-
colorDimension
|
|
132
|
-
});
|
|
133
|
-
return expanded;
|
|
93
|
+
return expandLayoutForCells(selectedBaseLayout, filteredData, treeGrouping, colorDimension, useSectorLineStyles, cellStyling);
|
|
134
94
|
});
|
|
135
95
|
|
|
136
96
|
let totalRecords = $derived(rawData.length);
|
|
@@ -138,14 +98,10 @@
|
|
|
138
98
|
|
|
139
99
|
// Compute simple stats
|
|
140
100
|
let totalCells = $derived.by(() => {
|
|
141
|
-
|
|
142
|
-
log('๐ฑ Total Cells:', count);
|
|
143
|
-
return count;
|
|
101
|
+
return new Set(filteredData.map((r) => r.cellName)).size;
|
|
144
102
|
});
|
|
145
103
|
let totalSites = $derived.by(() => {
|
|
146
|
-
|
|
147
|
-
log('๐ก Total Sites:', count);
|
|
148
|
-
return count;
|
|
104
|
+
return new Set(filteredData.map((r) => r.siteName)).size;
|
|
149
105
|
});
|
|
150
106
|
|
|
151
107
|
// Detect cell technology (LTE vs NR) for single-cell layout selection
|
|
@@ -155,45 +111,23 @@
|
|
|
155
111
|
const cell = filteredData[0];
|
|
156
112
|
const band = cell?.band?.toUpperCase() || '';
|
|
157
113
|
|
|
158
|
-
if (band.startsWith('LTE'))
|
|
159
|
-
|
|
160
|
-
return 'LTE';
|
|
161
|
-
}
|
|
162
|
-
if (band.startsWith('NR') || band.startsWith('5G')) {
|
|
163
|
-
log('๐ก Detected Technology: NR', { band });
|
|
164
|
-
return 'NR';
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
log('๐ก Detected Technology: UNKNOWN', { band });
|
|
114
|
+
if (band.startsWith('LTE')) return 'LTE';
|
|
115
|
+
if (band.startsWith('NR') || band.startsWith('5G')) return 'NR';
|
|
168
116
|
return 'UNKNOWN';
|
|
169
117
|
});
|
|
170
118
|
|
|
171
119
|
// Select appropriate layout based on cell count and technology
|
|
172
120
|
let selectedBaseLayout = $derived.by(() => {
|
|
173
121
|
// Multiple cells โ always use multi-cell layout
|
|
174
|
-
if (totalCells !== 1)
|
|
175
|
-
log('๐ Layout Selection: Multi-cell (count=' + totalCells + ')');
|
|
176
|
-
return multiCellLayout;
|
|
177
|
-
}
|
|
122
|
+
if (totalCells !== 1) return multiCellLayout;
|
|
178
123
|
|
|
179
124
|
// Single LTE cell โ use LTE layout if available, otherwise fallback
|
|
180
|
-
if (cellTechnology === 'LTE' && singleLteLayout)
|
|
181
|
-
log('๐ Layout Selection: Single LTE (optimized)');
|
|
182
|
-
return singleLteLayout;
|
|
183
|
-
}
|
|
125
|
+
if (cellTechnology === 'LTE' && singleLteLayout) return singleLteLayout;
|
|
184
126
|
|
|
185
127
|
// Single NR cell โ use NR layout if available, otherwise fallback
|
|
186
|
-
if (cellTechnology === 'NR' && singleNrLayout)
|
|
187
|
-
log('๐ Layout Selection: Single NR (optimized)');
|
|
188
|
-
return singleNrLayout;
|
|
189
|
-
}
|
|
128
|
+
if (cellTechnology === 'NR' && singleNrLayout) return singleNrLayout;
|
|
190
129
|
|
|
191
130
|
// Fallback to multi-cell layout for single cells (works fine)
|
|
192
|
-
log('๐ Layout Selection: Multi-cell (fallback for single cell)', {
|
|
193
|
-
technology: cellTechnology,
|
|
194
|
-
lteLayout: !!singleLteLayout,
|
|
195
|
-
nrLayout: !!singleNrLayout
|
|
196
|
-
});
|
|
197
131
|
return multiCellLayout;
|
|
198
132
|
});
|
|
199
133
|
</script>
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<svelte:options runes={true} />
|
|
2
2
|
|
|
3
3
|
<script lang="ts">
|
|
4
|
-
import { log } from '../../core/logger';
|
|
5
4
|
import type { TreeGroupingConfig, TreeGroupField, ColorDimension } from './index';
|
|
6
5
|
|
|
7
6
|
interface Props {
|
|
@@ -68,7 +67,6 @@
|
|
|
68
67
|
function handleSearch() {
|
|
69
68
|
if (onSearch) {
|
|
70
69
|
onSearch(searchTerm);
|
|
71
|
-
log('๐ Search triggered:', searchTerm);
|
|
72
70
|
}
|
|
73
71
|
}
|
|
74
72
|
|
|
@@ -76,7 +74,6 @@
|
|
|
76
74
|
searchTerm = '';
|
|
77
75
|
if (onSearch) {
|
|
78
76
|
onSearch('');
|
|
79
|
-
log('๐งน Search cleared');
|
|
80
77
|
}
|
|
81
78
|
}
|
|
82
79
|
|
|
@@ -100,12 +97,10 @@
|
|
|
100
97
|
|
|
101
98
|
function handleColorDimensionChange(dimension: ColorDimension) {
|
|
102
99
|
onColorDimensionChange?.(dimension);
|
|
103
|
-
log('๐จ Color dimension changed:', dimension);
|
|
104
100
|
}
|
|
105
101
|
|
|
106
102
|
function handleSingleRootSelectChange(enabled: boolean) {
|
|
107
103
|
onSingleRootSelectChange?.(enabled);
|
|
108
|
-
log('๐ Single root select mode:', enabled);
|
|
109
104
|
|
|
110
105
|
// When enabling single root mode, uncheck all roots except the first one
|
|
111
106
|
if (enabled && treeStore) {
|
|
@@ -115,7 +110,6 @@
|
|
|
115
110
|
store.state.checkedPaths.has(path)
|
|
116
111
|
);
|
|
117
112
|
if (checkedRoots.length > 1) {
|
|
118
|
-
log('๐ Multiple roots selected, keeping only first one:', checkedRoots[0]);
|
|
119
113
|
for (let i = 1; i < checkedRoots.length; i++) {
|
|
120
114
|
store.toggle(checkedRoots[i]);
|
|
121
115
|
}
|
|
@@ -126,7 +120,6 @@
|
|
|
126
120
|
|
|
127
121
|
function handleSingleLevel1SelectChange(enabled: boolean) {
|
|
128
122
|
onSingleLevel1SelectChange?.(enabled);
|
|
129
|
-
log('๐ Single Level 1 select mode:', enabled);
|
|
130
123
|
}
|
|
131
124
|
</script>
|
|
132
125
|
|
|
@@ -103,36 +103,3 @@ export function extractBaseMetrics(layout) {
|
|
|
103
103
|
});
|
|
104
104
|
return Array.from(metrics);
|
|
105
105
|
}
|
|
106
|
-
/**
|
|
107
|
-
* Get a distinct color for each cell line
|
|
108
|
-
* Uses a predefined color palette with good contrast
|
|
109
|
-
*/
|
|
110
|
-
function getColorForIndex(index) {
|
|
111
|
-
const colors = [
|
|
112
|
-
'#0d6efd', // Blue
|
|
113
|
-
'#198754', // Green
|
|
114
|
-
'#dc3545', // Red
|
|
115
|
-
'#ffc107', // Yellow
|
|
116
|
-
'#0dcaf0', // Cyan
|
|
117
|
-
'#6f42c1', // Purple
|
|
118
|
-
'#fd7e14', // Orange
|
|
119
|
-
'#20c997', // Teal
|
|
120
|
-
'#d63384', // Pink
|
|
121
|
-
'#6610f2', // Indigo
|
|
122
|
-
'#17a2b8', // Info
|
|
123
|
-
'#28a745', // Success
|
|
124
|
-
'#e83e8c', // Magenta
|
|
125
|
-
'#6c757d', // Gray
|
|
126
|
-
'#007bff', // Primary
|
|
127
|
-
'#28a745', // Green variant
|
|
128
|
-
'#17a2b8', // Cyan variant
|
|
129
|
-
'#ffc107', // Amber
|
|
130
|
-
'#dc3545', // Danger
|
|
131
|
-
'#343a40', // Dark
|
|
132
|
-
'#6c757d', // Secondary
|
|
133
|
-
'#fd7e14', // Orange variant
|
|
134
|
-
'#20c997', // Teal variant
|
|
135
|
-
'#6f42c1' // Violet
|
|
136
|
-
];
|
|
137
|
-
return colors[index % colors.length];
|
|
138
|
-
}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Data Transforms for Site Check Component
|
|
3
3
|
* Converts raw CSV data to TreeView nodes and Chart configurations
|
|
4
4
|
*/
|
|
5
|
-
import { log } from '../../core/logger';
|
|
6
5
|
/**
|
|
7
6
|
* Generate a deterministic, production-safe stackgroup ID
|
|
8
7
|
* This function ensures stackgroups are:
|
|
@@ -37,16 +36,17 @@ export function createStackGroupId(value, mode) {
|
|
|
37
36
|
export function assignStackGroups(kpis, cells, mode) {
|
|
38
37
|
// Create a mapping of cellName โ metadata for quick lookup
|
|
39
38
|
const cellMetadata = new Map(cells);
|
|
40
|
-
|
|
39
|
+
// Track missing cells for aggregated warning
|
|
40
|
+
const missingCells = [];
|
|
41
|
+
const result = kpis.map(kpi => {
|
|
41
42
|
// Extract cellName from the rawName (format: "METRIC_CELLNAME")
|
|
42
43
|
const cellName = kpi.rawName.split('_').slice(1).join('_');
|
|
43
44
|
const record = cellMetadata.get(cellName);
|
|
44
45
|
if (!record) {
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
});
|
|
46
|
+
// Track missing cell for aggregated warning
|
|
47
|
+
if (!missingCells.includes(cellName)) {
|
|
48
|
+
missingCells.push(cellName);
|
|
49
|
+
}
|
|
50
50
|
return {
|
|
51
51
|
...kpi,
|
|
52
52
|
stackGroup: createStackGroupId(null, mode)
|
|
@@ -77,18 +77,16 @@ export function assignStackGroups(kpis, cells, mode) {
|
|
|
77
77
|
}
|
|
78
78
|
// Create deterministic stackgroup ID
|
|
79
79
|
const stackGroup = createStackGroupId(groupValue, mode);
|
|
80
|
-
log('๐ Assigned stackgroup', {
|
|
81
|
-
kpiName: kpi.name,
|
|
82
|
-
cellName,
|
|
83
|
-
mode,
|
|
84
|
-
groupValue,
|
|
85
|
-
stackGroup
|
|
86
|
-
});
|
|
87
80
|
return {
|
|
88
81
|
...kpi,
|
|
89
82
|
stackGroup
|
|
90
83
|
};
|
|
91
84
|
});
|
|
85
|
+
// Log aggregated warning if any cells were missing
|
|
86
|
+
if (missingCells.length > 0) {
|
|
87
|
+
console.warn(`[SiteCheck] ${missingCells.length} cells not found for KPIs, using default stackgroup. Cells: ${missingCells.slice(0, 5).join(', ')}${missingCells.length > 5 ? ` (+${missingCells.length - 5} more)` : ''}`);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
92
90
|
}
|
|
93
91
|
/**
|
|
94
92
|
* Band frequency mapping for consistent ordering
|
|
@@ -155,11 +153,6 @@ export function sortCellsByBandFrequency(items) {
|
|
|
155
153
|
* @param grouping - Tree grouping configuration (defaults to Site โ Azimuth โ Cell)
|
|
156
154
|
*/
|
|
157
155
|
export function buildTreeNodes(data, grouping = { level0: 'site', level1: 'azimuth' }) {
|
|
158
|
-
log('๐ Building tree nodes', {
|
|
159
|
-
recordCount: data.length,
|
|
160
|
-
grouping,
|
|
161
|
-
treeDepth: grouping.level1 === null ? 2 : 3
|
|
162
|
-
});
|
|
163
156
|
// Check if this is a 2-level tree (no level1)
|
|
164
157
|
if (grouping.level1 === null) {
|
|
165
158
|
return build2LevelTree(data, grouping);
|
|
@@ -237,11 +230,6 @@ export function buildTreeNodes(data, grouping = { level0: 'site', level1: 'azimu
|
|
|
237
230
|
});
|
|
238
231
|
treeNodes.push(level0Node);
|
|
239
232
|
});
|
|
240
|
-
log('โ
Tree nodes built', {
|
|
241
|
-
totalNodes: treeNodes.length,
|
|
242
|
-
grouping,
|
|
243
|
-
sampleNode: treeNodes[0]?.label
|
|
244
|
-
});
|
|
245
233
|
return treeNodes;
|
|
246
234
|
}
|
|
247
235
|
/**
|
|
@@ -299,11 +287,6 @@ function build2LevelTree(data, grouping) {
|
|
|
299
287
|
});
|
|
300
288
|
treeNodes.push(level0Node);
|
|
301
289
|
});
|
|
302
|
-
log('โ
2-level tree nodes built', {
|
|
303
|
-
totalNodes: treeNodes.length,
|
|
304
|
-
grouping: `${grouping.level0} โ cell`,
|
|
305
|
-
sampleNode: treeNodes[0]?.label
|
|
306
|
-
});
|
|
307
290
|
return treeNodes;
|
|
308
291
|
}
|
|
309
292
|
/**
|
|
@@ -351,14 +334,10 @@ function compareValues(a, b) {
|
|
|
351
334
|
}
|
|
352
335
|
/**
|
|
353
336
|
* Get icon emoji based on band technology
|
|
337
|
+
* Currently disabled - returns empty string to keep tree labels clean
|
|
354
338
|
*/
|
|
355
|
-
function getBandIcon(
|
|
339
|
+
function getBandIcon(_band) {
|
|
356
340
|
return '';
|
|
357
|
-
if (band.startsWith('NR'))
|
|
358
|
-
return '๐ถ'; // 5G
|
|
359
|
-
if (band.startsWith('LTE'))
|
|
360
|
-
return '๐ฑ'; // 4G
|
|
361
|
-
return '๐ก'; // Fallback
|
|
362
341
|
}
|
|
363
342
|
/**
|
|
364
343
|
* Filter chart data based on selected tree paths
|
|
@@ -366,11 +345,6 @@ function getBandIcon(band) {
|
|
|
366
345
|
* Handles both 2-level (level0:cellName) and 3-level (level0:level1:cellName) paths
|
|
367
346
|
*/
|
|
368
347
|
export function filterChartData(data, checkedPaths) {
|
|
369
|
-
log('๐ Filtering chart data', {
|
|
370
|
-
totalRecords: data.length,
|
|
371
|
-
checkedPathsCount: checkedPaths.size,
|
|
372
|
-
paths: Array.from(checkedPaths)
|
|
373
|
-
});
|
|
374
348
|
// Extract cell names from checked leaf paths
|
|
375
349
|
const selectedCells = new Set();
|
|
376
350
|
checkedPaths.forEach((path) => {
|
|
@@ -385,12 +359,7 @@ export function filterChartData(data, checkedPaths) {
|
|
|
385
359
|
}
|
|
386
360
|
});
|
|
387
361
|
// Filter data to only include selected cells
|
|
388
|
-
|
|
389
|
-
log('โ
Filtered chart data', {
|
|
390
|
-
selectedCells: Array.from(selectedCells),
|
|
391
|
-
filteredCount: filtered.length
|
|
392
|
-
});
|
|
393
|
-
return filtered;
|
|
362
|
+
return data.filter((record) => selectedCells.has(record.cellName));
|
|
394
363
|
}
|
|
395
364
|
/**
|
|
396
365
|
* Transform data for chart component consumption
|
|
@@ -401,10 +370,6 @@ export function filterChartData(data, checkedPaths) {
|
|
|
401
370
|
* @param baseMetrics - Array of metric names to pivot (e.g., ['DL_GBYTES', 'UL_GBYTES'])
|
|
402
371
|
*/
|
|
403
372
|
export function transformChartData(data, baseMetrics) {
|
|
404
|
-
log('๐ Transforming chart data', {
|
|
405
|
-
rowCount: data.length,
|
|
406
|
-
baseMetrics
|
|
407
|
-
});
|
|
408
373
|
// Group data by date
|
|
409
374
|
const dateMap = new Map();
|
|
410
375
|
data.forEach((record) => {
|
|
@@ -435,10 +400,6 @@ export function transformChartData(data, baseMetrics) {
|
|
|
435
400
|
});
|
|
436
401
|
// Sort by date
|
|
437
402
|
pivotedData.sort((a, b) => a.TIMESTAMP.localeCompare(b.TIMESTAMP));
|
|
438
|
-
log('โ
Chart data transformed', {
|
|
439
|
-
outputRows: pivotedData.length,
|
|
440
|
-
sampleColumns: pivotedData[0] ? Object.keys(pivotedData[0]) : []
|
|
441
|
-
});
|
|
442
403
|
return pivotedData;
|
|
443
404
|
}
|
|
444
405
|
/**
|
|
@@ -508,17 +469,6 @@ export function createStyledKPI(metricName, cellRecord, unit, grouping, colorDim
|
|
|
508
469
|
...(color && { color }),
|
|
509
470
|
...(lineStyle && { lineStyle })
|
|
510
471
|
};
|
|
511
|
-
log('๐จ Styled KPI created', {
|
|
512
|
-
metricName,
|
|
513
|
-
cellName,
|
|
514
|
-
displayName,
|
|
515
|
-
band,
|
|
516
|
-
sector,
|
|
517
|
-
azimuth,
|
|
518
|
-
colorDimension,
|
|
519
|
-
color,
|
|
520
|
-
lineStyle
|
|
521
|
-
});
|
|
522
472
|
return kpi;
|
|
523
473
|
}
|
|
524
474
|
/**
|