cds-caching 1.2.1 → 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 +43 -11
- package/srv/caching-api-service.js +47 -2
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
sap.ui.define(["./BaseController", "sap/ui/model/json/JSONModel", "sap/m/MessageBox"], function (__BaseController, JSONModel, MessageBox) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
function _interopRequireDefault(obj) {
|
|
5
|
+
return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
|
|
6
|
+
}
|
|
7
|
+
const BaseController = _interopRequireDefault(__BaseController);
|
|
8
|
+
/**
|
|
9
|
+
* @namespace cds.plugin.caching.dashboard.controller
|
|
10
|
+
*/
|
|
11
|
+
const SingleMetric = BaseController.extend("cds.plugin.caching.dashboard.controller.SingleMetric", {
|
|
12
|
+
onInit: function _onInit() {
|
|
13
|
+
BaseController.prototype.onInit.call(this);
|
|
14
|
+
|
|
15
|
+
// Create a JSON model for UI data binding
|
|
16
|
+
this.uiModel = new JSONModel({
|
|
17
|
+
metricId: "",
|
|
18
|
+
// Performance metrics
|
|
19
|
+
hitRatio: 0,
|
|
20
|
+
cacheEfficiency: 0,
|
|
21
|
+
throughput: 0,
|
|
22
|
+
errorRate: 0,
|
|
23
|
+
// Latency metrics
|
|
24
|
+
avgLatency: 0,
|
|
25
|
+
avgHitLatency: 0,
|
|
26
|
+
avgMissLatency: 0,
|
|
27
|
+
// Operation counts
|
|
28
|
+
hits: 0,
|
|
29
|
+
misses: 0,
|
|
30
|
+
sets: 0,
|
|
31
|
+
deletes: 0,
|
|
32
|
+
errors: 0,
|
|
33
|
+
// Native function metrics
|
|
34
|
+
nativeSets: 0,
|
|
35
|
+
nativeGets: 0,
|
|
36
|
+
nativeDeletes: 0,
|
|
37
|
+
nativeClears: 0,
|
|
38
|
+
nativeDeleteByTags: 0,
|
|
39
|
+
nativeErrors: 0,
|
|
40
|
+
totalNativeOperations: 0,
|
|
41
|
+
nativeThroughput: 0,
|
|
42
|
+
nativeErrorRate: 0,
|
|
43
|
+
// System information
|
|
44
|
+
memoryUsage: 0,
|
|
45
|
+
itemCount: 0,
|
|
46
|
+
uniqueKeys: 0,
|
|
47
|
+
uptimeMs: 0,
|
|
48
|
+
// Chart data
|
|
49
|
+
latencyData: [],
|
|
50
|
+
cacheThroughData: [],
|
|
51
|
+
nativeData: []
|
|
52
|
+
});
|
|
53
|
+
this.getView().setModel(this.uiModel, "ui");
|
|
54
|
+
this.getRouter().getRoute("singleMetric").attachPatternMatched(this.onRouteMatched, this);
|
|
55
|
+
},
|
|
56
|
+
onRouteMatched: function _onRouteMatched(event) {
|
|
57
|
+
const {
|
|
58
|
+
cache,
|
|
59
|
+
metricId
|
|
60
|
+
} = event.getParameter("arguments");
|
|
61
|
+
this.uiModel.setProperty("/metricId", metricId);
|
|
62
|
+
|
|
63
|
+
// Set layout to three columns
|
|
64
|
+
this.getModel("app").setProperty("/layout", "ThreeColumnsEndExpanded");
|
|
65
|
+
|
|
66
|
+
// Load the specific metric
|
|
67
|
+
this.loadMetric(cache, metricId);
|
|
68
|
+
this.formatChart();
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* Load specific metric data
|
|
72
|
+
*/
|
|
73
|
+
loadMetric: async function _loadMetric(cacheName, metricId) {
|
|
74
|
+
try {
|
|
75
|
+
const model = this.getModel();
|
|
76
|
+
|
|
77
|
+
// Try to get the metric from the Metrics entity
|
|
78
|
+
const context = model.bindContext(`/Metrics(ID='${metricId}',cache='${cacheName}')`);
|
|
79
|
+
const metric = await context.requestObject();
|
|
80
|
+
if (metric) {
|
|
81
|
+
// Set all the metric values
|
|
82
|
+
this.uiModel.setProperty("/hitRatio", metric.hitRatio || 0);
|
|
83
|
+
this.uiModel.setProperty("/cacheEfficiency", metric.cacheEfficiency || 0);
|
|
84
|
+
this.uiModel.setProperty("/throughput", metric.throughput || 0);
|
|
85
|
+
this.uiModel.setProperty("/errorRate", metric.errorRate || 0);
|
|
86
|
+
|
|
87
|
+
// Latency metrics
|
|
88
|
+
this.uiModel.setProperty("/avgLatency", metric.avgLatency || 0);
|
|
89
|
+
this.uiModel.setProperty("/avgHitLatency", metric.avgHitLatency || 0);
|
|
90
|
+
this.uiModel.setProperty("/avgMissLatency", metric.avgMissLatency || 0);
|
|
91
|
+
|
|
92
|
+
// Operation counts
|
|
93
|
+
this.uiModel.setProperty("/hits", metric.hits || 0);
|
|
94
|
+
this.uiModel.setProperty("/misses", metric.misses || 0);
|
|
95
|
+
this.uiModel.setProperty("/sets", metric.sets || 0);
|
|
96
|
+
this.uiModel.setProperty("/deletes", metric.deletes || 0);
|
|
97
|
+
this.uiModel.setProperty("/errors", metric.errors || 0);
|
|
98
|
+
|
|
99
|
+
// Native function metrics
|
|
100
|
+
this.uiModel.setProperty("/nativeSets", metric.nativeSets || 0);
|
|
101
|
+
this.uiModel.setProperty("/nativeGets", metric.nativeGets || 0);
|
|
102
|
+
this.uiModel.setProperty("/nativeDeletes", metric.nativeDeletes || 0);
|
|
103
|
+
this.uiModel.setProperty("/nativeClears", metric.nativeClears || 0);
|
|
104
|
+
this.uiModel.setProperty("/nativeDeleteByTags", metric.nativeDeleteByTags || 0);
|
|
105
|
+
this.uiModel.setProperty("/nativeErrors", metric.nativeErrors || 0);
|
|
106
|
+
this.uiModel.setProperty("/totalNativeOperations", metric.totalNativeOperations || 0);
|
|
107
|
+
this.uiModel.setProperty("/nativeThroughput", metric.nativeThroughput || 0);
|
|
108
|
+
this.uiModel.setProperty("/nativeErrorRate", metric.nativeErrorRate || 0);
|
|
109
|
+
|
|
110
|
+
// System information
|
|
111
|
+
this.uiModel.setProperty("/memoryUsage", metric.memoryUsage || 0);
|
|
112
|
+
this.uiModel.setProperty("/itemCount", metric.itemCount || 0);
|
|
113
|
+
this.uiModel.setProperty("/uptimeMs", metric.uptimeMs || 0);
|
|
114
|
+
|
|
115
|
+
// Calculate unique keys (this might need to come from a different source)
|
|
116
|
+
this.uiModel.setProperty("/uniqueKeys", 0); // TODO: Get from key metrics data
|
|
117
|
+
|
|
118
|
+
// Generate chart data
|
|
119
|
+
this.generateLatencyChartData(metric);
|
|
120
|
+
this.generateCacheThroughChartData(metric);
|
|
121
|
+
this.generateNativeChartData(metric);
|
|
122
|
+
} else {
|
|
123
|
+
MessageBox.error("Metric not found");
|
|
124
|
+
}
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error("Error loading metric:", error);
|
|
127
|
+
MessageBox.error("Failed to load metric details");
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
/**
|
|
131
|
+
* Generate latency data for the chart
|
|
132
|
+
*/
|
|
133
|
+
generateLatencyChartData: function _generateLatencyChartData(metric) {
|
|
134
|
+
const latencyData = [{
|
|
135
|
+
operation: "Average Hit Latency",
|
|
136
|
+
latency: metric.avgHitLatency || 0
|
|
137
|
+
}, {
|
|
138
|
+
operation: "Average Miss Latency",
|
|
139
|
+
latency: metric.avgMissLatency || 0
|
|
140
|
+
}, {
|
|
141
|
+
operation: "Average Read-Through Latency",
|
|
142
|
+
latency: metric.avgReadThroughLatency || 0
|
|
143
|
+
}];
|
|
144
|
+
this.uiModel.setProperty("/latencyData", latencyData);
|
|
145
|
+
},
|
|
146
|
+
/**
|
|
147
|
+
* Generate Read-Through operations data for pie chart
|
|
148
|
+
*/
|
|
149
|
+
generateCacheThroughChartData: function _generateCacheThroughChartData(metric) {
|
|
150
|
+
const cacheThroughData = [{
|
|
151
|
+
operation: "Hits",
|
|
152
|
+
count: metric.hits || 0
|
|
153
|
+
}, {
|
|
154
|
+
operation: "Misses",
|
|
155
|
+
count: metric.misses || 0
|
|
156
|
+
}, {
|
|
157
|
+
operation: "Errors",
|
|
158
|
+
count: metric.errors || 0
|
|
159
|
+
}];
|
|
160
|
+
this.uiModel.setProperty("/cacheThroughData", cacheThroughData);
|
|
161
|
+
},
|
|
162
|
+
/**
|
|
163
|
+
* Generate Native Function operations data for pie chart
|
|
164
|
+
*/
|
|
165
|
+
generateNativeChartData: function _generateNativeChartData(metric) {
|
|
166
|
+
const nativeData = [{
|
|
167
|
+
operation: "Sets",
|
|
168
|
+
count: metric.nativeSets || 0
|
|
169
|
+
}, {
|
|
170
|
+
operation: "Gets",
|
|
171
|
+
count: metric.nativeGets || 0
|
|
172
|
+
}, {
|
|
173
|
+
operation: "Deletes",
|
|
174
|
+
count: metric.nativeDeletes || 0
|
|
175
|
+
}, {
|
|
176
|
+
operation: "Clears",
|
|
177
|
+
count: metric.nativeClears || 0
|
|
178
|
+
}, {
|
|
179
|
+
operation: "Delete By Tags",
|
|
180
|
+
count: metric.nativeDeleteByTags || 0
|
|
181
|
+
}, {
|
|
182
|
+
operation: "Errors",
|
|
183
|
+
count: metric.nativeErrors || 0
|
|
184
|
+
}];
|
|
185
|
+
this.uiModel.setProperty("/nativeData", nativeData);
|
|
186
|
+
},
|
|
187
|
+
formatChart: function _formatChart() {
|
|
188
|
+
// Format latency chart (bar chart)
|
|
189
|
+
const latencyChart = this.getView().byId("metricLatencyChart");
|
|
190
|
+
if (latencyChart) {
|
|
191
|
+
latencyChart.setVizProperties({
|
|
192
|
+
legend: {
|
|
193
|
+
visible: false
|
|
194
|
+
},
|
|
195
|
+
plotArea: {
|
|
196
|
+
dataLabel: {
|
|
197
|
+
visible: true,
|
|
198
|
+
formatString: "#,## ms"
|
|
199
|
+
},
|
|
200
|
+
gridline: {
|
|
201
|
+
visible: false
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
valueAxis: {
|
|
205
|
+
axisLine: {
|
|
206
|
+
visible: false
|
|
207
|
+
},
|
|
208
|
+
axisTick: {
|
|
209
|
+
visible: false
|
|
210
|
+
},
|
|
211
|
+
label: {
|
|
212
|
+
visible: false
|
|
213
|
+
},
|
|
214
|
+
title: {
|
|
215
|
+
visible: false
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
categoryAxis: {
|
|
219
|
+
title: {
|
|
220
|
+
visible: false
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
title: {
|
|
224
|
+
visible: false,
|
|
225
|
+
text: 'Latency by Operation'
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Format Read-Through pie chart
|
|
231
|
+
const cacheThroughChart = this.getView().byId("metricCacheThroughChart");
|
|
232
|
+
if (cacheThroughChart) {
|
|
233
|
+
cacheThroughChart.setVizProperties({
|
|
234
|
+
legend: {
|
|
235
|
+
visible: true
|
|
236
|
+
},
|
|
237
|
+
plotArea: {
|
|
238
|
+
dataLabel: {
|
|
239
|
+
visible: true
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
title: {
|
|
243
|
+
visible: false
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Format Native Function pie chart
|
|
249
|
+
const nativeChart = this.getView().byId("metricNativeChart");
|
|
250
|
+
if (nativeChart) {
|
|
251
|
+
nativeChart.setVizProperties({
|
|
252
|
+
legend: {
|
|
253
|
+
visible: true
|
|
254
|
+
},
|
|
255
|
+
plotArea: {
|
|
256
|
+
dataLabel: {
|
|
257
|
+
visible: true
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
title: {
|
|
261
|
+
visible: false
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
/**
|
|
267
|
+
* Handle refresh button press
|
|
268
|
+
*/
|
|
269
|
+
onRefresh: function _onRefresh() {
|
|
270
|
+
const cacheName = this.getModel("app").getProperty("/selectedCache");
|
|
271
|
+
const metricId = this.uiModel.getProperty("/metricId");
|
|
272
|
+
if (cacheName && metricId) {
|
|
273
|
+
this.loadMetric(cacheName, metricId);
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
/**
|
|
277
|
+
* Handle full screen mode
|
|
278
|
+
*/
|
|
279
|
+
handleFullScreen: function _handleFullScreen() {
|
|
280
|
+
this.getModel("app").setProperty("/layout", "EndColumnFullScreen");
|
|
281
|
+
},
|
|
282
|
+
/**
|
|
283
|
+
* Handle exit full screen mode
|
|
284
|
+
*/
|
|
285
|
+
handleExitFullScreen: function _handleExitFullScreen() {
|
|
286
|
+
this.getModel("app").setProperty("/layout", "ThreeColumnsEndExpanded");
|
|
287
|
+
},
|
|
288
|
+
/**
|
|
289
|
+
* Handle close end column
|
|
290
|
+
*/
|
|
291
|
+
handleClose: function _handleClose() {
|
|
292
|
+
this.getModel("app").setProperty("/layout", "TwoColumnsMidExpanded");
|
|
293
|
+
this.getRouter().navTo("cache", {
|
|
294
|
+
cache: this.getModel("app").getProperty("/selectedCache")
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
/**
|
|
298
|
+
* Handle grid columns change
|
|
299
|
+
*/
|
|
300
|
+
onColumnsChange: function _onColumnsChange() {
|
|
301
|
+
// Handle responsive grid column changes if needed
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
return SingleMetric;
|
|
305
|
+
});
|
|
306
|
+
//# sourceMappingURL=SingleMetric-dbg.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SingleMetric-dbg.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","SingleMetric","extend","onInit","_onInit","BaseController.prototype.onInit.call","uiModel","JSONModel","metricId","hitRatio","cacheEfficiency","throughput","errorRate","avgLatency","avgHitLatency","avgMissLatency","hits","misses","sets","deletes","errors","nativeSets","nativeGets","nativeDeletes","nativeClears","nativeDeleteByTags","nativeErrors","totalNativeOperations","nativeThroughput","nativeErrorRate","memoryUsage","itemCount","uniqueKeys","uptimeMs","latencyData","cacheThroughData","nativeData","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","setProperty","getModel","loadMetric","formatChart","_loadMetric","cacheName","model","context","bindContext","metric","requestObject","generateLatencyChartData","generateCacheThroughChartData","generateNativeChartData","MessageBox","error","console","_generateLatencyChartData","operation","latency","avgReadThroughLatency","_generateCacheThroughChartData","count","_generateNativeChartData","_formatChart","latencyChart","byId","setVizProperties","legend","visible","plotArea","dataLabel","formatString","gridline","valueAxis","axisLine","axisTick","label","title","categoryAxis","text","cacheThroughChart","nativeChart","onRefresh","_onRefresh","getProperty","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","handleClose","_handleClose","navTo","onColumnsChange","_onColumnsChange"],"sources":["SingleMetric.controller.ts"],"sourcesContent":["import BaseController from \"./BaseController\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport MessageBox from \"sap/m/MessageBox\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class SingleMetric extends BaseController {\n private uiModel: JSONModel;\n\n public onInit(): void {\n super.onInit();\n\n // Create a JSON model for UI data binding\n this.uiModel = new JSONModel({\n metricId: \"\",\n // Performance metrics\n hitRatio: 0,\n cacheEfficiency: 0,\n throughput: 0,\n errorRate: 0,\n // Latency metrics\n avgLatency: 0,\n avgHitLatency: 0,\n avgMissLatency: 0,\n // Operation counts\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n errors: 0,\n // Native function metrics\n nativeSets: 0,\n nativeGets: 0,\n nativeDeletes: 0,\n nativeClears: 0,\n nativeDeleteByTags: 0,\n nativeErrors: 0,\n totalNativeOperations: 0,\n nativeThroughput: 0,\n nativeErrorRate: 0,\n // System information\n memoryUsage: 0,\n itemCount: 0,\n uniqueKeys: 0,\n uptimeMs: 0,\n // Chart data\n latencyData: [],\n cacheThroughData: [],\n nativeData: []\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n this.getRouter().getRoute(\"singleMetric\").attachPatternMatched(this.onRouteMatched, this);\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache, metricId } = event.getParameter(\"arguments\") as { cache: string; metricId: string };\n\n this.uiModel.setProperty(\"/metricId\", metricId);\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n\n // Load the specific metric\n this.loadMetric(cache, metricId);\n\n this.formatChart();\n }\n\n /**\n * Load specific metric data\n */\n private async loadMetric(cacheName: string, metricId: string): Promise<void> {\n try {\n const model = this.getModel() as ODataModel;\n\n // Try to get the metric from the Metrics entity\n const context = model.bindContext(`/Metrics(ID='${metricId}',cache='${cacheName}')`);\n const metric = await context.requestObject();\n\n if (metric) {\n // Set all the metric values\n this.uiModel.setProperty(\"/hitRatio\", metric.hitRatio || 0);\n this.uiModel.setProperty(\"/cacheEfficiency\", metric.cacheEfficiency || 0);\n this.uiModel.setProperty(\"/throughput\", metric.throughput || 0);\n this.uiModel.setProperty(\"/errorRate\", metric.errorRate || 0);\n\n // Latency metrics\n this.uiModel.setProperty(\"/avgLatency\", metric.avgLatency || 0);\n this.uiModel.setProperty(\"/avgHitLatency\", metric.avgHitLatency || 0);\n this.uiModel.setProperty(\"/avgMissLatency\", metric.avgMissLatency || 0);\n\n // Operation counts\n this.uiModel.setProperty(\"/hits\", metric.hits || 0);\n this.uiModel.setProperty(\"/misses\", metric.misses || 0);\n this.uiModel.setProperty(\"/sets\", metric.sets || 0);\n this.uiModel.setProperty(\"/deletes\", metric.deletes || 0);\n this.uiModel.setProperty(\"/errors\", metric.errors || 0);\n\n // Native function metrics\n this.uiModel.setProperty(\"/nativeSets\", metric.nativeSets || 0);\n this.uiModel.setProperty(\"/nativeGets\", metric.nativeGets || 0);\n this.uiModel.setProperty(\"/nativeDeletes\", metric.nativeDeletes || 0);\n this.uiModel.setProperty(\"/nativeClears\", metric.nativeClears || 0);\n this.uiModel.setProperty(\"/nativeDeleteByTags\", metric.nativeDeleteByTags || 0);\n this.uiModel.setProperty(\"/nativeErrors\", metric.nativeErrors || 0);\n this.uiModel.setProperty(\"/totalNativeOperations\", metric.totalNativeOperations || 0);\n this.uiModel.setProperty(\"/nativeThroughput\", metric.nativeThroughput || 0);\n this.uiModel.setProperty(\"/nativeErrorRate\", metric.nativeErrorRate || 0);\n\n // System information\n this.uiModel.setProperty(\"/memoryUsage\", metric.memoryUsage || 0);\n this.uiModel.setProperty(\"/itemCount\", metric.itemCount || 0);\n this.uiModel.setProperty(\"/uptimeMs\", metric.uptimeMs || 0);\n\n // Calculate unique keys (this might need to come from a different source)\n this.uiModel.setProperty(\"/uniqueKeys\", 0); // TODO: Get from key metrics data\n\n // Generate chart data\n this.generateLatencyChartData(metric);\n this.generateCacheThroughChartData(metric);\n this.generateNativeChartData(metric);\n\n } else {\n MessageBox.error(\"Metric not found\");\n }\n\n } catch (error) {\n console.error(\"Error loading metric:\", error);\n MessageBox.error(\"Failed to load metric details\");\n }\n }\n\n /**\n * Generate latency data for the chart\n */\n private generateLatencyChartData(metric: any): void {\n const latencyData = [\n {\n operation: \"Average Hit Latency\",\n latency: metric.avgHitLatency || 0\n },\n {\n operation: \"Average Miss Latency\",\n latency: metric.avgMissLatency || 0\n },\n {\n operation: \"Average Read-Through Latency\",\n latency: metric.avgReadThroughLatency || 0\n }\n ];\n\n this.uiModel.setProperty(\"/latencyData\", latencyData);\n }\n\n /**\n * Generate Read-Through operations data for pie chart\n */\n private generateCacheThroughChartData(metric: any): void {\n const cacheThroughData = [\n {\n operation: \"Hits\",\n count: metric.hits || 0\n },\n {\n operation: \"Misses\",\n count: metric.misses || 0\n },\n {\n operation: \"Errors\",\n count: metric.errors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/cacheThroughData\", cacheThroughData);\n }\n\n /**\n * Generate Native Function operations data for pie chart\n */\n private generateNativeChartData(metric: any): void {\n const nativeData = [\n {\n operation: \"Sets\",\n count: metric.nativeSets || 0\n },\n {\n operation: \"Gets\",\n count: metric.nativeGets || 0\n },\n {\n operation: \"Deletes\",\n count: metric.nativeDeletes || 0\n },\n {\n operation: \"Clears\",\n count: metric.nativeClears || 0\n },\n {\n operation: \"Delete By Tags\",\n count: metric.nativeDeleteByTags || 0\n },\n {\n operation: \"Errors\",\n count: metric.nativeErrors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/nativeData\", nativeData);\n }\n\n public formatChart() {\n // Format latency chart (bar chart)\n const latencyChart = this.getView().byId(\"metricLatencyChart\") as any;\n if (latencyChart) {\n latencyChart.setVizProperties({\n legend: {\n visible: false\n },\n plotArea: {\n dataLabel: {\n visible: true,\n formatString: \"#,## ms\"\n },\n gridline: {\n visible: false\n }\n },\n valueAxis: {\n axisLine: {\n visible: false\n },\n axisTick: {\n visible: false\n },\n label: {\n visible: false\n },\n title: {\n visible: false\n }\n },\n categoryAxis: {\n title: {\n visible: false\n }\n },\n title: {\n visible: false,\n text: 'Latency by Operation'\n }\n });\n }\n\n // Format Read-Through pie chart\n const cacheThroughChart = this.getView().byId(\"metricCacheThroughChart\") as any;\n if (cacheThroughChart) {\n cacheThroughChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n\n // Format Native Function pie chart\n const nativeChart = this.getView().byId(\"metricNativeChart\") as any;\n if (nativeChart) {\n nativeChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n }\n\n /**\n * Handle refresh button press\n */\n public onRefresh(): void {\n const cacheName = this.getModel(\"app\").getProperty(\"/selectedCache\");\n const metricId = this.uiModel.getProperty(\"/metricId\");\n\n if (cacheName && metricId) {\n this.loadMetric(cacheName, metricId);\n }\n }\n\n /**\n * Handle full screen mode\n */\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"EndColumnFullScreen\");\n }\n\n /**\n * Handle exit full screen mode\n */\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n\n /**\n * Handle close end column\n */\n public handleClose(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n this.getRouter().navTo(\"cache\", { cache: this.getModel(\"app\").getProperty(\"/selectedCache\") });\n }\n\n /**\n * Handle grid columns change\n */\n public onColumnsChange(): void {\n // Handle responsive grid column changes if needed\n }\n} "],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
sap.ui.define(["./BaseController","sap/ui/model/json/JSONModel","sap/m/MessageBox"],function(e,t,i){"use strict";function a(e){return e&&e.__esModule&&typeof e.default!=="undefined"?e.default:e}const s=a(e);const r=s.extend("cds.plugin.caching.dashboard.controller.SingleMetric",{onInit:function e(){s.prototype.onInit.call(this);this.uiModel=new t({metricId:"",hitRatio:0,cacheEfficiency:0,throughput:0,errorRate:0,avgLatency:0,avgHitLatency:0,avgMissLatency:0,hits:0,misses:0,sets:0,deletes:0,errors:0,nativeSets:0,nativeGets:0,nativeDeletes:0,nativeClears:0,nativeDeleteByTags:0,nativeErrors:0,totalNativeOperations:0,nativeThroughput:0,nativeErrorRate:0,memoryUsage:0,itemCount:0,uniqueKeys:0,uptimeMs:0,latencyData:[],cacheThroughData:[],nativeData:[]});this.getView().setModel(this.uiModel,"ui");this.getRouter().getRoute("singleMetric").attachPatternMatched(this.onRouteMatched,this)},onRouteMatched:function e(t){const{cache:i,metricId:a}=t.getParameter("arguments");this.uiModel.setProperty("/metricId",a);this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded");this.loadMetric(i,a);this.formatChart()},loadMetric:async function e(t,a){try{const e=this.getModel();const s=e.bindContext(`/Metrics(ID='${a}',cache='${t}')`);const r=await s.requestObject();if(r){this.uiModel.setProperty("/hitRatio",r.hitRatio||0);this.uiModel.setProperty("/cacheEfficiency",r.cacheEfficiency||0);this.uiModel.setProperty("/throughput",r.throughput||0);this.uiModel.setProperty("/errorRate",r.errorRate||0);this.uiModel.setProperty("/avgLatency",r.avgLatency||0);this.uiModel.setProperty("/avgHitLatency",r.avgHitLatency||0);this.uiModel.setProperty("/avgMissLatency",r.avgMissLatency||0);this.uiModel.setProperty("/hits",r.hits||0);this.uiModel.setProperty("/misses",r.misses||0);this.uiModel.setProperty("/sets",r.sets||0);this.uiModel.setProperty("/deletes",r.deletes||0);this.uiModel.setProperty("/errors",r.errors||0);this.uiModel.setProperty("/nativeSets",r.nativeSets||0);this.uiModel.setProperty("/nativeGets",r.nativeGets||0);this.uiModel.setProperty("/nativeDeletes",r.nativeDeletes||0);this.uiModel.setProperty("/nativeClears",r.nativeClears||0);this.uiModel.setProperty("/nativeDeleteByTags",r.nativeDeleteByTags||0);this.uiModel.setProperty("/nativeErrors",r.nativeErrors||0);this.uiModel.setProperty("/totalNativeOperations",r.totalNativeOperations||0);this.uiModel.setProperty("/nativeThroughput",r.nativeThroughput||0);this.uiModel.setProperty("/nativeErrorRate",r.nativeErrorRate||0);this.uiModel.setProperty("/memoryUsage",r.memoryUsage||0);this.uiModel.setProperty("/itemCount",r.itemCount||0);this.uiModel.setProperty("/uptimeMs",r.uptimeMs||0);this.uiModel.setProperty("/uniqueKeys",0);this.generateLatencyChartData(r);this.generateCacheThroughChartData(r);this.generateNativeChartData(r)}else{i.error("Metric not found")}}catch(e){console.error("Error loading metric:",e);i.error("Failed to load metric details")}},generateLatencyChartData:function e(t){const i=[{operation:"Average Hit Latency",latency:t.avgHitLatency||0},{operation:"Average Miss Latency",latency:t.avgMissLatency||0},{operation:"Average Read-Through Latency",latency:t.avgReadThroughLatency||0}];this.uiModel.setProperty("/latencyData",i)},generateCacheThroughChartData:function e(t){const i=[{operation:"Hits",count:t.hits||0},{operation:"Misses",count:t.misses||0},{operation:"Errors",count:t.errors||0}];this.uiModel.setProperty("/cacheThroughData",i)},generateNativeChartData:function e(t){const i=[{operation:"Sets",count:t.nativeSets||0},{operation:"Gets",count:t.nativeGets||0},{operation:"Deletes",count:t.nativeDeletes||0},{operation:"Clears",count:t.nativeClears||0},{operation:"Delete By Tags",count:t.nativeDeleteByTags||0},{operation:"Errors",count:t.nativeErrors||0}];this.uiModel.setProperty("/nativeData",i)},formatChart:function e(){const t=this.getView().byId("metricLatencyChart");if(t){t.setVizProperties({legend:{visible:false},plotArea:{dataLabel:{visible:true,formatString:"#,## ms"},gridline:{visible:false}},valueAxis:{axisLine:{visible:false},axisTick:{visible:false},label:{visible:false},title:{visible:false}},categoryAxis:{title:{visible:false}},title:{visible:false,text:"Latency by Operation"}})}const i=this.getView().byId("metricCacheThroughChart");if(i){i.setVizProperties({legend:{visible:true},plotArea:{dataLabel:{visible:true}},title:{visible:false}})}const a=this.getView().byId("metricNativeChart");if(a){a.setVizProperties({legend:{visible:true},plotArea:{dataLabel:{visible:true}},title:{visible:false}})}},onRefresh:function e(){const t=this.getModel("app").getProperty("/selectedCache");const i=this.uiModel.getProperty("/metricId");if(t&&i){this.loadMetric(t,i)}},handleFullScreen:function e(){this.getModel("app").setProperty("/layout","EndColumnFullScreen")},handleExitFullScreen:function e(){this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded")},handleClose:function e(){this.getModel("app").setProperty("/layout","TwoColumnsMidExpanded");this.getRouter().navTo("cache",{cache:this.getModel("app").getProperty("/selectedCache")})},onColumnsChange:function e(){}});return r});
|
|
2
|
+
//# sourceMappingURL=SingleMetric.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SingleMetric.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","SingleMetric","extend","onInit","_onInit","BaseController.prototype.onInit.call","this","uiModel","JSONModel","metricId","hitRatio","cacheEfficiency","throughput","errorRate","avgLatency","avgHitLatency","avgMissLatency","hits","misses","sets","deletes","errors","nativeSets","nativeGets","nativeDeletes","nativeClears","nativeDeleteByTags","nativeErrors","totalNativeOperations","nativeThroughput","nativeErrorRate","memoryUsage","itemCount","uniqueKeys","uptimeMs","latencyData","cacheThroughData","nativeData","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","setProperty","getModel","loadMetric","formatChart","async","_loadMetric","cacheName","model","context","bindContext","metric","requestObject","generateLatencyChartData","generateCacheThroughChartData","generateNativeChartData","MessageBox","error","console","_generateLatencyChartData","operation","latency","avgReadThroughLatency","_generateCacheThroughChartData","count","_generateNativeChartData","_formatChart","latencyChart","byId","setVizProperties","legend","visible","plotArea","dataLabel","formatString","gridline","valueAxis","axisLine","axisTick","label","title","categoryAxis","text","cacheThroughChart","nativeChart","onRefresh","_onRefresh","getProperty","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","handleClose","_handleClose","navTo","onColumnsChange","_onColumnsChange"],"sources":["SingleMetric.controller.ts"],"sourcesContent":["import BaseController from \"./BaseController\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport MessageBox from \"sap/m/MessageBox\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class SingleMetric extends BaseController {\n private uiModel: JSONModel;\n\n public onInit(): void {\n super.onInit();\n\n // Create a JSON model for UI data binding\n this.uiModel = new JSONModel({\n metricId: \"\",\n // Performance metrics\n hitRatio: 0,\n cacheEfficiency: 0,\n throughput: 0,\n errorRate: 0,\n // Latency metrics\n avgLatency: 0,\n avgHitLatency: 0,\n avgMissLatency: 0,\n // Operation counts\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n errors: 0,\n // Native function metrics\n nativeSets: 0,\n nativeGets: 0,\n nativeDeletes: 0,\n nativeClears: 0,\n nativeDeleteByTags: 0,\n nativeErrors: 0,\n totalNativeOperations: 0,\n nativeThroughput: 0,\n nativeErrorRate: 0,\n // System information\n memoryUsage: 0,\n itemCount: 0,\n uniqueKeys: 0,\n uptimeMs: 0,\n // Chart data\n latencyData: [],\n cacheThroughData: [],\n nativeData: []\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n this.getRouter().getRoute(\"singleMetric\").attachPatternMatched(this.onRouteMatched, this);\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache, metricId } = event.getParameter(\"arguments\") as { cache: string; metricId: string };\n\n this.uiModel.setProperty(\"/metricId\", metricId);\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n\n // Load the specific metric\n this.loadMetric(cache, metricId);\n\n this.formatChart();\n }\n\n /**\n * Load specific metric data\n */\n private async loadMetric(cacheName: string, metricId: string): Promise<void> {\n try {\n const model = this.getModel() as ODataModel;\n\n // Try to get the metric from the Metrics entity\n const context = model.bindContext(`/Metrics(ID='${metricId}',cache='${cacheName}')`);\n const metric = await context.requestObject();\n\n if (metric) {\n // Set all the metric values\n this.uiModel.setProperty(\"/hitRatio\", metric.hitRatio || 0);\n this.uiModel.setProperty(\"/cacheEfficiency\", metric.cacheEfficiency || 0);\n this.uiModel.setProperty(\"/throughput\", metric.throughput || 0);\n this.uiModel.setProperty(\"/errorRate\", metric.errorRate || 0);\n\n // Latency metrics\n this.uiModel.setProperty(\"/avgLatency\", metric.avgLatency || 0);\n this.uiModel.setProperty(\"/avgHitLatency\", metric.avgHitLatency || 0);\n this.uiModel.setProperty(\"/avgMissLatency\", metric.avgMissLatency || 0);\n\n // Operation counts\n this.uiModel.setProperty(\"/hits\", metric.hits || 0);\n this.uiModel.setProperty(\"/misses\", metric.misses || 0);\n this.uiModel.setProperty(\"/sets\", metric.sets || 0);\n this.uiModel.setProperty(\"/deletes\", metric.deletes || 0);\n this.uiModel.setProperty(\"/errors\", metric.errors || 0);\n\n // Native function metrics\n this.uiModel.setProperty(\"/nativeSets\", metric.nativeSets || 0);\n this.uiModel.setProperty(\"/nativeGets\", metric.nativeGets || 0);\n this.uiModel.setProperty(\"/nativeDeletes\", metric.nativeDeletes || 0);\n this.uiModel.setProperty(\"/nativeClears\", metric.nativeClears || 0);\n this.uiModel.setProperty(\"/nativeDeleteByTags\", metric.nativeDeleteByTags || 0);\n this.uiModel.setProperty(\"/nativeErrors\", metric.nativeErrors || 0);\n this.uiModel.setProperty(\"/totalNativeOperations\", metric.totalNativeOperations || 0);\n this.uiModel.setProperty(\"/nativeThroughput\", metric.nativeThroughput || 0);\n this.uiModel.setProperty(\"/nativeErrorRate\", metric.nativeErrorRate || 0);\n\n // System information\n this.uiModel.setProperty(\"/memoryUsage\", metric.memoryUsage || 0);\n this.uiModel.setProperty(\"/itemCount\", metric.itemCount || 0);\n this.uiModel.setProperty(\"/uptimeMs\", metric.uptimeMs || 0);\n\n // Calculate unique keys (this might need to come from a different source)\n this.uiModel.setProperty(\"/uniqueKeys\", 0); // TODO: Get from key metrics data\n\n // Generate chart data\n this.generateLatencyChartData(metric);\n this.generateCacheThroughChartData(metric);\n this.generateNativeChartData(metric);\n\n } else {\n MessageBox.error(\"Metric not found\");\n }\n\n } catch (error) {\n console.error(\"Error loading metric:\", error);\n MessageBox.error(\"Failed to load metric details\");\n }\n }\n\n /**\n * Generate latency data for the chart\n */\n private generateLatencyChartData(metric: any): void {\n const latencyData = [\n {\n operation: \"Average Hit Latency\",\n latency: metric.avgHitLatency || 0\n },\n {\n operation: \"Average Miss Latency\",\n latency: metric.avgMissLatency || 0\n },\n {\n operation: \"Average Read-Through Latency\",\n latency: metric.avgReadThroughLatency || 0\n }\n ];\n\n this.uiModel.setProperty(\"/latencyData\", latencyData);\n }\n\n /**\n * Generate Read-Through operations data for pie chart\n */\n private generateCacheThroughChartData(metric: any): void {\n const cacheThroughData = [\n {\n operation: \"Hits\",\n count: metric.hits || 0\n },\n {\n operation: \"Misses\",\n count: metric.misses || 0\n },\n {\n operation: \"Errors\",\n count: metric.errors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/cacheThroughData\", cacheThroughData);\n }\n\n /**\n * Generate Native Function operations data for pie chart\n */\n private generateNativeChartData(metric: any): void {\n const nativeData = [\n {\n operation: \"Sets\",\n count: metric.nativeSets || 0\n },\n {\n operation: \"Gets\",\n count: metric.nativeGets || 0\n },\n {\n operation: \"Deletes\",\n count: metric.nativeDeletes || 0\n },\n {\n operation: \"Clears\",\n count: metric.nativeClears || 0\n },\n {\n operation: \"Delete By Tags\",\n count: metric.nativeDeleteByTags || 0\n },\n {\n operation: \"Errors\",\n count: metric.nativeErrors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/nativeData\", nativeData);\n }\n\n public formatChart() {\n // Format latency chart (bar chart)\n const latencyChart = this.getView().byId(\"metricLatencyChart\") as any;\n if (latencyChart) {\n latencyChart.setVizProperties({\n legend: {\n visible: false\n },\n plotArea: {\n dataLabel: {\n visible: true,\n formatString: \"#,## ms\"\n },\n gridline: {\n visible: false\n }\n },\n valueAxis: {\n axisLine: {\n visible: false\n },\n axisTick: {\n visible: false\n },\n label: {\n visible: false\n },\n title: {\n visible: false\n }\n },\n categoryAxis: {\n title: {\n visible: false\n }\n },\n title: {\n visible: false,\n text: 'Latency by Operation'\n }\n });\n }\n\n // Format Read-Through pie chart\n const cacheThroughChart = this.getView().byId(\"metricCacheThroughChart\") as any;\n if (cacheThroughChart) {\n cacheThroughChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n\n // Format Native Function pie chart\n const nativeChart = this.getView().byId(\"metricNativeChart\") as any;\n if (nativeChart) {\n nativeChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n }\n\n /**\n * Handle refresh button press\n */\n public onRefresh(): void {\n const cacheName = this.getModel(\"app\").getProperty(\"/selectedCache\");\n const metricId = this.uiModel.getProperty(\"/metricId\");\n\n if (cacheName && metricId) {\n this.loadMetric(cacheName, metricId);\n }\n }\n\n /**\n * Handle full screen mode\n */\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"EndColumnFullScreen\");\n }\n\n /**\n * Handle exit full screen mode\n */\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n\n /**\n * Handle close end column\n */\n public handleClose(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n this.getRouter().navTo(\"cache\", { cache: this.getModel(\"app\").getProperty(\"/selectedCache\") });\n }\n\n /**\n * Handle grid columns change\n */\n public onColumnsChange(): void {\n // Handle responsive grid column changes if needed\n }\n} "],"mappings":"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","ignoreList":[]}
|