cds-caching 1.3.1 → 1.3.2

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.
Files changed (32) hide show
  1. package/README.md +16 -0
  2. package/app/dashboard/controller/App-dbg.controller.js +14 -14
  3. package/app/dashboard/controller/App-dbg.controller.js.map +1 -1
  4. package/app/dashboard/controller/App.controller.js +1 -1
  5. package/app/dashboard/controller/App.controller.js.map +1 -1
  6. package/app/dashboard/controller/App.controller.ts +14 -14
  7. package/app/dashboard/controller/BaseController-dbg.js +7 -0
  8. package/app/dashboard/controller/BaseController-dbg.js.map +1 -1
  9. package/app/dashboard/controller/BaseController.js +1 -1
  10. package/app/dashboard/controller/BaseController.js.map +1 -1
  11. package/app/dashboard/controller/BaseController.ts +10 -0
  12. package/app/dashboard/controller/Cache-dbg.controller.js +34 -25
  13. package/app/dashboard/controller/Cache-dbg.controller.js.map +1 -1
  14. package/app/dashboard/controller/Cache.controller.js +1 -1
  15. package/app/dashboard/controller/Cache.controller.js.map +1 -1
  16. package/app/dashboard/controller/Cache.controller.ts +36 -25
  17. package/app/dashboard/controller/SingleMetric-dbg.controller.js +56 -50
  18. package/app/dashboard/controller/SingleMetric-dbg.controller.js.map +1 -1
  19. package/app/dashboard/controller/SingleMetric.controller.js +1 -1
  20. package/app/dashboard/controller/SingleMetric.controller.js.map +1 -1
  21. package/app/dashboard/controller/SingleMetric.controller.ts +29 -22
  22. package/app/dashboard/i18n/i18n.properties +235 -0
  23. package/app/dashboard/i18n/i18n_de.properties +271 -3
  24. package/app/dashboard/i18n/i18n_en.properties +295 -2
  25. package/app/dashboard/resources/sap-ui-custom.js +11 -11
  26. package/app/dashboard/resources/sap-ui-custom.js.map +1 -1
  27. package/app/dashboard/view/Cache.view.xml +149 -149
  28. package/app/dashboard/view/Main.view.xml +7 -7
  29. package/app/dashboard/view/SingleMetric.view.xml +30 -30
  30. package/cds-plugin.js +31 -8
  31. package/lib/util.js +28 -2
  32. package/package.json +1 -1
@@ -110,7 +110,7 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
110
110
  this.uiModel.setProperty("/cacheEntries", entries);
111
111
  } catch (error) {
112
112
  console.error("Error loading cache entries:", error);
113
- MessageBox.error("Failed to load cache entries");
113
+ MessageBox.error(await this.i18nText("msgLoadEntriesFailed"));
114
114
  } finally {
115
115
  this.uiModel.setProperty("/loadingEntries", false);
116
116
  }
@@ -143,7 +143,7 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
143
143
  const value = this.uiModel.getProperty("/createValue");
144
144
  const ttl = this.uiModel.getProperty("/createTtl");
145
145
  if (!key || !value) {
146
- MessageBox.error("Please provide both key and value");
146
+ MessageBox.error(await this.i18nText("msgProvideKeyValue"));
147
147
  return;
148
148
  }
149
149
  try {
@@ -153,7 +153,7 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
153
153
  context.setParameter("value", value);
154
154
  context.setParameter("ttl", ttl);
155
155
  await context.invoke();
156
- MessageToast.show("Cache entry created successfully");
156
+ MessageToast.show(await this.i18nText("msgEntryCreated"));
157
157
 
158
158
  // Clear form
159
159
  this.uiModel.setProperty("/createKey", "");
@@ -161,7 +161,7 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
161
161
  this.uiModel.setProperty("/createTtl", 3600);
162
162
  } catch (error) {
163
163
  console.error("Error setting cache entry:", error);
164
- MessageBox.error("Failed to create cache entry");
164
+ MessageBox.error(await this.i18nText("msgCreateEntryFailed"));
165
165
  }
166
166
  },
167
167
  /**
@@ -171,7 +171,7 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
171
171
  const cacheContext = this.getView().getElementBinding().getBoundContext();
172
172
  const key = this.uiModel.getProperty("/getKey");
173
173
  if (!key) {
174
- MessageBox.error("Please provide a key");
174
+ MessageBox.error(await this.i18nText("msgProvideKey"));
175
175
  return;
176
176
  }
177
177
  try {
@@ -180,10 +180,10 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
180
180
  action.setParameter("key", key);
181
181
  await action.invoke();
182
182
  const result = await action.requestObject();
183
- this.uiModel.setProperty("/getValue", result.value || "Not found");
183
+ this.uiModel.setProperty("/getValue", result.value || (await this.i18nText("msgNotFound")));
184
184
  } catch (error) {
185
185
  console.error("Error getting cache entry:", error);
186
- this.uiModel.setProperty("/getValue", "Error: Entry not found or error occurred");
186
+ this.uiModel.setProperty("/getValue", await this.i18nText("msgGetEntryError"));
187
187
  }
188
188
  },
189
189
  /**
@@ -193,7 +193,7 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
193
193
  const cacheContext = this.getView().getElementBinding().getBoundContext();
194
194
  const key = this.uiModel.getProperty("/deleteKey");
195
195
  if (!key) {
196
- MessageBox.error("Please provide a key");
196
+ MessageBox.error(await this.i18nText("msgProvideKey"));
197
197
  return;
198
198
  }
199
199
  try {
@@ -201,13 +201,13 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
201
201
  const context = model.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`, cacheContext);
202
202
  context.setParameter("key", key);
203
203
  await context.invoke();
204
- MessageToast.show("Cache entry deleted successfully");
204
+ MessageToast.show(await this.i18nText("msgEntryDeleted"));
205
205
 
206
206
  // Clear form
207
207
  this.uiModel.setProperty("/deleteKey", "");
208
208
  } catch (error) {
209
209
  console.error("Error deleting cache entry:", error);
210
- MessageBox.error("Failed to delete cache entry");
210
+ MessageBox.error(await this.i18nText("msgDeleteEntryFailed"));
211
211
  }
212
212
  },
213
213
  /**
@@ -221,10 +221,10 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
221
221
  const context = model.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`, cacheContext);
222
222
  context.setParameter("enabled", enabled);
223
223
  await context.invoke();
224
- MessageToast.show(`Metrics ${enabled ? 'enabled' : 'disabled'} successfully`);
224
+ MessageToast.show(await this.i18nText(enabled ? "msgMetricsEnabled" : "msgMetricsDisabled"));
225
225
  } catch (error) {
226
226
  console.error("Error setting metrics enabled:", error);
227
- MessageBox.error("Failed to update metrics setting");
227
+ MessageBox.error(await this.i18nText("msgFailedUpdateMetrics"));
228
228
  // Revert the switch
229
229
  this.uiModel.setProperty("/enableMetrics", !enabled);
230
230
  }
@@ -240,10 +240,10 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
240
240
  const context = model.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`, cacheContext);
241
241
  context.setParameter("enabled", enabled);
242
242
  await context.invoke();
243
- MessageToast.show(`Key metrics ${enabled ? 'enabled' : 'disabled'} successfully`);
243
+ MessageToast.show(await this.i18nText(enabled ? "msgKeyMetricsEnabled" : "msgKeyMetricsDisabled"));
244
244
  } catch (error) {
245
245
  console.error("Error setting key metrics enabled:", error);
246
- MessageBox.error("Failed to update key metrics setting");
246
+ MessageBox.error(await this.i18nText("msgFailedKeyMetrics"));
247
247
  // Revert the switch
248
248
  this.uiModel.setProperty("/enableKeyMetrics", !enabled);
249
249
  }
@@ -253,7 +253,8 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
253
253
  */
254
254
  onClearCache: async function _onClearCache() {
255
255
  const cacheContext = this.getView().getElementBinding().getBoundContext();
256
- MessageBox.confirm("Are you sure you want to clear this cache? This action cannot be undone.", {
256
+ const confirmMsg = await this.i18nText("msgConfirmClearCache");
257
+ MessageBox.confirm(confirmMsg, {
257
258
  actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],
258
259
  emphasizedAction: MessageBox.Action.OK,
259
260
  onClose: async action => {
@@ -262,13 +263,13 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
262
263
  const model = this.getModel();
263
264
  const context = model.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`, cacheContext);
264
265
  await context.invoke();
265
- MessageBox.success("Cache cleared successfully");
266
+ MessageBox.success(await this.i18nText("msgCacheCleared"));
266
267
 
267
268
  // Refresh the data
268
269
  await this.onRefresh();
269
270
  } catch (error) {
270
271
  console.error("Error clearing cache:", error);
271
- MessageBox.error("Failed to clear cache");
272
+ MessageBox.error(await this.i18nText("msgClearCacheFailed"));
272
273
  }
273
274
  }
274
275
  }
@@ -336,28 +337,33 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
336
337
  cacheOptions: saveJson(context.getProperty("cacheOptions")),
337
338
  keyName: context.getProperty("keyName")
338
339
  });
340
+ const e = s => Cache.escapeFragmentXml(s);
341
+ const tabMeta = e(await this.i18nText("keyTabMetadata"));
342
+ const tabSub = e(await this.i18nText("keyTabSubject"));
343
+ const tabQ = e(await this.i18nText("keyTabQuery"));
344
+ const tabCo = e(await this.i18nText("keyTabCacheOptions"));
339
345
  const fragment = await Fragment.load({
340
346
  definition: `<core:FragmentDefinition xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:form="sap.ui.layout.form">
341
347
  <Popover title="{localData>/keyName}" placement="Bottom" contentWidth="30rem">
342
348
  <content>
343
349
  <IconTabBar>
344
350
  <items>
345
- <IconTabFilter text="Metadata">
351
+ <IconTabFilter text="${tabMeta}">
346
352
  <content>
347
353
  <TextArea value="{localData>/metadata}" rows="20" width="100%" editable="false" />
348
354
  </content>
349
355
  </IconTabFilter>
350
- <IconTabFilter text="Subject" >
356
+ <IconTabFilter text="${tabSub}" >
351
357
  <content>
352
358
  <TextArea value="{localData>/subject}" rows="20" width="100%" editable="false" />
353
359
  </content>
354
360
  </IconTabFilter>
355
- <IconTabFilter text="Query" >
361
+ <IconTabFilter text="${tabQ}" >
356
362
  <content>
357
363
  <TextArea value="{localData>/query}" rows="20" width="100%" editable="false" />
358
364
  </content>
359
365
  </IconTabFilter>
360
- <IconTabFilter text="Cache Options" >
366
+ <IconTabFilter text="${tabCo}" >
361
367
  <content>
362
368
  <TextArea value="{localData>/cacheOptions}" rows="20" width="100%" editable="false" />
363
369
  </content>
@@ -385,13 +391,13 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
385
391
  const model = this.getModel();
386
392
  const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`, cacheContext);
387
393
  await action.invoke();
388
- MessageToast.show("Metrics cleared successfully");
394
+ MessageToast.show(await this.i18nText("msgMetricsCleared"));
389
395
 
390
396
  // Refresh the data
391
397
  await this.onRefreshMetricsData();
392
398
  } catch (error) {
393
399
  console.error("Error clearing metrics:", error);
394
- MessageBox.error("Failed to clear metrics");
400
+ MessageBox.error(await this.i18nText("msgFailedClearMetrics"));
395
401
  }
396
402
  },
397
403
  /**
@@ -406,16 +412,19 @@ sap.ui.define(["sap/m/MessageBox", "./BaseController", "sap/ui/model/json/JSONMo
406
412
  const model = this.getModel();
407
413
  const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`, cacheContext);
408
414
  await action.invoke();
409
- MessageToast.show("Key metrics cleared successfully");
415
+ MessageToast.show(await this.i18nText("msgKeyMetricsCleared"));
410
416
 
411
417
  // Refresh the data
412
418
  await this.onRefreshKeyMetricsData();
413
419
  } catch (error) {
414
420
  console.error("Error clearing key metrics:", error);
415
- MessageBox.error("Failed to clear key metrics");
421
+ MessageBox.error(await this.i18nText("msgFailedClearKeyMetrics"));
416
422
  }
417
423
  }
418
424
  });
425
+ Cache.escapeFragmentXml = function escapeFragmentXml(s) {
426
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
427
+ };
419
428
  return Cache;
420
429
  });
421
430
  //# sourceMappingURL=Cache-dbg.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Cache-dbg.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","Cache","extend","onInit","_onInit","BaseController.prototype.onInit.call","uiModel","JSONModel","selectedTab","statistics","loading","loadingEntries","showEntriesTable","cacheEntries","createKey","createValue","createTtl","getKey","getValue","deleteKey","metricsEnabled","keyMetricsEnabled","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","getModel","setProperty","bindElement","path","events","change","context","getElementBinding","getBoundContext","getProperty","loadStatistics","loadKeyMetricsData","_loadStatistics","refresh","table","byId","filter","Filter","FilterOperator","EQ","getBinding","isSuspended","resume","_loadKeyMetricsData","onLoadCacheEntries","_onLoadCacheEntries","cacheContext","setSizeLimit","model","bindContext","invoke","value","entries","requestObject","entry","tags","join","error","console","MessageBox","onMetricsRowSelect","_onMetricsRowSelect","selectedRow","metric","getObject","cacheName","navTo","metricId","ID","onSetKey","_onSetKey","key","ttl","setParameter","MessageToast","show","onGetKey","_onGetKey","action","result","onDeleteKey","_onDeleteKey","onEnableMetricsChange","_onEnableMetricsChange","enabled","onEnableKeyMetricsChange","_onEnableKeyMetricsChange","onClearCache","_onClearCache","confirm","actions","Action","OK","CANCEL","emphasizedAction","onClose","success","onRefresh","_onRefresh","handleClose","_handleClose","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","onKeyMetricsRowSelect","_onKeyMetricsRowSelect","keyMetricId","onRefreshKeyMetricsData","_onRefreshKeyMetricsData","onRefreshMetricsData","_onRefreshMetricsData","onShowKeyMetricsMetadata","_onShowKeyMetricsMetadata","getSource","getBindingContext","saveJson","json","JSON","stringify","parse","localData","metadata","subject","query","cacheOptions","keyName","fragment","Fragment","load","definition","controller","popover","openBy","onClearMetrics","_onClearMetrics","onClearKeyMetrics","_onClearKeyMetrics"],"sources":["Cache.controller.ts"],"sourcesContent":["import MessageBox from \"sap/m/MessageBox\";\nimport BaseController from \"./BaseController\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport Table, { Table$RowSelectionChangeEvent } from \"sap/ui/table/Table\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport Context from \"sap/ui/model/odata/v4/Context\";\nimport Filter from \"sap/ui/model/Filter\";\nimport FilterOperator from \"sap/ui/model/FilterOperator\";\nimport ODataListBinding from \"sap/ui/model/odata/v4/ODataListBinding\";\nimport { Button$PressEvent } from \"sap/m/Button\";\nimport Fragment from \"sap/ui/core/Fragment\";\nimport Popover from \"sap/m/Popover\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class Cache 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 selectedTab: \"main\",\n statistics: [],\n loading: false,\n loadingEntries: false,\n showEntriesTable: false,\n cacheEntries: [],\n\n // Create\n createKey: \"\",\n createValue: \"\",\n createTtl: 3600,\n\n // Get\n getKey: \"\",\n getValue: \"\",\n\n // Delete\n deleteKey: \"\",\n\n // Metrics\n metricsEnabled: false,\n keyMetricsEnabled: false,\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n\n this.getRouter().getRoute(\"cache\").attachPatternMatched(this.onRouteMatched, this);\n\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache } = event.getParameter(\"arguments\") as { cache: string };\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/selectedCache\", cache);\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n\n this.getView().bindElement({\n path: \"/Caches('\" + cache + \"')\",\n events: {\n change: (event: any) => {\n const context = this.getView().getElementBinding().getBoundContext();\n if (context) {\n const cache = context.getProperty(\"configuration\");\n this.uiModel.setProperty(\"/config\", cache);\n this.loadStatistics();\n this.loadKeyMetricsData();\n }\n }\n }\n });\n }\n\n /**\n * Load statistics based on current filters\n */\n private async loadStatistics(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"metricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n /**\n * Load key tracking data\n */\n async loadKeyMetricsData(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"keyMetricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n\n /**\n * Load cache entries\n */\n public async onLoadCacheEntries(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n this.uiModel.setProperty(\"/loadingEntries\", true);\n this.uiModel.setProperty(\"/showEntriesTable\", true);\n this.uiModel.setSizeLimit(100_000);\n\n // Call the backend to get cache entries\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`, cacheContext);\n await context.invoke();\n const { value: entries } = await context.requestObject();\n for (const entry of entries) {\n entry.tags = entry.tags.join(\", \");\n }\n\n this.uiModel.setProperty(\"/cacheEntries\", entries);\n\n } catch (error) {\n console.error(\"Error loading cache entries:\", error);\n MessageBox.error(\"Failed to load cache entries\");\n } finally {\n this.uiModel.setProperty(\"/loadingEntries\", false);\n }\n }\n\n /**\n * Handle statistics row selection\n */\n public onMetricsRowSelect(event: Table$RowSelectionChangeEvent): void {\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleMetric\", {\n cache: cacheName,\n metricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Set cache entry\n */\n public async onSetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/createKey\");\n const value = this.uiModel.getProperty(\"/createValue\");\n const ttl = this.uiModel.getProperty(\"/createTtl\");\n\n if (!key || !value) {\n MessageBox.error(\"Please provide both key and value\");\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n context.setParameter(\"value\", value);\n context.setParameter(\"ttl\", ttl);\n await context.invoke();\n\n\n MessageToast.show(\"Cache entry created successfully\");\n\n // Clear form\n this.uiModel.setProperty(\"/createKey\", \"\");\n this.uiModel.setProperty(\"/createValue\", \"\");\n this.uiModel.setProperty(\"/createTtl\", 3600);\n\n } catch (error) {\n console.error(\"Error setting cache entry:\", error);\n MessageBox.error(\"Failed to create cache entry\");\n }\n }\n\n /**\n * Get cache entry\n */\n public async onGetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/getKey\");\n\n if (!key) {\n MessageBox.error(\"Please provide a key\");\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`, cacheContext);\n action.setParameter(\"key\", key);\n await action.invoke();\n\n const result = await action.requestObject();\n this.uiModel.setProperty(\"/getValue\", result.value || \"Not found\");\n\n } catch (error) {\n console.error(\"Error getting cache entry:\", error);\n this.uiModel.setProperty(\"/getValue\", \"Error: Entry not found or error occurred\");\n }\n }\n\n /**\n * Delete cache entry\n */\n public async onDeleteKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/deleteKey\");\n\n if (!key) {\n MessageBox.error(\"Please provide a key\");\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n await context.invoke();\n\n MessageToast.show(\"Cache entry deleted successfully\");\n\n // Clear form\n this.uiModel.setProperty(\"/deleteKey\", \"\");\n\n } catch (error) {\n console.error(\"Error deleting cache entry:\", error);\n MessageBox.error(\"Failed to delete cache entry\");\n }\n }\n\n /**\n * Enable/disable statistics\n */\n public async onEnableMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(`Metrics ${enabled ? 'enabled' : 'disabled'} successfully`);\n } catch (error) {\n console.error(\"Error setting metrics enabled:\", error);\n MessageBox.error(\"Failed to update metrics setting\");\n // Revert the switch\n this.uiModel.setProperty(\"/enableMetrics\", !enabled);\n }\n }\n\n /**\n * Enable/disable key tracking\n */\n public async onEnableKeyMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(`Key metrics ${enabled ? 'enabled' : 'disabled'} successfully`);\n\n } catch (error) {\n console.error(\"Error setting key metrics enabled:\", error);\n MessageBox.error(\"Failed to update key metrics setting\");\n // Revert the switch\n this.uiModel.setProperty(\"/enableKeyMetrics\", !enabled);\n }\n }\n\n /**\n * Clear cache\n */\n public async onClearCache(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n MessageBox.confirm(\"Are you sure you want to clear this cache? This action cannot be undone.\", {\n actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],\n emphasizedAction: MessageBox.Action.OK,\n onClose: async (action: string) => {\n if (action === MessageBox.Action.OK) {\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`, cacheContext);\n await context.invoke();\n\n MessageBox.success(\"Cache cleared successfully\");\n\n // Refresh the data\n await this.onRefresh();\n\n } catch (error) {\n console.error(\"Error clearing cache:\", error);\n MessageBox.error(\"Failed to clear cache\");\n }\n }\n }\n });\n }\n\n /**\n * Handle refresh button press\n */\n public async onRefresh(): Promise<void> {\n if (this.getView().getElementBinding().getBoundContext()) {\n await this.loadStatistics(true);\n await this.loadKeyMetricsData(true);\n }\n }\n\n public handleClose(): void {\n this.getRouter().navTo(\"main\");\n }\n\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"MidColumnFullScreen\");\n }\n\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n }\n\n /**\n * Handle key row selection\n */\n public onKeyMetricsRowSelect(event: any): void {\n\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleKeyMetric\", {\n cache: cacheName,\n keyMetricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Refresh key data\n */\n public async onRefreshKeyMetricsData(): Promise<void> {\n await this.loadKeyMetricsData(true);\n }\n\n public async onRefreshMetricsData(): Promise<void> {\n await this.loadStatistics(true);\n }\n\n public async onShowKeyMetricsMetadata(event: Button$PressEvent): Promise<void> {\n const context = event.getSource().getBindingContext() as Context;\n\n const saveJson = (json: string) => {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch (error) {\n return json\n }\n }\n\n const localData = new JSONModel({\n metadata: saveJson(context.getProperty(\"metadata\")),\n subject: saveJson(context.getProperty(\"subject\")),\n query: saveJson(context.getProperty(\"query\")),\n cacheOptions: saveJson(context.getProperty(\"cacheOptions\")),\n keyName: context.getProperty(\"keyName\"),\n });\n\n const fragment = await Fragment.load({\n definition: `<core:FragmentDefinition xmlns:core=\"sap.ui.core\" xmlns:mvc=\"sap.ui.core.mvc\" xmlns=\"sap.m\" xmlns:form=\"sap.ui.layout.form\">\n <Popover title=\"{localData>/keyName}\" placement=\"Bottom\" contentWidth=\"30rem\">\n <content>\n <IconTabBar>\n <items>\n <IconTabFilter text=\"Metadata\">\n <content>\n <TextArea value=\"{localData>/metadata}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"Subject\" >\n <content>\n <TextArea value=\"{localData>/subject}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"Query\" >\n <content>\n <TextArea value=\"{localData>/query}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"Cache Options\" >\n <content>\n <TextArea value=\"{localData>/cacheOptions}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n </items>\n </IconTabBar>\n </content>\n </Popover>\n </core:FragmentDefinition>`,\n controller: this,\n });\n\n const popover = fragment as Popover;\n popover.setModel(localData, \"localData\");\n popover.openBy(event.getSource());\n }\n\n /**\n * Clear statistics\n */\n public async onClearMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(\"Metrics cleared successfully\");\n\n // Refresh the data\n await this.onRefreshMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing metrics:\", error);\n MessageBox.error(\"Failed to clear metrics\");\n }\n }\n\n /**\n * Clear key metrics\n */\n public async onClearKeyMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(\"Key metrics cleared successfully\");\n\n // Refresh the data\n await this.onRefreshKeyMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing key metrics:\", error);\n MessageBox.error(\"Failed to clear key metrics\");\n }\n }\n\n}"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Cache-dbg.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","Cache","extend","onInit","_onInit","BaseController.prototype.onInit.call","uiModel","JSONModel","selectedTab","statistics","loading","loadingEntries","showEntriesTable","cacheEntries","createKey","createValue","createTtl","getKey","getValue","deleteKey","metricsEnabled","keyMetricsEnabled","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","getModel","setProperty","bindElement","path","events","change","context","getElementBinding","getBoundContext","getProperty","loadStatistics","loadKeyMetricsData","_loadStatistics","refresh","table","byId","filter","Filter","FilterOperator","EQ","getBinding","isSuspended","resume","_loadKeyMetricsData","onLoadCacheEntries","_onLoadCacheEntries","cacheContext","setSizeLimit","model","bindContext","invoke","value","entries","requestObject","entry","tags","join","error","console","MessageBox","i18nText","onMetricsRowSelect","_onMetricsRowSelect","selectedRow","metric","getObject","cacheName","navTo","metricId","ID","onSetKey","_onSetKey","key","ttl","setParameter","MessageToast","show","onGetKey","_onGetKey","action","result","onDeleteKey","_onDeleteKey","onEnableMetricsChange","_onEnableMetricsChange","enabled","onEnableKeyMetricsChange","_onEnableKeyMetricsChange","onClearCache","_onClearCache","confirmMsg","confirm","actions","Action","OK","CANCEL","emphasizedAction","onClose","success","onRefresh","_onRefresh","handleClose","_handleClose","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","onKeyMetricsRowSelect","_onKeyMetricsRowSelect","keyMetricId","onRefreshKeyMetricsData","_onRefreshKeyMetricsData","onRefreshMetricsData","_onRefreshMetricsData","onShowKeyMetricsMetadata","_onShowKeyMetricsMetadata","getSource","getBindingContext","saveJson","json","JSON","stringify","parse","localData","metadata","subject","query","cacheOptions","keyName","e","s","escapeFragmentXml","tabMeta","tabSub","tabQ","tabCo","fragment","Fragment","load","definition","controller","popover","openBy","onClearMetrics","_onClearMetrics","onClearKeyMetrics","_onClearKeyMetrics","replace"],"sources":["Cache.controller.ts"],"sourcesContent":["import MessageBox from \"sap/m/MessageBox\";\nimport BaseController from \"./BaseController\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport Table, { Table$RowSelectionChangeEvent } from \"sap/ui/table/Table\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport Context from \"sap/ui/model/odata/v4/Context\";\nimport Filter from \"sap/ui/model/Filter\";\nimport FilterOperator from \"sap/ui/model/FilterOperator\";\nimport ODataListBinding from \"sap/ui/model/odata/v4/ODataListBinding\";\nimport { Button$PressEvent } from \"sap/m/Button\";\nimport Fragment from \"sap/ui/core/Fragment\";\nimport Popover from \"sap/m/Popover\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class Cache extends BaseController {\n private uiModel: JSONModel;\n\n private static escapeFragmentXml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\n }\n\n public onInit(): void {\n super.onInit();\n\n // Create a JSON model for UI data binding\n this.uiModel = new JSONModel({\n selectedTab: \"main\",\n statistics: [],\n loading: false,\n loadingEntries: false,\n showEntriesTable: false,\n cacheEntries: [],\n\n // Create\n createKey: \"\",\n createValue: \"\",\n createTtl: 3600,\n\n // Get\n getKey: \"\",\n getValue: \"\",\n\n // Delete\n deleteKey: \"\",\n\n // Metrics\n metricsEnabled: false,\n keyMetricsEnabled: false,\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n\n this.getRouter().getRoute(\"cache\").attachPatternMatched(this.onRouteMatched, this);\n\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache } = event.getParameter(\"arguments\") as { cache: string };\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/selectedCache\", cache);\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n\n this.getView().bindElement({\n path: \"/Caches('\" + cache + \"')\",\n events: {\n change: (event: any) => {\n const context = this.getView().getElementBinding().getBoundContext();\n if (context) {\n const cache = context.getProperty(\"configuration\");\n this.uiModel.setProperty(\"/config\", cache);\n this.loadStatistics();\n this.loadKeyMetricsData();\n }\n }\n }\n });\n }\n\n /**\n * Load statistics based on current filters\n */\n private async loadStatistics(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"metricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n /**\n * Load key tracking data\n */\n async loadKeyMetricsData(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"keyMetricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n\n /**\n * Load cache entries\n */\n public async onLoadCacheEntries(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n this.uiModel.setProperty(\"/loadingEntries\", true);\n this.uiModel.setProperty(\"/showEntriesTable\", true);\n this.uiModel.setSizeLimit(100_000);\n\n // Call the backend to get cache entries\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`, cacheContext);\n await context.invoke();\n const { value: entries } = await context.requestObject();\n for (const entry of entries) {\n entry.tags = entry.tags.join(\", \");\n }\n\n this.uiModel.setProperty(\"/cacheEntries\", entries);\n\n } catch (error) {\n console.error(\"Error loading cache entries:\", error);\n MessageBox.error(await this.i18nText(\"msgLoadEntriesFailed\"));\n } finally {\n this.uiModel.setProperty(\"/loadingEntries\", false);\n }\n }\n\n /**\n * Handle statistics row selection\n */\n public onMetricsRowSelect(event: Table$RowSelectionChangeEvent): void {\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleMetric\", {\n cache: cacheName,\n metricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Set cache entry\n */\n public async onSetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/createKey\");\n const value = this.uiModel.getProperty(\"/createValue\");\n const ttl = this.uiModel.getProperty(\"/createTtl\");\n\n if (!key || !value) {\n MessageBox.error(await this.i18nText(\"msgProvideKeyValue\"));\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n context.setParameter(\"value\", value);\n context.setParameter(\"ttl\", ttl);\n await context.invoke();\n\n\n MessageToast.show(await this.i18nText(\"msgEntryCreated\"));\n\n // Clear form\n this.uiModel.setProperty(\"/createKey\", \"\");\n this.uiModel.setProperty(\"/createValue\", \"\");\n this.uiModel.setProperty(\"/createTtl\", 3600);\n\n } catch (error) {\n console.error(\"Error setting cache entry:\", error);\n MessageBox.error(await this.i18nText(\"msgCreateEntryFailed\"));\n }\n }\n\n /**\n * Get cache entry\n */\n public async onGetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/getKey\");\n\n if (!key) {\n MessageBox.error(await this.i18nText(\"msgProvideKey\"));\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`, cacheContext);\n action.setParameter(\"key\", key);\n await action.invoke();\n\n const result = await action.requestObject();\n this.uiModel.setProperty(\"/getValue\", result.value || (await this.i18nText(\"msgNotFound\")));\n\n } catch (error) {\n console.error(\"Error getting cache entry:\", error);\n this.uiModel.setProperty(\"/getValue\", await this.i18nText(\"msgGetEntryError\"));\n }\n }\n\n /**\n * Delete cache entry\n */\n public async onDeleteKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/deleteKey\");\n\n if (!key) {\n MessageBox.error(await this.i18nText(\"msgProvideKey\"));\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n await context.invoke();\n\n MessageToast.show(await this.i18nText(\"msgEntryDeleted\"));\n\n // Clear form\n this.uiModel.setProperty(\"/deleteKey\", \"\");\n\n } catch (error) {\n console.error(\"Error deleting cache entry:\", error);\n MessageBox.error(await this.i18nText(\"msgDeleteEntryFailed\"));\n }\n }\n\n /**\n * Enable/disable statistics\n */\n public async onEnableMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(await this.i18nText(enabled ? \"msgMetricsEnabled\" : \"msgMetricsDisabled\"));\n } catch (error) {\n console.error(\"Error setting metrics enabled:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedUpdateMetrics\"));\n // Revert the switch\n this.uiModel.setProperty(\"/enableMetrics\", !enabled);\n }\n }\n\n /**\n * Enable/disable key tracking\n */\n public async onEnableKeyMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(await this.i18nText(enabled ? \"msgKeyMetricsEnabled\" : \"msgKeyMetricsDisabled\"));\n\n } catch (error) {\n console.error(\"Error setting key metrics enabled:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedKeyMetrics\"));\n // Revert the switch\n this.uiModel.setProperty(\"/enableKeyMetrics\", !enabled);\n }\n }\n\n /**\n * Clear cache\n */\n public async onClearCache(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n const confirmMsg = await this.i18nText(\"msgConfirmClearCache\");\n MessageBox.confirm(confirmMsg, {\n actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],\n emphasizedAction: MessageBox.Action.OK,\n onClose: async (action: string) => {\n if (action === MessageBox.Action.OK) {\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`, cacheContext);\n await context.invoke();\n\n MessageBox.success(await this.i18nText(\"msgCacheCleared\"));\n\n // Refresh the data\n await this.onRefresh();\n\n } catch (error) {\n console.error(\"Error clearing cache:\", error);\n MessageBox.error(await this.i18nText(\"msgClearCacheFailed\"));\n }\n }\n }\n });\n }\n\n /**\n * Handle refresh button press\n */\n public async onRefresh(): Promise<void> {\n if (this.getView().getElementBinding().getBoundContext()) {\n await this.loadStatistics(true);\n await this.loadKeyMetricsData(true);\n }\n }\n\n public handleClose(): void {\n this.getRouter().navTo(\"main\");\n }\n\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"MidColumnFullScreen\");\n }\n\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n }\n\n /**\n * Handle key row selection\n */\n public onKeyMetricsRowSelect(event: any): void {\n\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleKeyMetric\", {\n cache: cacheName,\n keyMetricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Refresh key data\n */\n public async onRefreshKeyMetricsData(): Promise<void> {\n await this.loadKeyMetricsData(true);\n }\n\n public async onRefreshMetricsData(): Promise<void> {\n await this.loadStatistics(true);\n }\n\n public async onShowKeyMetricsMetadata(event: Button$PressEvent): Promise<void> {\n const context = event.getSource().getBindingContext() as Context;\n\n const saveJson = (json: string) => {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch (error) {\n return json\n }\n }\n\n const localData = new JSONModel({\n metadata: saveJson(context.getProperty(\"metadata\")),\n subject: saveJson(context.getProperty(\"subject\")),\n query: saveJson(context.getProperty(\"query\")),\n cacheOptions: saveJson(context.getProperty(\"cacheOptions\")),\n keyName: context.getProperty(\"keyName\"),\n });\n\n const e = (s: string) => Cache.escapeFragmentXml(s);\n const tabMeta = e(await this.i18nText(\"keyTabMetadata\"));\n const tabSub = e(await this.i18nText(\"keyTabSubject\"));\n const tabQ = e(await this.i18nText(\"keyTabQuery\"));\n const tabCo = e(await this.i18nText(\"keyTabCacheOptions\"));\n\n const fragment = await Fragment.load({\n definition: `<core:FragmentDefinition xmlns:core=\"sap.ui.core\" xmlns:mvc=\"sap.ui.core.mvc\" xmlns=\"sap.m\" xmlns:form=\"sap.ui.layout.form\">\n <Popover title=\"{localData>/keyName}\" placement=\"Bottom\" contentWidth=\"30rem\">\n <content>\n <IconTabBar>\n <items>\n <IconTabFilter text=\"${tabMeta}\">\n <content>\n <TextArea value=\"{localData>/metadata}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"${tabSub}\" >\n <content>\n <TextArea value=\"{localData>/subject}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"${tabQ}\" >\n <content>\n <TextArea value=\"{localData>/query}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"${tabCo}\" >\n <content>\n <TextArea value=\"{localData>/cacheOptions}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n </items>\n </IconTabBar>\n </content>\n </Popover>\n </core:FragmentDefinition>`,\n controller: this,\n });\n\n const popover = fragment as Popover;\n popover.setModel(localData, \"localData\");\n popover.openBy(event.getSource());\n }\n\n /**\n * Clear statistics\n */\n public async onClearMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(await this.i18nText(\"msgMetricsCleared\"));\n\n // Refresh the data\n await this.onRefreshMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing metrics:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedClearMetrics\"));\n }\n }\n\n /**\n * Clear key metrics\n */\n public async onClearKeyMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(await this.i18nText(\"msgKeyMetricsCleared\"));\n\n // Refresh the data\n await this.onRefreshKeyMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing key metrics:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedClearKeyMetrics\"));\n }\n }\n\n}"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["sap/m/MessageBox","./BaseController","sap/ui/model/json/JSONModel","sap/m/MessageToast","sap/ui/model/Filter","sap/ui/model/FilterOperator","sap/ui/core/Fragment"],function(e,t,n,i,o,r,s){"use strict";function a(e){return e&&e.__esModule&&typeof e.default!=="undefined"?e.default:e}const c=a(t);const l=c.extend("cds.plugin.caching.dashboard.controller.Cache",{onInit:function e(){c.prototype.onInit.call(this);this.uiModel=new n({selectedTab:"main",statistics:[],loading:false,loadingEntries:false,showEntriesTable:false,cacheEntries:[],createKey:"",createValue:"",createTtl:3600,getKey:"",getValue:"",deleteKey:"",metricsEnabled:false,keyMetricsEnabled:false});this.getView().setModel(this.uiModel,"ui");this.getRouter().getRoute("cache").attachPatternMatched(this.onRouteMatched,this)},onRouteMatched:function e(t){const{cache:n}=t.getParameter("arguments");this.getModel("app").setProperty("/selectedCache",n);this.getModel("app").setProperty("/layout","TwoColumnsMidExpanded");this.getView().bindElement({path:"/Caches('"+n+"')",events:{change:e=>{const t=this.getView().getElementBinding().getBoundContext();if(t){const e=t.getProperty("configuration");this.uiModel.setProperty("/config",e);this.loadStatistics();this.loadKeyMetricsData()}}}})},loadStatistics:async function e(t=false){const n=this.getView().byId("metricsTable");const i=new o("cache",r.EQ,this.getModel("app").getProperty("/selectedCache"));if(n.getBinding("rows").isSuspended()){n.getBinding("rows").resume()}if(t){n.getBinding("rows").refresh()}else{n.getBinding("rows").filter(i)}},loadKeyMetricsData:async function e(t=false){const n=this.getView().byId("keyMetricsTable");const i=new o("cache",r.EQ,this.getModel("app").getProperty("/selectedCache"));if(n.getBinding("rows").isSuspended()){n.getBinding("rows").resume()}if(t){n.getBinding("rows").refresh()}else{n.getBinding("rows").filter(i)}},onLoadCacheEntries:async function t(){const n=this.getView().getElementBinding().getBoundContext();try{this.uiModel.setProperty("/loadingEntries",true);this.uiModel.setProperty("/showEntriesTable",true);this.uiModel.setSizeLimit(1e5);const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`,n);await t.invoke();const{value:i}=await t.requestObject();for(const e of i){e.tags=e.tags.join(", ")}this.uiModel.setProperty("/cacheEntries",i)}catch(t){console.error("Error loading cache entries:",t);e.error("Failed to load cache entries")}finally{this.uiModel.setProperty("/loadingEntries",false)}},onMetricsRowSelect:function e(t){const n=t.getParameter("rowContext");if(n){const e=n.getObject();const t=this.getView().getElementBinding().getBoundContext().getProperty("name");this.getRouter().navTo("singleMetric",{cache:t,metricId:e.ID});this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded")}},onSetKey:async function t(){const n=this.getView().getElementBinding().getBoundContext();const o=this.uiModel.getProperty("/createKey");const r=this.uiModel.getProperty("/createValue");const s=this.uiModel.getProperty("/createTtl");if(!o||!r){e.error("Please provide both key and value");return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`,n);t.setParameter("key",o);t.setParameter("value",r);t.setParameter("ttl",s);await t.invoke();i.show("Cache entry created successfully");this.uiModel.setProperty("/createKey","");this.uiModel.setProperty("/createValue","");this.uiModel.setProperty("/createTtl",3600)}catch(t){console.error("Error setting cache entry:",t);e.error("Failed to create cache entry")}},onGetKey:async function t(){const n=this.getView().getElementBinding().getBoundContext();const i=this.uiModel.getProperty("/getKey");if(!i){e.error("Please provide a key");return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`,n);t.setParameter("key",i);await t.invoke();const o=await t.requestObject();this.uiModel.setProperty("/getValue",o.value||"Not found")}catch(e){console.error("Error getting cache entry:",e);this.uiModel.setProperty("/getValue","Error: Entry not found or error occurred")}},onDeleteKey:async function t(){const n=this.getView().getElementBinding().getBoundContext();const o=this.uiModel.getProperty("/deleteKey");if(!o){e.error("Please provide a key");return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`,n);t.setParameter("key",o);await t.invoke();i.show("Cache entry deleted successfully");this.uiModel.setProperty("/deleteKey","")}catch(t){console.error("Error deleting cache entry:",t);e.error("Failed to delete cache entry")}},onEnableMetricsChange:async function t(n){const o=n.getParameter("state");const r=this.getView().getElementBinding().getBoundContext();try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`,r);t.setParameter("enabled",o);await t.invoke();i.show(`Metrics ${o?"enabled":"disabled"} successfully`)}catch(t){console.error("Error setting metrics enabled:",t);e.error("Failed to update metrics setting");this.uiModel.setProperty("/enableMetrics",!o)}},onEnableKeyMetricsChange:async function t(n){const o=n.getParameter("state");const r=this.getView().getElementBinding().getBoundContext();try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`,r);t.setParameter("enabled",o);await t.invoke();i.show(`Key metrics ${o?"enabled":"disabled"} successfully`)}catch(t){console.error("Error setting key metrics enabled:",t);e.error("Failed to update key metrics setting");this.uiModel.setProperty("/enableKeyMetrics",!o)}},onClearCache:async function t(){const n=this.getView().getElementBinding().getBoundContext();e.confirm("Are you sure you want to clear this cache? This action cannot be undone.",{actions:[e.Action.OK,e.Action.CANCEL],emphasizedAction:e.Action.OK,onClose:async t=>{if(t===e.Action.OK){try{const t=this.getModel();const i=t.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`,n);await i.invoke();e.success("Cache cleared successfully");await this.onRefresh()}catch(t){console.error("Error clearing cache:",t);e.error("Failed to clear cache")}}}})},onRefresh:async function e(){if(this.getView().getElementBinding().getBoundContext()){await this.loadStatistics(true);await this.loadKeyMetricsData(true)}},handleClose:function e(){this.getRouter().navTo("main")},handleFullScreen:function e(){this.getModel("app").setProperty("/layout","MidColumnFullScreen")},handleExitFullScreen:function e(){this.getModel("app").setProperty("/layout","TwoColumnsMidExpanded")},onKeyMetricsRowSelect:function e(t){const n=t.getParameter("rowContext");if(n){const e=n.getObject();const t=this.getView().getElementBinding().getBoundContext().getProperty("name");this.getRouter().navTo("singleKeyMetric",{cache:t,keyMetricId:e.ID});this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded")}},onRefreshKeyMetricsData:async function e(){await this.loadKeyMetricsData(true)},onRefreshMetricsData:async function e(){await this.loadStatistics(true)},onShowKeyMetricsMetadata:async function e(t){const i=t.getSource().getBindingContext();const o=e=>{try{return JSON.stringify(JSON.parse(e),null,2)}catch(t){return e}};const r=new n({metadata:o(i.getProperty("metadata")),subject:o(i.getProperty("subject")),query:o(i.getProperty("query")),cacheOptions:o(i.getProperty("cacheOptions")),keyName:i.getProperty("keyName")});const a=await s.load({definition:`<core:FragmentDefinition xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:form="sap.ui.layout.form">\n <Popover title="{localData>/keyName}" placement="Bottom" contentWidth="30rem">\n <content>\n <IconTabBar>\n <items>\n <IconTabFilter text="Metadata">\n <content>\n <TextArea value="{localData>/metadata}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n <IconTabFilter text="Subject" >\n <content>\n <TextArea value="{localData>/subject}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n <IconTabFilter text="Query" >\n <content>\n <TextArea value="{localData>/query}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n <IconTabFilter text="Cache Options" >\n <content>\n <TextArea value="{localData>/cacheOptions}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n </items>\n </IconTabBar>\n </content>\n </Popover>\n </core:FragmentDefinition>`,controller:this});const c=a;c.setModel(r,"localData");c.openBy(t.getSource())},onClearMetrics:async function t(){const n=this.getView().getElementBinding().getBoundContext();if(!n){return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`,n);await t.invoke();i.show("Metrics cleared successfully");await this.onRefreshMetricsData()}catch(t){console.error("Error clearing metrics:",t);e.error("Failed to clear metrics")}},onClearKeyMetrics:async function t(){const n=this.getView().getElementBinding().getBoundContext();if(!n){return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`,n);await t.invoke();i.show("Key metrics cleared successfully");await this.onRefreshKeyMetricsData()}catch(t){console.error("Error clearing key metrics:",t);e.error("Failed to clear key metrics")}}});return l});
1
+ sap.ui.define(["sap/m/MessageBox","./BaseController","sap/ui/model/json/JSONModel","sap/m/MessageToast","sap/ui/model/Filter","sap/ui/model/FilterOperator","sap/ui/core/Fragment"],function(e,t,n,i,a,o,s){"use strict";function r(e){return e&&e.__esModule&&typeof e.default!=="undefined"?e.default:e}const c=r(t);const l=c.extend("cds.plugin.caching.dashboard.controller.Cache",{onInit:function e(){c.prototype.onInit.call(this);this.uiModel=new n({selectedTab:"main",statistics:[],loading:false,loadingEntries:false,showEntriesTable:false,cacheEntries:[],createKey:"",createValue:"",createTtl:3600,getKey:"",getValue:"",deleteKey:"",metricsEnabled:false,keyMetricsEnabled:false});this.getView().setModel(this.uiModel,"ui");this.getRouter().getRoute("cache").attachPatternMatched(this.onRouteMatched,this)},onRouteMatched:function e(t){const{cache:n}=t.getParameter("arguments");this.getModel("app").setProperty("/selectedCache",n);this.getModel("app").setProperty("/layout","TwoColumnsMidExpanded");this.getView().bindElement({path:"/Caches('"+n+"')",events:{change:e=>{const t=this.getView().getElementBinding().getBoundContext();if(t){const e=t.getProperty("configuration");this.uiModel.setProperty("/config",e);this.loadStatistics();this.loadKeyMetricsData()}}}})},loadStatistics:async function e(t=false){const n=this.getView().byId("metricsTable");const i=new a("cache",o.EQ,this.getModel("app").getProperty("/selectedCache"));if(n.getBinding("rows").isSuspended()){n.getBinding("rows").resume()}if(t){n.getBinding("rows").refresh()}else{n.getBinding("rows").filter(i)}},loadKeyMetricsData:async function e(t=false){const n=this.getView().byId("keyMetricsTable");const i=new a("cache",o.EQ,this.getModel("app").getProperty("/selectedCache"));if(n.getBinding("rows").isSuspended()){n.getBinding("rows").resume()}if(t){n.getBinding("rows").refresh()}else{n.getBinding("rows").filter(i)}},onLoadCacheEntries:async function t(){const n=this.getView().getElementBinding().getBoundContext();try{this.uiModel.setProperty("/loadingEntries",true);this.uiModel.setProperty("/showEntriesTable",true);this.uiModel.setSizeLimit(1e5);const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`,n);await t.invoke();const{value:i}=await t.requestObject();for(const e of i){e.tags=e.tags.join(", ")}this.uiModel.setProperty("/cacheEntries",i)}catch(t){console.error("Error loading cache entries:",t);e.error(await this.i18nText("msgLoadEntriesFailed"))}finally{this.uiModel.setProperty("/loadingEntries",false)}},onMetricsRowSelect:function e(t){const n=t.getParameter("rowContext");if(n){const e=n.getObject();const t=this.getView().getElementBinding().getBoundContext().getProperty("name");this.getRouter().navTo("singleMetric",{cache:t,metricId:e.ID});this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded")}},onSetKey:async function t(){const n=this.getView().getElementBinding().getBoundContext();const a=this.uiModel.getProperty("/createKey");const o=this.uiModel.getProperty("/createValue");const s=this.uiModel.getProperty("/createTtl");if(!a||!o){e.error(await this.i18nText("msgProvideKeyValue"));return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`,n);t.setParameter("key",a);t.setParameter("value",o);t.setParameter("ttl",s);await t.invoke();i.show(await this.i18nText("msgEntryCreated"));this.uiModel.setProperty("/createKey","");this.uiModel.setProperty("/createValue","");this.uiModel.setProperty("/createTtl",3600)}catch(t){console.error("Error setting cache entry:",t);e.error(await this.i18nText("msgCreateEntryFailed"))}},onGetKey:async function t(){const n=this.getView().getElementBinding().getBoundContext();const i=this.uiModel.getProperty("/getKey");if(!i){e.error(await this.i18nText("msgProvideKey"));return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`,n);t.setParameter("key",i);await t.invoke();const a=await t.requestObject();this.uiModel.setProperty("/getValue",a.value||await this.i18nText("msgNotFound"))}catch(e){console.error("Error getting cache entry:",e);this.uiModel.setProperty("/getValue",await this.i18nText("msgGetEntryError"))}},onDeleteKey:async function t(){const n=this.getView().getElementBinding().getBoundContext();const a=this.uiModel.getProperty("/deleteKey");if(!a){e.error(await this.i18nText("msgProvideKey"));return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`,n);t.setParameter("key",a);await t.invoke();i.show(await this.i18nText("msgEntryDeleted"));this.uiModel.setProperty("/deleteKey","")}catch(t){console.error("Error deleting cache entry:",t);e.error(await this.i18nText("msgDeleteEntryFailed"))}},onEnableMetricsChange:async function t(n){const a=n.getParameter("state");const o=this.getView().getElementBinding().getBoundContext();try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`,o);t.setParameter("enabled",a);await t.invoke();i.show(await this.i18nText(a?"msgMetricsEnabled":"msgMetricsDisabled"))}catch(t){console.error("Error setting metrics enabled:",t);e.error(await this.i18nText("msgFailedUpdateMetrics"));this.uiModel.setProperty("/enableMetrics",!a)}},onEnableKeyMetricsChange:async function t(n){const a=n.getParameter("state");const o=this.getView().getElementBinding().getBoundContext();try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`,o);t.setParameter("enabled",a);await t.invoke();i.show(await this.i18nText(a?"msgKeyMetricsEnabled":"msgKeyMetricsDisabled"))}catch(t){console.error("Error setting key metrics enabled:",t);e.error(await this.i18nText("msgFailedKeyMetrics"));this.uiModel.setProperty("/enableKeyMetrics",!a)}},onClearCache:async function t(){const n=this.getView().getElementBinding().getBoundContext();const i=await this.i18nText("msgConfirmClearCache");e.confirm(i,{actions:[e.Action.OK,e.Action.CANCEL],emphasizedAction:e.Action.OK,onClose:async t=>{if(t===e.Action.OK){try{const t=this.getModel();const i=t.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`,n);await i.invoke();e.success(await this.i18nText("msgCacheCleared"));await this.onRefresh()}catch(t){console.error("Error clearing cache:",t);e.error(await this.i18nText("msgClearCacheFailed"))}}}})},onRefresh:async function e(){if(this.getView().getElementBinding().getBoundContext()){await this.loadStatistics(true);await this.loadKeyMetricsData(true)}},handleClose:function e(){this.getRouter().navTo("main")},handleFullScreen:function e(){this.getModel("app").setProperty("/layout","MidColumnFullScreen")},handleExitFullScreen:function e(){this.getModel("app").setProperty("/layout","TwoColumnsMidExpanded")},onKeyMetricsRowSelect:function e(t){const n=t.getParameter("rowContext");if(n){const e=n.getObject();const t=this.getView().getElementBinding().getBoundContext().getProperty("name");this.getRouter().navTo("singleKeyMetric",{cache:t,keyMetricId:e.ID});this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded")}},onRefreshKeyMetricsData:async function e(){await this.loadKeyMetricsData(true)},onRefreshMetricsData:async function e(){await this.loadStatistics(true)},onShowKeyMetricsMetadata:async function e(t){const i=t.getSource().getBindingContext();const a=e=>{try{return JSON.stringify(JSON.parse(e),null,2)}catch(t){return e}};const o=new n({metadata:a(i.getProperty("metadata")),subject:a(i.getProperty("subject")),query:a(i.getProperty("query")),cacheOptions:a(i.getProperty("cacheOptions")),keyName:i.getProperty("keyName")});const r=e=>l.escapeFragmentXml(e);const c=r(await this.i18nText("keyTabMetadata"));const g=r(await this.i18nText("keyTabSubject"));const d=r(await this.i18nText("keyTabQuery"));const h=r(await this.i18nText("keyTabCacheOptions"));const u=await s.load({definition:`<core:FragmentDefinition xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:form="sap.ui.layout.form">\n <Popover title="{localData>/keyName}" placement="Bottom" contentWidth="30rem">\n <content>\n <IconTabBar>\n <items>\n <IconTabFilter text="${c}">\n <content>\n <TextArea value="{localData>/metadata}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n <IconTabFilter text="${g}" >\n <content>\n <TextArea value="{localData>/subject}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n <IconTabFilter text="${d}" >\n <content>\n <TextArea value="{localData>/query}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n <IconTabFilter text="${h}" >\n <content>\n <TextArea value="{localData>/cacheOptions}" rows="20" width="100%" editable="false" />\n </content>\n </IconTabFilter>\n </items>\n </IconTabBar>\n </content>\n </Popover>\n </core:FragmentDefinition>`,controller:this});const y=u;y.setModel(o,"localData");y.openBy(t.getSource())},onClearMetrics:async function t(){const n=this.getView().getElementBinding().getBoundContext();if(!n){return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`,n);await t.invoke();i.show(await this.i18nText("msgMetricsCleared"));await this.onRefreshMetricsData()}catch(t){console.error("Error clearing metrics:",t);e.error(await this.i18nText("msgFailedClearMetrics"))}},onClearKeyMetrics:async function t(){const n=this.getView().getElementBinding().getBoundContext();if(!n){return}try{const e=this.getModel();const t=e.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`,n);await t.invoke();i.show(await this.i18nText("msgKeyMetricsCleared"));await this.onRefreshKeyMetricsData()}catch(t){console.error("Error clearing key metrics:",t);e.error(await this.i18nText("msgFailedClearKeyMetrics"))}}});l.escapeFragmentXml=function e(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")};return l});
2
2
  //# sourceMappingURL=Cache.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Cache.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","Cache","extend","onInit","_onInit","BaseController.prototype.onInit.call","this","uiModel","JSONModel","selectedTab","statistics","loading","loadingEntries","showEntriesTable","cacheEntries","createKey","createValue","createTtl","getKey","getValue","deleteKey","metricsEnabled","keyMetricsEnabled","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","getModel","setProperty","bindElement","path","events","change","context","getElementBinding","getBoundContext","getProperty","loadStatistics","loadKeyMetricsData","async","_loadStatistics","refresh","table","byId","filter","Filter","FilterOperator","EQ","getBinding","isSuspended","resume","_loadKeyMetricsData","onLoadCacheEntries","_onLoadCacheEntries","cacheContext","setSizeLimit","model","bindContext","invoke","value","entries","requestObject","entry","tags","join","error","console","MessageBox","onMetricsRowSelect","_onMetricsRowSelect","selectedRow","metric","getObject","cacheName","navTo","metricId","ID","onSetKey","_onSetKey","key","ttl","setParameter","MessageToast","show","onGetKey","_onGetKey","action","result","onDeleteKey","_onDeleteKey","onEnableMetricsChange","_onEnableMetricsChange","enabled","onEnableKeyMetricsChange","_onEnableKeyMetricsChange","onClearCache","_onClearCache","confirm","actions","Action","OK","CANCEL","emphasizedAction","onClose","success","onRefresh","_onRefresh","handleClose","_handleClose","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","onKeyMetricsRowSelect","_onKeyMetricsRowSelect","keyMetricId","onRefreshKeyMetricsData","_onRefreshKeyMetricsData","onRefreshMetricsData","_onRefreshMetricsData","onShowKeyMetricsMetadata","_onShowKeyMetricsMetadata","getSource","getBindingContext","saveJson","json","JSON","stringify","parse","localData","metadata","subject","query","cacheOptions","keyName","fragment","Fragment","load","definition","controller","popover","openBy","onClearMetrics","_onClearMetrics","onClearKeyMetrics","_onClearKeyMetrics"],"sources":["Cache.controller.ts"],"sourcesContent":["import MessageBox from \"sap/m/MessageBox\";\nimport BaseController from \"./BaseController\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport Table, { Table$RowSelectionChangeEvent } from \"sap/ui/table/Table\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport Context from \"sap/ui/model/odata/v4/Context\";\nimport Filter from \"sap/ui/model/Filter\";\nimport FilterOperator from \"sap/ui/model/FilterOperator\";\nimport ODataListBinding from \"sap/ui/model/odata/v4/ODataListBinding\";\nimport { Button$PressEvent } from \"sap/m/Button\";\nimport Fragment from \"sap/ui/core/Fragment\";\nimport Popover from \"sap/m/Popover\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class Cache 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 selectedTab: \"main\",\n statistics: [],\n loading: false,\n loadingEntries: false,\n showEntriesTable: false,\n cacheEntries: [],\n\n // Create\n createKey: \"\",\n createValue: \"\",\n createTtl: 3600,\n\n // Get\n getKey: \"\",\n getValue: \"\",\n\n // Delete\n deleteKey: \"\",\n\n // Metrics\n metricsEnabled: false,\n keyMetricsEnabled: false,\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n\n this.getRouter().getRoute(\"cache\").attachPatternMatched(this.onRouteMatched, this);\n\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache } = event.getParameter(\"arguments\") as { cache: string };\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/selectedCache\", cache);\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n\n this.getView().bindElement({\n path: \"/Caches('\" + cache + \"')\",\n events: {\n change: (event: any) => {\n const context = this.getView().getElementBinding().getBoundContext();\n if (context) {\n const cache = context.getProperty(\"configuration\");\n this.uiModel.setProperty(\"/config\", cache);\n this.loadStatistics();\n this.loadKeyMetricsData();\n }\n }\n }\n });\n }\n\n /**\n * Load statistics based on current filters\n */\n private async loadStatistics(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"metricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n /**\n * Load key tracking data\n */\n async loadKeyMetricsData(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"keyMetricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n\n /**\n * Load cache entries\n */\n public async onLoadCacheEntries(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n this.uiModel.setProperty(\"/loadingEntries\", true);\n this.uiModel.setProperty(\"/showEntriesTable\", true);\n this.uiModel.setSizeLimit(100_000);\n\n // Call the backend to get cache entries\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`, cacheContext);\n await context.invoke();\n const { value: entries } = await context.requestObject();\n for (const entry of entries) {\n entry.tags = entry.tags.join(\", \");\n }\n\n this.uiModel.setProperty(\"/cacheEntries\", entries);\n\n } catch (error) {\n console.error(\"Error loading cache entries:\", error);\n MessageBox.error(\"Failed to load cache entries\");\n } finally {\n this.uiModel.setProperty(\"/loadingEntries\", false);\n }\n }\n\n /**\n * Handle statistics row selection\n */\n public onMetricsRowSelect(event: Table$RowSelectionChangeEvent): void {\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleMetric\", {\n cache: cacheName,\n metricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Set cache entry\n */\n public async onSetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/createKey\");\n const value = this.uiModel.getProperty(\"/createValue\");\n const ttl = this.uiModel.getProperty(\"/createTtl\");\n\n if (!key || !value) {\n MessageBox.error(\"Please provide both key and value\");\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n context.setParameter(\"value\", value);\n context.setParameter(\"ttl\", ttl);\n await context.invoke();\n\n\n MessageToast.show(\"Cache entry created successfully\");\n\n // Clear form\n this.uiModel.setProperty(\"/createKey\", \"\");\n this.uiModel.setProperty(\"/createValue\", \"\");\n this.uiModel.setProperty(\"/createTtl\", 3600);\n\n } catch (error) {\n console.error(\"Error setting cache entry:\", error);\n MessageBox.error(\"Failed to create cache entry\");\n }\n }\n\n /**\n * Get cache entry\n */\n public async onGetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/getKey\");\n\n if (!key) {\n MessageBox.error(\"Please provide a key\");\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`, cacheContext);\n action.setParameter(\"key\", key);\n await action.invoke();\n\n const result = await action.requestObject();\n this.uiModel.setProperty(\"/getValue\", result.value || \"Not found\");\n\n } catch (error) {\n console.error(\"Error getting cache entry:\", error);\n this.uiModel.setProperty(\"/getValue\", \"Error: Entry not found or error occurred\");\n }\n }\n\n /**\n * Delete cache entry\n */\n public async onDeleteKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/deleteKey\");\n\n if (!key) {\n MessageBox.error(\"Please provide a key\");\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n await context.invoke();\n\n MessageToast.show(\"Cache entry deleted successfully\");\n\n // Clear form\n this.uiModel.setProperty(\"/deleteKey\", \"\");\n\n } catch (error) {\n console.error(\"Error deleting cache entry:\", error);\n MessageBox.error(\"Failed to delete cache entry\");\n }\n }\n\n /**\n * Enable/disable statistics\n */\n public async onEnableMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(`Metrics ${enabled ? 'enabled' : 'disabled'} successfully`);\n } catch (error) {\n console.error(\"Error setting metrics enabled:\", error);\n MessageBox.error(\"Failed to update metrics setting\");\n // Revert the switch\n this.uiModel.setProperty(\"/enableMetrics\", !enabled);\n }\n }\n\n /**\n * Enable/disable key tracking\n */\n public async onEnableKeyMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(`Key metrics ${enabled ? 'enabled' : 'disabled'} successfully`);\n\n } catch (error) {\n console.error(\"Error setting key metrics enabled:\", error);\n MessageBox.error(\"Failed to update key metrics setting\");\n // Revert the switch\n this.uiModel.setProperty(\"/enableKeyMetrics\", !enabled);\n }\n }\n\n /**\n * Clear cache\n */\n public async onClearCache(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n MessageBox.confirm(\"Are you sure you want to clear this cache? This action cannot be undone.\", {\n actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],\n emphasizedAction: MessageBox.Action.OK,\n onClose: async (action: string) => {\n if (action === MessageBox.Action.OK) {\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`, cacheContext);\n await context.invoke();\n\n MessageBox.success(\"Cache cleared successfully\");\n\n // Refresh the data\n await this.onRefresh();\n\n } catch (error) {\n console.error(\"Error clearing cache:\", error);\n MessageBox.error(\"Failed to clear cache\");\n }\n }\n }\n });\n }\n\n /**\n * Handle refresh button press\n */\n public async onRefresh(): Promise<void> {\n if (this.getView().getElementBinding().getBoundContext()) {\n await this.loadStatistics(true);\n await this.loadKeyMetricsData(true);\n }\n }\n\n public handleClose(): void {\n this.getRouter().navTo(\"main\");\n }\n\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"MidColumnFullScreen\");\n }\n\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n }\n\n /**\n * Handle key row selection\n */\n public onKeyMetricsRowSelect(event: any): void {\n\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleKeyMetric\", {\n cache: cacheName,\n keyMetricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Refresh key data\n */\n public async onRefreshKeyMetricsData(): Promise<void> {\n await this.loadKeyMetricsData(true);\n }\n\n public async onRefreshMetricsData(): Promise<void> {\n await this.loadStatistics(true);\n }\n\n public async onShowKeyMetricsMetadata(event: Button$PressEvent): Promise<void> {\n const context = event.getSource().getBindingContext() as Context;\n\n const saveJson = (json: string) => {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch (error) {\n return json\n }\n }\n\n const localData = new JSONModel({\n metadata: saveJson(context.getProperty(\"metadata\")),\n subject: saveJson(context.getProperty(\"subject\")),\n query: saveJson(context.getProperty(\"query\")),\n cacheOptions: saveJson(context.getProperty(\"cacheOptions\")),\n keyName: context.getProperty(\"keyName\"),\n });\n\n const fragment = await Fragment.load({\n definition: `<core:FragmentDefinition xmlns:core=\"sap.ui.core\" xmlns:mvc=\"sap.ui.core.mvc\" xmlns=\"sap.m\" xmlns:form=\"sap.ui.layout.form\">\n <Popover title=\"{localData>/keyName}\" placement=\"Bottom\" contentWidth=\"30rem\">\n <content>\n <IconTabBar>\n <items>\n <IconTabFilter text=\"Metadata\">\n <content>\n <TextArea value=\"{localData>/metadata}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"Subject\" >\n <content>\n <TextArea value=\"{localData>/subject}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"Query\" >\n <content>\n <TextArea value=\"{localData>/query}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"Cache Options\" >\n <content>\n <TextArea value=\"{localData>/cacheOptions}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n </items>\n </IconTabBar>\n </content>\n </Popover>\n </core:FragmentDefinition>`,\n controller: this,\n });\n\n const popover = fragment as Popover;\n popover.setModel(localData, \"localData\");\n popover.openBy(event.getSource());\n }\n\n /**\n * Clear statistics\n */\n public async onClearMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(\"Metrics cleared successfully\");\n\n // Refresh the data\n await this.onRefreshMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing metrics:\", error);\n MessageBox.error(\"Failed to clear metrics\");\n }\n }\n\n /**\n * Clear key metrics\n */\n public async onClearKeyMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(\"Key metrics cleared successfully\");\n\n // Refresh the data\n await this.onRefreshKeyMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing key metrics:\", error);\n MessageBox.error(\"Failed to clear key metrics\");\n }\n }\n\n}"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Cache.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","Cache","extend","onInit","_onInit","BaseController.prototype.onInit.call","this","uiModel","JSONModel","selectedTab","statistics","loading","loadingEntries","showEntriesTable","cacheEntries","createKey","createValue","createTtl","getKey","getValue","deleteKey","metricsEnabled","keyMetricsEnabled","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","getModel","setProperty","bindElement","path","events","change","context","getElementBinding","getBoundContext","getProperty","loadStatistics","loadKeyMetricsData","async","_loadStatistics","refresh","table","byId","filter","Filter","FilterOperator","EQ","getBinding","isSuspended","resume","_loadKeyMetricsData","onLoadCacheEntries","_onLoadCacheEntries","cacheContext","setSizeLimit","model","bindContext","invoke","value","entries","requestObject","entry","tags","join","error","console","MessageBox","i18nText","onMetricsRowSelect","_onMetricsRowSelect","selectedRow","metric","getObject","cacheName","navTo","metricId","ID","onSetKey","_onSetKey","key","ttl","setParameter","MessageToast","show","onGetKey","_onGetKey","action","result","onDeleteKey","_onDeleteKey","onEnableMetricsChange","_onEnableMetricsChange","enabled","onEnableKeyMetricsChange","_onEnableKeyMetricsChange","onClearCache","_onClearCache","confirmMsg","confirm","actions","Action","OK","CANCEL","emphasizedAction","onClose","success","onRefresh","_onRefresh","handleClose","_handleClose","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","onKeyMetricsRowSelect","_onKeyMetricsRowSelect","keyMetricId","onRefreshKeyMetricsData","_onRefreshKeyMetricsData","onRefreshMetricsData","_onRefreshMetricsData","onShowKeyMetricsMetadata","_onShowKeyMetricsMetadata","getSource","getBindingContext","saveJson","json","JSON","stringify","parse","localData","metadata","subject","query","cacheOptions","keyName","e","s","escapeFragmentXml","tabMeta","tabSub","tabQ","tabCo","fragment","Fragment","load","definition","controller","popover","openBy","onClearMetrics","_onClearMetrics","onClearKeyMetrics","_onClearKeyMetrics","replace"],"sources":["Cache.controller.ts"],"sourcesContent":["import MessageBox from \"sap/m/MessageBox\";\nimport BaseController from \"./BaseController\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport Table, { Table$RowSelectionChangeEvent } from \"sap/ui/table/Table\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport Context from \"sap/ui/model/odata/v4/Context\";\nimport Filter from \"sap/ui/model/Filter\";\nimport FilterOperator from \"sap/ui/model/FilterOperator\";\nimport ODataListBinding from \"sap/ui/model/odata/v4/ODataListBinding\";\nimport { Button$PressEvent } from \"sap/m/Button\";\nimport Fragment from \"sap/ui/core/Fragment\";\nimport Popover from \"sap/m/Popover\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class Cache extends BaseController {\n private uiModel: JSONModel;\n\n private static escapeFragmentXml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\n }\n\n public onInit(): void {\n super.onInit();\n\n // Create a JSON model for UI data binding\n this.uiModel = new JSONModel({\n selectedTab: \"main\",\n statistics: [],\n loading: false,\n loadingEntries: false,\n showEntriesTable: false,\n cacheEntries: [],\n\n // Create\n createKey: \"\",\n createValue: \"\",\n createTtl: 3600,\n\n // Get\n getKey: \"\",\n getValue: \"\",\n\n // Delete\n deleteKey: \"\",\n\n // Metrics\n metricsEnabled: false,\n keyMetricsEnabled: false,\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n\n this.getRouter().getRoute(\"cache\").attachPatternMatched(this.onRouteMatched, this);\n\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache } = event.getParameter(\"arguments\") as { cache: string };\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/selectedCache\", cache);\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n\n this.getView().bindElement({\n path: \"/Caches('\" + cache + \"')\",\n events: {\n change: (event: any) => {\n const context = this.getView().getElementBinding().getBoundContext();\n if (context) {\n const cache = context.getProperty(\"configuration\");\n this.uiModel.setProperty(\"/config\", cache);\n this.loadStatistics();\n this.loadKeyMetricsData();\n }\n }\n }\n });\n }\n\n /**\n * Load statistics based on current filters\n */\n private async loadStatistics(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"metricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n /**\n * Load key tracking data\n */\n async loadKeyMetricsData(refresh: boolean = false): Promise<void> {\n const table = this.getView().byId(\"keyMetricsTable\") as Table;\n const filter = new Filter(\"cache\", FilterOperator.EQ, (<JSONModel>this.getModel(\"app\")).getProperty(\"/selectedCache\"));\n if (table.getBinding(\"rows\").isSuspended()) {\n table.getBinding(\"rows\").resume();\n }\n if (refresh) {\n (<ODataListBinding>table.getBinding(\"rows\")).refresh();\n } else {\n (<ODataListBinding>table.getBinding(\"rows\")).filter(filter);\n }\n }\n\n\n /**\n * Load cache entries\n */\n public async onLoadCacheEntries(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n this.uiModel.setProperty(\"/loadingEntries\", true);\n this.uiModel.setProperty(\"/showEntriesTable\", true);\n this.uiModel.setSizeLimit(100_000);\n\n // Call the backend to get cache entries\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`, cacheContext);\n await context.invoke();\n const { value: entries } = await context.requestObject();\n for (const entry of entries) {\n entry.tags = entry.tags.join(\", \");\n }\n\n this.uiModel.setProperty(\"/cacheEntries\", entries);\n\n } catch (error) {\n console.error(\"Error loading cache entries:\", error);\n MessageBox.error(await this.i18nText(\"msgLoadEntriesFailed\"));\n } finally {\n this.uiModel.setProperty(\"/loadingEntries\", false);\n }\n }\n\n /**\n * Handle statistics row selection\n */\n public onMetricsRowSelect(event: Table$RowSelectionChangeEvent): void {\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleMetric\", {\n cache: cacheName,\n metricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Set cache entry\n */\n public async onSetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/createKey\");\n const value = this.uiModel.getProperty(\"/createValue\");\n const ttl = this.uiModel.getProperty(\"/createTtl\");\n\n if (!key || !value) {\n MessageBox.error(await this.i18nText(\"msgProvideKeyValue\"));\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n context.setParameter(\"value\", value);\n context.setParameter(\"ttl\", ttl);\n await context.invoke();\n\n\n MessageToast.show(await this.i18nText(\"msgEntryCreated\"));\n\n // Clear form\n this.uiModel.setProperty(\"/createKey\", \"\");\n this.uiModel.setProperty(\"/createValue\", \"\");\n this.uiModel.setProperty(\"/createTtl\", 3600);\n\n } catch (error) {\n console.error(\"Error setting cache entry:\", error);\n MessageBox.error(await this.i18nText(\"msgCreateEntryFailed\"));\n }\n }\n\n /**\n * Get cache entry\n */\n public async onGetKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/getKey\");\n\n if (!key) {\n MessageBox.error(await this.i18nText(\"msgProvideKey\"));\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`, cacheContext);\n action.setParameter(\"key\", key);\n await action.invoke();\n\n const result = await action.requestObject();\n this.uiModel.setProperty(\"/getValue\", result.value || (await this.i18nText(\"msgNotFound\")));\n\n } catch (error) {\n console.error(\"Error getting cache entry:\", error);\n this.uiModel.setProperty(\"/getValue\", await this.i18nText(\"msgGetEntryError\"));\n }\n }\n\n /**\n * Delete cache entry\n */\n public async onDeleteKey(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n const key = this.uiModel.getProperty(\"/deleteKey\");\n\n if (!key) {\n MessageBox.error(await this.i18nText(\"msgProvideKey\"));\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`, cacheContext);\n context.setParameter(\"key\", key);\n await context.invoke();\n\n MessageToast.show(await this.i18nText(\"msgEntryDeleted\"));\n\n // Clear form\n this.uiModel.setProperty(\"/deleteKey\", \"\");\n\n } catch (error) {\n console.error(\"Error deleting cache entry:\", error);\n MessageBox.error(await this.i18nText(\"msgDeleteEntryFailed\"));\n }\n }\n\n /**\n * Enable/disable statistics\n */\n public async onEnableMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(await this.i18nText(enabled ? \"msgMetricsEnabled\" : \"msgMetricsDisabled\"));\n } catch (error) {\n console.error(\"Error setting metrics enabled:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedUpdateMetrics\"));\n // Revert the switch\n this.uiModel.setProperty(\"/enableMetrics\", !enabled);\n }\n }\n\n /**\n * Enable/disable key tracking\n */\n public async onEnableKeyMetricsChange(event: any): Promise<void> {\n const enabled = event.getParameter(\"state\");\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`, cacheContext);\n context.setParameter(\"enabled\", enabled);\n await context.invoke();\n\n MessageToast.show(await this.i18nText(enabled ? \"msgKeyMetricsEnabled\" : \"msgKeyMetricsDisabled\"));\n\n } catch (error) {\n console.error(\"Error setting key metrics enabled:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedKeyMetrics\"));\n // Revert the switch\n this.uiModel.setProperty(\"/enableKeyMetrics\", !enabled);\n }\n }\n\n /**\n * Clear cache\n */\n public async onClearCache(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n\n const confirmMsg = await this.i18nText(\"msgConfirmClearCache\");\n MessageBox.confirm(confirmMsg, {\n actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],\n emphasizedAction: MessageBox.Action.OK,\n onClose: async (action: string) => {\n if (action === MessageBox.Action.OK) {\n try {\n const model = this.getModel() as ODataModel;\n const context = model.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`, cacheContext);\n await context.invoke();\n\n MessageBox.success(await this.i18nText(\"msgCacheCleared\"));\n\n // Refresh the data\n await this.onRefresh();\n\n } catch (error) {\n console.error(\"Error clearing cache:\", error);\n MessageBox.error(await this.i18nText(\"msgClearCacheFailed\"));\n }\n }\n }\n });\n }\n\n /**\n * Handle refresh button press\n */\n public async onRefresh(): Promise<void> {\n if (this.getView().getElementBinding().getBoundContext()) {\n await this.loadStatistics(true);\n await this.loadKeyMetricsData(true);\n }\n }\n\n public handleClose(): void {\n this.getRouter().navTo(\"main\");\n }\n\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"MidColumnFullScreen\");\n }\n\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n }\n\n /**\n * Handle key row selection\n */\n public onKeyMetricsRowSelect(event: any): void {\n\n const selectedRow = event.getParameter(\"rowContext\");\n if (selectedRow) {\n const metric = selectedRow.getObject() as any;\n const cacheName = this.getView().getElementBinding().getBoundContext().getProperty(\"name\");\n\n // Navigate to single metric view\n this.getRouter().navTo(\"singleKeyMetric\", {\n cache: cacheName,\n keyMetricId: metric.ID\n });\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n }\n\n /**\n * Refresh key data\n */\n public async onRefreshKeyMetricsData(): Promise<void> {\n await this.loadKeyMetricsData(true);\n }\n\n public async onRefreshMetricsData(): Promise<void> {\n await this.loadStatistics(true);\n }\n\n public async onShowKeyMetricsMetadata(event: Button$PressEvent): Promise<void> {\n const context = event.getSource().getBindingContext() as Context;\n\n const saveJson = (json: string) => {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch (error) {\n return json\n }\n }\n\n const localData = new JSONModel({\n metadata: saveJson(context.getProperty(\"metadata\")),\n subject: saveJson(context.getProperty(\"subject\")),\n query: saveJson(context.getProperty(\"query\")),\n cacheOptions: saveJson(context.getProperty(\"cacheOptions\")),\n keyName: context.getProperty(\"keyName\"),\n });\n\n const e = (s: string) => Cache.escapeFragmentXml(s);\n const tabMeta = e(await this.i18nText(\"keyTabMetadata\"));\n const tabSub = e(await this.i18nText(\"keyTabSubject\"));\n const tabQ = e(await this.i18nText(\"keyTabQuery\"));\n const tabCo = e(await this.i18nText(\"keyTabCacheOptions\"));\n\n const fragment = await Fragment.load({\n definition: `<core:FragmentDefinition xmlns:core=\"sap.ui.core\" xmlns:mvc=\"sap.ui.core.mvc\" xmlns=\"sap.m\" xmlns:form=\"sap.ui.layout.form\">\n <Popover title=\"{localData>/keyName}\" placement=\"Bottom\" contentWidth=\"30rem\">\n <content>\n <IconTabBar>\n <items>\n <IconTabFilter text=\"${tabMeta}\">\n <content>\n <TextArea value=\"{localData>/metadata}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"${tabSub}\" >\n <content>\n <TextArea value=\"{localData>/subject}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"${tabQ}\" >\n <content>\n <TextArea value=\"{localData>/query}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n <IconTabFilter text=\"${tabCo}\" >\n <content>\n <TextArea value=\"{localData>/cacheOptions}\" rows=\"20\" width=\"100%\" editable=\"false\" />\n </content>\n </IconTabFilter>\n </items>\n </IconTabBar>\n </content>\n </Popover>\n </core:FragmentDefinition>`,\n controller: this,\n });\n\n const popover = fragment as Popover;\n popover.setModel(localData, \"localData\");\n popover.openBy(event.getSource());\n }\n\n /**\n * Clear statistics\n */\n public async onClearMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(await this.i18nText(\"msgMetricsCleared\"));\n\n // Refresh the data\n await this.onRefreshMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing metrics:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedClearMetrics\"));\n }\n }\n\n /**\n * Clear key metrics\n */\n public async onClearKeyMetrics(): Promise<void> {\n const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;\n if (!cacheContext) {\n return;\n }\n\n try {\n const model = this.getModel() as ODataModel;\n const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`, cacheContext);\n await action.invoke();\n\n MessageToast.show(await this.i18nText(\"msgKeyMetricsCleared\"));\n\n // Refresh the data\n await this.onRefreshKeyMetricsData();\n\n } catch (error) {\n console.error(\"Error clearing key metrics:\", error);\n MessageBox.error(await this.i18nText(\"msgFailedClearKeyMetrics\"));\n }\n }\n\n}"],"mappings":"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","ignoreList":[]}