cds-caching 1.2.0 → 1.3.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 +195 -1114
- package/app/dashboard/Component-dbg.js +59 -0
- package/app/dashboard/Component-dbg.js.map +1 -0
- package/app/dashboard/Component.js +2 -0
- package/app/dashboard/Component.js.map +1 -0
- package/app/dashboard/Component.ts +59 -0
- package/app/dashboard/controller/App-dbg.controller.js +132 -0
- package/app/dashboard/controller/App-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/App.controller.js +2 -0
- package/app/dashboard/controller/App.controller.js.map +1 -0
- package/app/dashboard/controller/App.controller.ts +147 -0
- package/app/dashboard/controller/BaseController-dbg.js +75 -0
- package/app/dashboard/controller/BaseController-dbg.js.map +1 -0
- package/app/dashboard/controller/BaseController.js +2 -0
- package/app/dashboard/controller/BaseController.js.map +1 -0
- package/app/dashboard/controller/BaseController.ts +88 -0
- package/app/dashboard/controller/Cache-dbg.controller.js +421 -0
- package/app/dashboard/controller/Cache-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/Cache.controller.js +2 -0
- package/app/dashboard/controller/Cache.controller.js.map +1 -0
- package/app/dashboard/controller/Cache.controller.ts +490 -0
- package/app/dashboard/controller/Main-dbg.controller.js +32 -0
- package/app/dashboard/controller/Main-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/Main.controller.js +2 -0
- package/app/dashboard/controller/Main.controller.js.map +1 -0
- package/app/dashboard/controller/Main.controller.ts +31 -0
- package/app/dashboard/controller/SingleMetric-dbg.controller.js +306 -0
- package/app/dashboard/controller/SingleMetric-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/SingleMetric.controller.js +2 -0
- package/app/dashboard/controller/SingleMetric.controller.js.map +1 -0
- package/app/dashboard/controller/SingleMetric.controller.ts +335 -0
- package/app/dashboard/i18n/i18n.properties +61 -0
- package/app/dashboard/i18n/i18n_de.properties +3 -0
- package/app/dashboard/i18n/i18n_en.properties +3 -0
- package/app/dashboard/index-cdn.html +28 -0
- package/app/dashboard/index.html +19 -0
- package/app/dashboard/manifest.json +145 -0
- package/app/dashboard/model/formatter-dbg.js +253 -0
- package/app/dashboard/model/formatter-dbg.js.map +1 -0
- package/app/dashboard/model/formatter.js +2 -0
- package/app/dashboard/model/formatter.js.map +1 -0
- package/app/dashboard/model/formatter.ts +275 -0
- package/app/dashboard/model/models-dbg.js +13 -0
- package/app/dashboard/model/models-dbg.js.map +1 -0
- package/app/dashboard/model/models.js +2 -0
- package/app/dashboard/model/models.js.map +1 -0
- package/app/dashboard/model/models.ts +13 -0
- package/app/dashboard/resources/sap-ui-custom-dbg.js +4695 -0
- package/app/dashboard/resources/sap-ui-custom-dbg.js.map +1 -0
- package/app/dashboard/resources/sap-ui-custom.js +5794 -0
- package/app/dashboard/resources/sap-ui-custom.js.map +1 -0
- package/app/dashboard/service/CacheStatisticsService-dbg.js +267 -0
- package/app/dashboard/service/CacheStatisticsService-dbg.js.map +1 -0
- package/app/dashboard/service/CacheStatisticsService.js +2 -0
- package/app/dashboard/service/CacheStatisticsService.js.map +1 -0
- package/app/dashboard/service/CacheStatisticsService.ts +397 -0
- package/app/dashboard/view/App.view.xml +18 -0
- package/app/dashboard/view/Cache.view.xml +777 -0
- package/app/dashboard/view/Main.view.xml +57 -0
- package/app/dashboard/view/SingleMetric.view.xml +337 -0
- package/cds-plugin.js +52 -0
- package/db/cache-store.cds +12 -0
- package/db/statistics.cds +128 -0
- package/index.cds +2 -128
- package/lib/CachingService.js +13 -0
- package/lib/add.js +17 -0
- package/lib/operations/AsyncOperations.js +162 -111
- package/lib/operations/BasicOperations.js +35 -0
- package/lib/operations/CapOperations.js +92 -40
- package/lib/support/CacheStatisticsHandler.js +35 -10
- package/lib/support/CacheStoreManager.js +29 -0
- package/lib/support/KeyvCDS.js +149 -0
- package/lib/support/MultitenancyDetector.js +25 -0
- package/lib/support/RuntimeConfigurationManager.js +69 -37
- package/lib/support/StatisticsPersistenceManager.js +18 -2
- package/lib/support/Telemetry.js +137 -0
- package/lib/util.js +29 -11
- package/package.json +44 -12
- package/srv/caching-api-service.js +47 -2
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
sap.ui.define(["sap/m/library"], function (sap_m_library) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const ValueColor = sap_m_library["ValueColor"];
|
|
5
|
+
/**
|
|
6
|
+
* Formatter utility for cache statistics dashboard
|
|
7
|
+
*/
|
|
8
|
+
var __exports = {
|
|
9
|
+
formatIntegerValue(value) {
|
|
10
|
+
if (value === null || value === undefined || value === 0) {
|
|
11
|
+
return "0";
|
|
12
|
+
}
|
|
13
|
+
return `${value.toFixed(0)}`;
|
|
14
|
+
},
|
|
15
|
+
formatNumberValue(value) {
|
|
16
|
+
if (value === null || value === undefined || value === 0) {
|
|
17
|
+
return "0";
|
|
18
|
+
}
|
|
19
|
+
return `${value.toFixed(2)}`;
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* Format percentage values
|
|
23
|
+
*/
|
|
24
|
+
formatPercentage(value) {
|
|
25
|
+
if (value === null || value === undefined) {
|
|
26
|
+
return "0%";
|
|
27
|
+
}
|
|
28
|
+
return `${(value * 100).toFixed(1)}%`;
|
|
29
|
+
},
|
|
30
|
+
formatPercentageValue(value) {
|
|
31
|
+
if (value === null || value === undefined) {
|
|
32
|
+
return "0";
|
|
33
|
+
}
|
|
34
|
+
return `${(value * 100).toFixed(1)}`;
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Format latency values in milliseconds
|
|
38
|
+
*/
|
|
39
|
+
formatLatency(value) {
|
|
40
|
+
if (value === null || value === undefined) {
|
|
41
|
+
return "0ms";
|
|
42
|
+
}
|
|
43
|
+
// Make sure value is a number
|
|
44
|
+
const numberValue = Number(value);
|
|
45
|
+
if (numberValue < 1) {
|
|
46
|
+
return `${(numberValue * 1000).toFixed(2)}μs`;
|
|
47
|
+
}
|
|
48
|
+
return `${numberValue.toFixed(2)}ms`;
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Format memory usage in human readable format
|
|
52
|
+
*/
|
|
53
|
+
formatMemoryUsage(bytes) {
|
|
54
|
+
if (bytes === null || bytes === undefined) {
|
|
55
|
+
return "0 B";
|
|
56
|
+
}
|
|
57
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
58
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
59
|
+
return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Format throughput (requests per second)
|
|
63
|
+
*/
|
|
64
|
+
formatThroughput(value) {
|
|
65
|
+
if (value === null || value === undefined) {
|
|
66
|
+
return "0 req/s";
|
|
67
|
+
}
|
|
68
|
+
return `${value.toFixed(2)} req/s`;
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* Format cache efficiency ratio
|
|
72
|
+
*/
|
|
73
|
+
formatCacheEfficiency(value) {
|
|
74
|
+
if (value === null || value === undefined || value === 0) {
|
|
75
|
+
return "N/A";
|
|
76
|
+
}
|
|
77
|
+
if (value < 1) {
|
|
78
|
+
return `${(value * 100).toFixed(1)}%`;
|
|
79
|
+
}
|
|
80
|
+
return `${value.toFixed(1)}x`;
|
|
81
|
+
},
|
|
82
|
+
/**
|
|
83
|
+
* Format uptime in human readable format
|
|
84
|
+
*/
|
|
85
|
+
formatUptime(ms) {
|
|
86
|
+
if (ms === null || ms === undefined) {
|
|
87
|
+
return "0s";
|
|
88
|
+
}
|
|
89
|
+
const seconds = Math.floor(ms / 1000);
|
|
90
|
+
const minutes = Math.floor(seconds / 60);
|
|
91
|
+
const hours = Math.floor(minutes / 60);
|
|
92
|
+
const days = Math.floor(hours / 24);
|
|
93
|
+
if (days > 0) {
|
|
94
|
+
return `${days}d ${hours % 24}h ${minutes % 60}m`;
|
|
95
|
+
} else if (hours > 0) {
|
|
96
|
+
return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
|
|
97
|
+
} else if (minutes > 0) {
|
|
98
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
99
|
+
} else {
|
|
100
|
+
return `${seconds}s`;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
/**
|
|
104
|
+
* Format date for display
|
|
105
|
+
*/
|
|
106
|
+
formatDate(dateString) {
|
|
107
|
+
if (!dateString) {
|
|
108
|
+
return "";
|
|
109
|
+
}
|
|
110
|
+
const date = new Date(dateString);
|
|
111
|
+
return date.toLocaleString();
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Format hit ratio with color indication
|
|
115
|
+
*/
|
|
116
|
+
formatHitRatioWithColor(value) {
|
|
117
|
+
if (value === null || value === undefined) {
|
|
118
|
+
return ValueColor.None;
|
|
119
|
+
}
|
|
120
|
+
if (value >= 0.9) {
|
|
121
|
+
return ValueColor.Good;
|
|
122
|
+
} else if (value >= 0.7) {
|
|
123
|
+
return ValueColor.Critical;
|
|
124
|
+
} else {
|
|
125
|
+
return ValueColor.Error;
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
/**
|
|
129
|
+
* Format latency with color indication
|
|
130
|
+
*/
|
|
131
|
+
formatLatencyWithColor(value) {
|
|
132
|
+
if (value === null || value === undefined) {
|
|
133
|
+
return ValueColor.None;
|
|
134
|
+
}
|
|
135
|
+
if (value <= 10) {
|
|
136
|
+
return ValueColor.Good;
|
|
137
|
+
} else if (value <= 50) {
|
|
138
|
+
return ValueColor.Critical;
|
|
139
|
+
} else {
|
|
140
|
+
return ValueColor.Error;
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
/**
|
|
144
|
+
* Format error rate with color indication
|
|
145
|
+
*/
|
|
146
|
+
formatErrorRateWithColor(value) {
|
|
147
|
+
if (value <= 0.01) {
|
|
148
|
+
return ValueColor.Good;
|
|
149
|
+
} else if (value <= 0.05) {
|
|
150
|
+
return ValueColor.Critical;
|
|
151
|
+
} else if (value <= 0.1) {
|
|
152
|
+
return ValueColor.Error;
|
|
153
|
+
} else {
|
|
154
|
+
return ValueColor.Neutral;
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
/**
|
|
158
|
+
* Get total requests (hits + misses)
|
|
159
|
+
*/
|
|
160
|
+
getTotalRequests(hits, misses) {
|
|
161
|
+
return (hits || 0) + (misses || 0);
|
|
162
|
+
},
|
|
163
|
+
/**
|
|
164
|
+
* Get total operations (hits + misses + sets + deletes)
|
|
165
|
+
*/
|
|
166
|
+
getTotalOperations(hits, misses, sets, deletes) {
|
|
167
|
+
return (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);
|
|
168
|
+
},
|
|
169
|
+
/**
|
|
170
|
+
* Format JSON for display
|
|
171
|
+
*/
|
|
172
|
+
formatJSON(value) {
|
|
173
|
+
if (!value) {
|
|
174
|
+
return "";
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
if (typeof value === 'string') {
|
|
178
|
+
// Try to parse and format if it's a JSON string
|
|
179
|
+
const parsed = JSON.parse(value);
|
|
180
|
+
return JSON.stringify(parsed, null, 2);
|
|
181
|
+
} else {
|
|
182
|
+
// Format if it's already an object
|
|
183
|
+
return JSON.stringify(value, null, 2);
|
|
184
|
+
}
|
|
185
|
+
} catch (e) {
|
|
186
|
+
// Return as-is if it's not valid JSON
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
/**
|
|
191
|
+
* Format key name for display (truncate if too long)
|
|
192
|
+
*/
|
|
193
|
+
formatKeyName(keyName, maxLength = 30) {
|
|
194
|
+
if (!keyName) {
|
|
195
|
+
return "";
|
|
196
|
+
}
|
|
197
|
+
if (keyName.length <= maxLength) {
|
|
198
|
+
return keyName;
|
|
199
|
+
}
|
|
200
|
+
return keyName.substring(0, maxLength - 3) + "...";
|
|
201
|
+
},
|
|
202
|
+
/**
|
|
203
|
+
* Get relative time since last access
|
|
204
|
+
*/
|
|
205
|
+
getRelativeTime(dateString) {
|
|
206
|
+
if (!dateString) {
|
|
207
|
+
return "Never";
|
|
208
|
+
}
|
|
209
|
+
const date = new Date(dateString);
|
|
210
|
+
const now = new Date();
|
|
211
|
+
const diffMs = now.getTime() - date.getTime();
|
|
212
|
+
const diffSeconds = Math.floor(diffMs / 1000);
|
|
213
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
214
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
215
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
216
|
+
if (diffDays > 0) {
|
|
217
|
+
return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
|
|
218
|
+
} else if (diffHours > 0) {
|
|
219
|
+
return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
|
|
220
|
+
} else if (diffMinutes > 0) {
|
|
221
|
+
return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;
|
|
222
|
+
} else {
|
|
223
|
+
return `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
/**
|
|
227
|
+
* Format cache efficiency with color indication
|
|
228
|
+
*/
|
|
229
|
+
formatCacheEfficiencyWithColor(value) {
|
|
230
|
+
if (value === null || value === undefined) {
|
|
231
|
+
return ValueColor.None;
|
|
232
|
+
}
|
|
233
|
+
if (value > 5) {
|
|
234
|
+
return ValueColor.Good;
|
|
235
|
+
} else if (value >= 3) {
|
|
236
|
+
return ValueColor.Critical;
|
|
237
|
+
} else {
|
|
238
|
+
return ValueColor.Error;
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
formatTruncatedText(value, maxLength = 50) {
|
|
242
|
+
if (!value) {
|
|
243
|
+
return "";
|
|
244
|
+
}
|
|
245
|
+
if (value.length <= maxLength) {
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
return value.substring(0, maxLength) + "...";
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
return __exports;
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=formatter-dbg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter-dbg.js","names":["ValueColor","sap_m_library","__exports","formatIntegerValue","value","undefined","toFixed","formatNumberValue","formatPercentage","formatPercentageValue","formatLatency","numberValue","Number","formatMemoryUsage","bytes","sizes","i","Math","floor","log","pow","formatThroughput","formatCacheEfficiency","formatUptime","ms","seconds","minutes","hours","days","formatDate","dateString","date","Date","toLocaleString","formatHitRatioWithColor","None","Good","Critical","Error","formatLatencyWithColor","formatErrorRateWithColor","Neutral","getTotalRequests","hits","misses","getTotalOperations","sets","deletes","formatJSON","parsed","JSON","parse","stringify","e","formatKeyName","keyName","maxLength","length","substring","getRelativeTime","now","diffMs","getTime","diffSeconds","diffMinutes","diffHours","diffDays","formatCacheEfficiencyWithColor","formatTruncatedText"],"sources":["formatter.ts"],"sourcesContent":["import { ValueColor } from \"sap/m/library\";\n\n/**\n * Formatter utility for cache statistics dashboard\n */\nexport default {\n\n\tformatIntegerValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(0)}`;\n\t},\n\n\tformatNumberValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(2)}`;\n\t},\n\n\t/**\n\t * Format percentage values\n\t */\n\tformatPercentage(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0%\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}%`;\n\t},\n\n\tformatPercentageValue(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}`;\n\t},\n\n\t/**\n\t * Format latency values in milliseconds\n\t */\n\tformatLatency(value: string): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0ms\";\n\t\t}\n\t\t// Make sure value is a number\n\t\tconst numberValue = Number(value);\n\n\t\tif (numberValue < 1) {\n\t\t\treturn `${(numberValue * 1000).toFixed(2)}μs`;\n\t\t}\n\t\treturn `${numberValue.toFixed(2)}ms`;\n\t},\n\n\t/**\n\t * Format memory usage in human readable format\n\t */\n\tformatMemoryUsage(bytes: number): string {\n\t\tif (bytes === null || bytes === undefined) {\n\t\t\treturn \"0 B\";\n\t\t}\n\t\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(1024));\n\t\treturn `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n\t},\n\n\t/**\n\t * Format throughput (requests per second)\n\t */\n\tformatThroughput(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0 req/s\";\n\t\t}\n\t\treturn `${value.toFixed(2)} req/s`;\n\t},\n\n\t/**\n\t * Format cache efficiency ratio\n\t */\n\tformatCacheEfficiency(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"N/A\";\n\t\t}\n\t\tif (value < 1) {\n\t\t\treturn `${(value * 100).toFixed(1)}%`;\n\t\t}\n\t\treturn `${value.toFixed(1)}x`;\n\t},\n\n\t/**\n\t * Format uptime in human readable format\n\t */\n\tformatUptime(ms: number): string {\n\t\tif (ms === null || ms === undefined) {\n\t\t\treturn \"0s\";\n\t\t}\n\t\tconst seconds = Math.floor(ms / 1000);\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tconst hours = Math.floor(minutes / 60);\n\t\tconst days = Math.floor(hours / 24);\n\n\t\tif (days > 0) {\n\t\t\treturn `${days}d ${hours % 24}h ${minutes % 60}m`;\n\t\t} else if (hours > 0) {\n\t\t\treturn `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}m ${seconds % 60}s`;\n\t\t} else {\n\t\t\treturn `${seconds}s`;\n\t\t}\n\t},\n\n\t/**\n\t * Format date for display\n\t */\n\tformatDate(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleString();\n\t},\n\n\t/**\n\t * Format hit ratio with color indication\n\t */\n\tformatHitRatioWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value >= 0.9) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 0.7) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format latency with color indication\n\t */\n\tformatLatencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value <= 10) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 50) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format error rate with color indication\n\t */\n\tformatErrorRateWithColor(value: number): string {\n\t\tif (value <= 0.01) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 0.05) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else if (value <= 0.1) {\n\t\t\treturn ValueColor.Error;\n\t\t} else {\n\t\t\treturn ValueColor.Neutral;\n\t\t}\n\t},\n\n\t/**\n\t * Get total requests (hits + misses)\n\t */\n\tgetTotalRequests(hits: number, misses: number): number {\n\t\treturn (hits || 0) + (misses || 0);\n\t},\n\n\t/**\n\t * Get total operations (hits + misses + sets + deletes)\n\t */\n\tgetTotalOperations(hits: number, misses: number, sets: number, deletes: number): number {\n\t\treturn (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);\n\t},\n\n\t/**\n\t * Format JSON for display\n\t */\n\tformatJSON(value: any): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\t// Try to parse and format if it's a JSON string\n\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\treturn JSON.stringify(parsed, null, 2);\n\t\t\t} else {\n\t\t\t\t// Format if it's already an object\n\t\t\t\treturn JSON.stringify(value, null, 2);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Return as-is if it's not valid JSON\n\t\t\treturn value;\n\t\t}\n\t},\n\n\t/**\n\t * Format key name for display (truncate if too long)\n\t */\n\tformatKeyName(keyName: string, maxLength: number = 30): string {\n\t\tif (!keyName) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (keyName.length <= maxLength) {\n\t\t\treturn keyName;\n\t\t}\n\t\treturn keyName.substring(0, maxLength - 3) + \"...\";\n\t},\n\n\t/**\n\t * Get relative time since last access\n\t */\n\tgetRelativeTime(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"Never\";\n\t\t}\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffMs = now.getTime() - date.getTime();\n\t\tconst diffSeconds = Math.floor(diffMs / 1000);\n\t\tconst diffMinutes = Math.floor(diffSeconds / 60);\n\t\tconst diffHours = Math.floor(diffMinutes / 60);\n\t\tconst diffDays = Math.floor(diffHours / 24);\n\n\t\tif (diffDays > 0) {\n\t\t\treturn `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\t\t} else if (diffHours > 0) {\n\t\t\treturn `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n\t\t} else if (diffMinutes > 0) {\n\t\t\treturn `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;\n\t\t} else {\n\t\t\treturn `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;\n\t\t}\n\t},\n\n\t/**\n\t * Format cache efficiency with color indication\n\t */\n\tformatCacheEfficiencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value > 5) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 3) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\tformatTruncatedText(value: string, maxLength: number = 50): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (value.length <= maxLength) {\n\t\t\treturn value;\n\t\t}\n\t\treturn value.substring(0, maxLength) + \"...\";\n\t}\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
sap.ui.define(["sap/m/library"],function(e){"use strict";const r=e["ValueColor"];var t={formatIntegerValue(e){if(e===null||e===undefined||e===0){return"0"}return`${e.toFixed(0)}`},formatNumberValue(e){if(e===null||e===undefined||e===0){return"0"}return`${e.toFixed(2)}`},formatPercentage(e){if(e===null||e===undefined){return"0%"}return`${(e*100).toFixed(1)}%`},formatPercentageValue(e){if(e===null||e===undefined){return"0"}return`${(e*100).toFixed(1)}`},formatLatency(e){if(e===null||e===undefined){return"0ms"}const r=Number(e);if(r<1){return`${(r*1e3).toFixed(2)}μs`}return`${r.toFixed(2)}ms`},formatMemoryUsage(e){if(e===null||e===undefined){return"0 B"}const r=["B","KB","MB","GB"];const t=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,t)).toFixed(2)} ${r[t]}`},formatThroughput(e){if(e===null||e===undefined){return"0 req/s"}return`${e.toFixed(2)} req/s`},formatCacheEfficiency(e){if(e===null||e===undefined||e===0){return"N/A"}if(e<1){return`${(e*100).toFixed(1)}%`}return`${e.toFixed(1)}x`},formatUptime(e){if(e===null||e===undefined){return"0s"}const r=Math.floor(e/1e3);const t=Math.floor(r/60);const n=Math.floor(t/60);const o=Math.floor(n/24);if(o>0){return`${o}d ${n%24}h ${t%60}m`}else if(n>0){return`${n}h ${t%60}m ${r%60}s`}else if(t>0){return`${t}m ${r%60}s`}else{return`${r}s`}},formatDate(e){if(!e){return""}const r=new Date(e);return r.toLocaleString()},formatHitRatioWithColor(e){if(e===null||e===undefined){return r.None}if(e>=.9){return r.Good}else if(e>=.7){return r.Critical}else{return r.Error}},formatLatencyWithColor(e){if(e===null||e===undefined){return r.None}if(e<=10){return r.Good}else if(e<=50){return r.Critical}else{return r.Error}},formatErrorRateWithColor(e){if(e<=.01){return r.Good}else if(e<=.05){return r.Critical}else if(e<=.1){return r.Error}else{return r.Neutral}},getTotalRequests(e,r){return(e||0)+(r||0)},getTotalOperations(e,r,t,n){return(e||0)+(r||0)+(t||0)+(n||0)},formatJSON(e){if(!e){return""}try{if(typeof e==="string"){const r=JSON.parse(e);return JSON.stringify(r,null,2)}else{return JSON.stringify(e,null,2)}}catch(r){return e}},formatKeyName(e,r=30){if(!e){return""}if(e.length<=r){return e}return e.substring(0,r-3)+"..."},getRelativeTime(e){if(!e){return"Never"}const r=new Date(e);const t=new Date;const n=t.getTime()-r.getTime();const o=Math.floor(n/1e3);const u=Math.floor(o/60);const i=Math.floor(u/60);const f=Math.floor(i/24);if(f>0){return`${f} day${f>1?"s":""} ago`}else if(i>0){return`${i} hour${i>1?"s":""} ago`}else if(u>0){return`${u} minute${u>1?"s":""} ago`}else{return`${o} second${o>1?"s":""} ago`}},formatCacheEfficiencyWithColor(e){if(e===null||e===undefined){return r.None}if(e>5){return r.Good}else if(e>=3){return r.Critical}else{return r.Error}},formatTruncatedText(e,r=50){if(!e){return""}if(e.length<=r){return e}return e.substring(0,r)+"..."}};return t});
|
|
2
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","names":["ValueColor","sap_m_library","__exports","formatIntegerValue","value","undefined","toFixed","formatNumberValue","formatPercentage","formatPercentageValue","formatLatency","numberValue","Number","formatMemoryUsage","bytes","sizes","i","Math","floor","log","pow","formatThroughput","formatCacheEfficiency","formatUptime","ms","seconds","minutes","hours","days","formatDate","dateString","date","Date","toLocaleString","formatHitRatioWithColor","None","Good","Critical","Error","formatLatencyWithColor","formatErrorRateWithColor","Neutral","getTotalRequests","hits","misses","getTotalOperations","sets","deletes","formatJSON","parsed","JSON","parse","stringify","e","formatKeyName","keyName","maxLength","length","substring","getRelativeTime","now","diffMs","getTime","diffSeconds","diffMinutes","diffHours","diffDays","formatCacheEfficiencyWithColor","formatTruncatedText"],"sources":["formatter.ts"],"sourcesContent":["import { ValueColor } from \"sap/m/library\";\n\n/**\n * Formatter utility for cache statistics dashboard\n */\nexport default {\n\n\tformatIntegerValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(0)}`;\n\t},\n\n\tformatNumberValue(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${value.toFixed(2)}`;\n\t},\n\n\t/**\n\t * Format percentage values\n\t */\n\tformatPercentage(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0%\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}%`;\n\t},\n\n\tformatPercentageValue(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0\";\n\t\t}\n\t\treturn `${(value * 100).toFixed(1)}`;\n\t},\n\n\t/**\n\t * Format latency values in milliseconds\n\t */\n\tformatLatency(value: string): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0ms\";\n\t\t}\n\t\t// Make sure value is a number\n\t\tconst numberValue = Number(value);\n\n\t\tif (numberValue < 1) {\n\t\t\treturn `${(numberValue * 1000).toFixed(2)}μs`;\n\t\t}\n\t\treturn `${numberValue.toFixed(2)}ms`;\n\t},\n\n\t/**\n\t * Format memory usage in human readable format\n\t */\n\tformatMemoryUsage(bytes: number): string {\n\t\tif (bytes === null || bytes === undefined) {\n\t\t\treturn \"0 B\";\n\t\t}\n\t\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(1024));\n\t\treturn `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n\t},\n\n\t/**\n\t * Format throughput (requests per second)\n\t */\n\tformatThroughput(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"0 req/s\";\n\t\t}\n\t\treturn `${value.toFixed(2)} req/s`;\n\t},\n\n\t/**\n\t * Format cache efficiency ratio\n\t */\n\tformatCacheEfficiency(value: number): string {\n\t\tif (value === null || value === undefined || value === 0) {\n\t\t\treturn \"N/A\";\n\t\t}\n\t\tif (value < 1) {\n\t\t\treturn `${(value * 100).toFixed(1)}%`;\n\t\t}\n\t\treturn `${value.toFixed(1)}x`;\n\t},\n\n\t/**\n\t * Format uptime in human readable format\n\t */\n\tformatUptime(ms: number): string {\n\t\tif (ms === null || ms === undefined) {\n\t\t\treturn \"0s\";\n\t\t}\n\t\tconst seconds = Math.floor(ms / 1000);\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tconst hours = Math.floor(minutes / 60);\n\t\tconst days = Math.floor(hours / 24);\n\n\t\tif (days > 0) {\n\t\t\treturn `${days}d ${hours % 24}h ${minutes % 60}m`;\n\t\t} else if (hours > 0) {\n\t\t\treturn `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}m ${seconds % 60}s`;\n\t\t} else {\n\t\t\treturn `${seconds}s`;\n\t\t}\n\t},\n\n\t/**\n\t * Format date for display\n\t */\n\tformatDate(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleString();\n\t},\n\n\t/**\n\t * Format hit ratio with color indication\n\t */\n\tformatHitRatioWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value >= 0.9) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 0.7) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format latency with color indication\n\t */\n\tformatLatencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value <= 10) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 50) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\t/**\n\t * Format error rate with color indication\n\t */\n\tformatErrorRateWithColor(value: number): string {\n\t\tif (value <= 0.01) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value <= 0.05) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else if (value <= 0.1) {\n\t\t\treturn ValueColor.Error;\n\t\t} else {\n\t\t\treturn ValueColor.Neutral;\n\t\t}\n\t},\n\n\t/**\n\t * Get total requests (hits + misses)\n\t */\n\tgetTotalRequests(hits: number, misses: number): number {\n\t\treturn (hits || 0) + (misses || 0);\n\t},\n\n\t/**\n\t * Get total operations (hits + misses + sets + deletes)\n\t */\n\tgetTotalOperations(hits: number, misses: number, sets: number, deletes: number): number {\n\t\treturn (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);\n\t},\n\n\t/**\n\t * Format JSON for display\n\t */\n\tformatJSON(value: any): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\t// Try to parse and format if it's a JSON string\n\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\treturn JSON.stringify(parsed, null, 2);\n\t\t\t} else {\n\t\t\t\t// Format if it's already an object\n\t\t\t\treturn JSON.stringify(value, null, 2);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Return as-is if it's not valid JSON\n\t\t\treturn value;\n\t\t}\n\t},\n\n\t/**\n\t * Format key name for display (truncate if too long)\n\t */\n\tformatKeyName(keyName: string, maxLength: number = 30): string {\n\t\tif (!keyName) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (keyName.length <= maxLength) {\n\t\t\treturn keyName;\n\t\t}\n\t\treturn keyName.substring(0, maxLength - 3) + \"...\";\n\t},\n\n\t/**\n\t * Get relative time since last access\n\t */\n\tgetRelativeTime(dateString: string): string {\n\t\tif (!dateString) {\n\t\t\treturn \"Never\";\n\t\t}\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffMs = now.getTime() - date.getTime();\n\t\tconst diffSeconds = Math.floor(diffMs / 1000);\n\t\tconst diffMinutes = Math.floor(diffSeconds / 60);\n\t\tconst diffHours = Math.floor(diffMinutes / 60);\n\t\tconst diffDays = Math.floor(diffHours / 24);\n\n\t\tif (diffDays > 0) {\n\t\t\treturn `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\t\t} else if (diffHours > 0) {\n\t\t\treturn `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n\t\t} else if (diffMinutes > 0) {\n\t\t\treturn `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;\n\t\t} else {\n\t\t\treturn `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;\n\t\t}\n\t},\n\n\t/**\n\t * Format cache efficiency with color indication\n\t */\n\tformatCacheEfficiencyWithColor(value: number): string {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn ValueColor.None;\n\t\t}\n\n\t\tif (value > 5) {\n\t\t\treturn ValueColor.Good;\n\t\t} else if (value >= 3) {\n\t\t\treturn ValueColor.Critical;\n\t\t} else {\n\t\t\treturn ValueColor.Error;\n\t\t}\n\t},\n\n\tformatTruncatedText(value: string, maxLength: number = 50): string {\n\t\tif (!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (value.length <= maxLength) {\n\t\t\treturn value;\n\t\t}\n\t\treturn value.substring(0, maxLength) + \"...\";\n\t}\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { ValueColor } from "sap/m/library";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Formatter utility for cache statistics dashboard
|
|
5
|
+
*/
|
|
6
|
+
export default {
|
|
7
|
+
|
|
8
|
+
formatIntegerValue(value: number): string {
|
|
9
|
+
if (value === null || value === undefined || value === 0) {
|
|
10
|
+
return "0";
|
|
11
|
+
}
|
|
12
|
+
return `${value.toFixed(0)}`;
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
formatNumberValue(value: number): string {
|
|
16
|
+
if (value === null || value === undefined || value === 0) {
|
|
17
|
+
return "0";
|
|
18
|
+
}
|
|
19
|
+
return `${value.toFixed(2)}`;
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Format percentage values
|
|
24
|
+
*/
|
|
25
|
+
formatPercentage(value: number): string {
|
|
26
|
+
if (value === null || value === undefined) {
|
|
27
|
+
return "0%";
|
|
28
|
+
}
|
|
29
|
+
return `${(value * 100).toFixed(1)}%`;
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
formatPercentageValue(value: number): string {
|
|
33
|
+
if (value === null || value === undefined) {
|
|
34
|
+
return "0";
|
|
35
|
+
}
|
|
36
|
+
return `${(value * 100).toFixed(1)}`;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Format latency values in milliseconds
|
|
41
|
+
*/
|
|
42
|
+
formatLatency(value: string): string {
|
|
43
|
+
if (value === null || value === undefined) {
|
|
44
|
+
return "0ms";
|
|
45
|
+
}
|
|
46
|
+
// Make sure value is a number
|
|
47
|
+
const numberValue = Number(value);
|
|
48
|
+
|
|
49
|
+
if (numberValue < 1) {
|
|
50
|
+
return `${(numberValue * 1000).toFixed(2)}μs`;
|
|
51
|
+
}
|
|
52
|
+
return `${numberValue.toFixed(2)}ms`;
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Format memory usage in human readable format
|
|
57
|
+
*/
|
|
58
|
+
formatMemoryUsage(bytes: number): string {
|
|
59
|
+
if (bytes === null || bytes === undefined) {
|
|
60
|
+
return "0 B";
|
|
61
|
+
}
|
|
62
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
63
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
64
|
+
return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Format throughput (requests per second)
|
|
69
|
+
*/
|
|
70
|
+
formatThroughput(value: number): string {
|
|
71
|
+
if (value === null || value === undefined) {
|
|
72
|
+
return "0 req/s";
|
|
73
|
+
}
|
|
74
|
+
return `${value.toFixed(2)} req/s`;
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Format cache efficiency ratio
|
|
79
|
+
*/
|
|
80
|
+
formatCacheEfficiency(value: number): string {
|
|
81
|
+
if (value === null || value === undefined || value === 0) {
|
|
82
|
+
return "N/A";
|
|
83
|
+
}
|
|
84
|
+
if (value < 1) {
|
|
85
|
+
return `${(value * 100).toFixed(1)}%`;
|
|
86
|
+
}
|
|
87
|
+
return `${value.toFixed(1)}x`;
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Format uptime in human readable format
|
|
92
|
+
*/
|
|
93
|
+
formatUptime(ms: number): string {
|
|
94
|
+
if (ms === null || ms === undefined) {
|
|
95
|
+
return "0s";
|
|
96
|
+
}
|
|
97
|
+
const seconds = Math.floor(ms / 1000);
|
|
98
|
+
const minutes = Math.floor(seconds / 60);
|
|
99
|
+
const hours = Math.floor(minutes / 60);
|
|
100
|
+
const days = Math.floor(hours / 24);
|
|
101
|
+
|
|
102
|
+
if (days > 0) {
|
|
103
|
+
return `${days}d ${hours % 24}h ${minutes % 60}m`;
|
|
104
|
+
} else if (hours > 0) {
|
|
105
|
+
return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
|
|
106
|
+
} else if (minutes > 0) {
|
|
107
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
108
|
+
} else {
|
|
109
|
+
return `${seconds}s`;
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Format date for display
|
|
115
|
+
*/
|
|
116
|
+
formatDate(dateString: string): string {
|
|
117
|
+
if (!dateString) {
|
|
118
|
+
return "";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const date = new Date(dateString);
|
|
122
|
+
return date.toLocaleString();
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Format hit ratio with color indication
|
|
127
|
+
*/
|
|
128
|
+
formatHitRatioWithColor(value: number): string {
|
|
129
|
+
if (value === null || value === undefined) {
|
|
130
|
+
return ValueColor.None;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (value >= 0.9) {
|
|
134
|
+
return ValueColor.Good;
|
|
135
|
+
} else if (value >= 0.7) {
|
|
136
|
+
return ValueColor.Critical;
|
|
137
|
+
} else {
|
|
138
|
+
return ValueColor.Error;
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Format latency with color indication
|
|
144
|
+
*/
|
|
145
|
+
formatLatencyWithColor(value: number): string {
|
|
146
|
+
if (value === null || value === undefined) {
|
|
147
|
+
return ValueColor.None;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (value <= 10) {
|
|
151
|
+
return ValueColor.Good;
|
|
152
|
+
} else if (value <= 50) {
|
|
153
|
+
return ValueColor.Critical;
|
|
154
|
+
} else {
|
|
155
|
+
return ValueColor.Error;
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Format error rate with color indication
|
|
161
|
+
*/
|
|
162
|
+
formatErrorRateWithColor(value: number): string {
|
|
163
|
+
if (value <= 0.01) {
|
|
164
|
+
return ValueColor.Good;
|
|
165
|
+
} else if (value <= 0.05) {
|
|
166
|
+
return ValueColor.Critical;
|
|
167
|
+
} else if (value <= 0.1) {
|
|
168
|
+
return ValueColor.Error;
|
|
169
|
+
} else {
|
|
170
|
+
return ValueColor.Neutral;
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get total requests (hits + misses)
|
|
176
|
+
*/
|
|
177
|
+
getTotalRequests(hits: number, misses: number): number {
|
|
178
|
+
return (hits || 0) + (misses || 0);
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Get total operations (hits + misses + sets + deletes)
|
|
183
|
+
*/
|
|
184
|
+
getTotalOperations(hits: number, misses: number, sets: number, deletes: number): number {
|
|
185
|
+
return (hits || 0) + (misses || 0) + (sets || 0) + (deletes || 0);
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Format JSON for display
|
|
190
|
+
*/
|
|
191
|
+
formatJSON(value: any): string {
|
|
192
|
+
if (!value) {
|
|
193
|
+
return "";
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
if (typeof value === 'string') {
|
|
197
|
+
// Try to parse and format if it's a JSON string
|
|
198
|
+
const parsed = JSON.parse(value);
|
|
199
|
+
return JSON.stringify(parsed, null, 2);
|
|
200
|
+
} else {
|
|
201
|
+
// Format if it's already an object
|
|
202
|
+
return JSON.stringify(value, null, 2);
|
|
203
|
+
}
|
|
204
|
+
} catch (e) {
|
|
205
|
+
// Return as-is if it's not valid JSON
|
|
206
|
+
return value;
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Format key name for display (truncate if too long)
|
|
212
|
+
*/
|
|
213
|
+
formatKeyName(keyName: string, maxLength: number = 30): string {
|
|
214
|
+
if (!keyName) {
|
|
215
|
+
return "";
|
|
216
|
+
}
|
|
217
|
+
if (keyName.length <= maxLength) {
|
|
218
|
+
return keyName;
|
|
219
|
+
}
|
|
220
|
+
return keyName.substring(0, maxLength - 3) + "...";
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Get relative time since last access
|
|
225
|
+
*/
|
|
226
|
+
getRelativeTime(dateString: string): string {
|
|
227
|
+
if (!dateString) {
|
|
228
|
+
return "Never";
|
|
229
|
+
}
|
|
230
|
+
const date = new Date(dateString);
|
|
231
|
+
const now = new Date();
|
|
232
|
+
const diffMs = now.getTime() - date.getTime();
|
|
233
|
+
const diffSeconds = Math.floor(diffMs / 1000);
|
|
234
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
235
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
236
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
237
|
+
|
|
238
|
+
if (diffDays > 0) {
|
|
239
|
+
return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
|
|
240
|
+
} else if (diffHours > 0) {
|
|
241
|
+
return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
|
|
242
|
+
} else if (diffMinutes > 0) {
|
|
243
|
+
return `${diffMinutes} minute${diffMinutes > 1 ? 's' : ''} ago`;
|
|
244
|
+
} else {
|
|
245
|
+
return `${diffSeconds} second${diffSeconds > 1 ? 's' : ''} ago`;
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Format cache efficiency with color indication
|
|
251
|
+
*/
|
|
252
|
+
formatCacheEfficiencyWithColor(value: number): string {
|
|
253
|
+
if (value === null || value === undefined) {
|
|
254
|
+
return ValueColor.None;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (value > 5) {
|
|
258
|
+
return ValueColor.Good;
|
|
259
|
+
} else if (value >= 3) {
|
|
260
|
+
return ValueColor.Critical;
|
|
261
|
+
} else {
|
|
262
|
+
return ValueColor.Error;
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
formatTruncatedText(value: string, maxLength: number = 50): string {
|
|
267
|
+
if (!value) {
|
|
268
|
+
return "";
|
|
269
|
+
}
|
|
270
|
+
if (value.length <= maxLength) {
|
|
271
|
+
return value;
|
|
272
|
+
}
|
|
273
|
+
return value.substring(0, maxLength) + "...";
|
|
274
|
+
}
|
|
275
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
sap.ui.define(["sap/ui/model/json/JSONModel", "sap/ui/model/BindingMode", "sap/ui/Device"], function (JSONModel, BindingMode, Device) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var __exports = {
|
|
5
|
+
createDeviceModel: () => {
|
|
6
|
+
const oModel = new JSONModel(Device);
|
|
7
|
+
oModel.setDefaultBindingMode(BindingMode.OneWay);
|
|
8
|
+
return oModel;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
return __exports;
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=models-dbg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-dbg.js","names":["createDeviceModel","oModel","JSONModel","Device","setDefaultBindingMode","BindingMode","OneWay","__exports"],"sources":["models.ts"],"sourcesContent":["import JSONModel from \"sap/ui/model/json/JSONModel\";\nimport BindingMode from \"sap/ui/model/BindingMode\";\n\nimport Device from \"sap/ui/Device\";\n\n\nexport default {\n\tcreateDeviceModel: () => {\n\t\tconst oModel = new JSONModel(Device);\n\t\toModel.setDefaultBindingMode(BindingMode.OneWay);\n\t\treturn oModel;\n\t}\n};\n"],"mappings":";;;kBAMe;IACdA,iBAAiB,EAAEA,CAAA,KAAM;MACxB,MAAMC,MAAM,GAAG,IAAIC,SAAS,CAACC,MAAM,CAAC;MACpCF,MAAM,CAACG,qBAAqB,CAACC,WAAW,CAACC,MAAM,CAAC;MAChD,OAAOL,MAAM;IACd;EACD,CAAC;EAAA,OAAAM,SAAA;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","names":["createDeviceModel","oModel","JSONModel","Device","setDefaultBindingMode","BindingMode","OneWay","__exports"],"sources":["models.ts"],"sourcesContent":["import JSONModel from \"sap/ui/model/json/JSONModel\";\nimport BindingMode from \"sap/ui/model/BindingMode\";\n\nimport Device from \"sap/ui/Device\";\n\n\nexport default {\n\tcreateDeviceModel: () => {\n\t\tconst oModel = new JSONModel(Device);\n\t\toModel.setDefaultBindingMode(BindingMode.OneWay);\n\t\treturn oModel;\n\t}\n};\n"],"mappings":"4HAMe,CACdA,kBAAmBA,KAClB,MAAMC,EAAS,IAAIC,EAAUC,GAC7BF,EAAOG,sBAAsBC,EAAYC,QACzC,OAAOL,IAER,OAAAM,CAAA","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import JSONModel from "sap/ui/model/json/JSONModel";
|
|
2
|
+
import BindingMode from "sap/ui/model/BindingMode";
|
|
3
|
+
|
|
4
|
+
import Device from "sap/ui/Device";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
createDeviceModel: () => {
|
|
9
|
+
const oModel = new JSONModel(Device);
|
|
10
|
+
oModel.setDefaultBindingMode(BindingMode.OneWay);
|
|
11
|
+
return oModel;
|
|
12
|
+
}
|
|
13
|
+
};
|