cds-caching 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -1114
- package/app/dashboard/Component-dbg.js +59 -0
- package/app/dashboard/Component-dbg.js.map +1 -0
- package/app/dashboard/Component.js +2 -0
- package/app/dashboard/Component.js.map +1 -0
- package/app/dashboard/Component.ts +59 -0
- package/app/dashboard/controller/App-dbg.controller.js +132 -0
- package/app/dashboard/controller/App-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/App.controller.js +2 -0
- package/app/dashboard/controller/App.controller.js.map +1 -0
- package/app/dashboard/controller/App.controller.ts +147 -0
- package/app/dashboard/controller/BaseController-dbg.js +75 -0
- package/app/dashboard/controller/BaseController-dbg.js.map +1 -0
- package/app/dashboard/controller/BaseController.js +2 -0
- package/app/dashboard/controller/BaseController.js.map +1 -0
- package/app/dashboard/controller/BaseController.ts +88 -0
- package/app/dashboard/controller/Cache-dbg.controller.js +421 -0
- package/app/dashboard/controller/Cache-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/Cache.controller.js +2 -0
- package/app/dashboard/controller/Cache.controller.js.map +1 -0
- package/app/dashboard/controller/Cache.controller.ts +490 -0
- package/app/dashboard/controller/Main-dbg.controller.js +32 -0
- package/app/dashboard/controller/Main-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/Main.controller.js +2 -0
- package/app/dashboard/controller/Main.controller.js.map +1 -0
- package/app/dashboard/controller/Main.controller.ts +31 -0
- package/app/dashboard/controller/SingleMetric-dbg.controller.js +306 -0
- package/app/dashboard/controller/SingleMetric-dbg.controller.js.map +1 -0
- package/app/dashboard/controller/SingleMetric.controller.js +2 -0
- package/app/dashboard/controller/SingleMetric.controller.js.map +1 -0
- package/app/dashboard/controller/SingleMetric.controller.ts +335 -0
- package/app/dashboard/i18n/i18n.properties +61 -0
- package/app/dashboard/i18n/i18n_de.properties +3 -0
- package/app/dashboard/i18n/i18n_en.properties +3 -0
- package/app/dashboard/index-cdn.html +28 -0
- package/app/dashboard/index.html +19 -0
- package/app/dashboard/manifest.json +145 -0
- package/app/dashboard/model/formatter-dbg.js +253 -0
- package/app/dashboard/model/formatter-dbg.js.map +1 -0
- package/app/dashboard/model/formatter.js +2 -0
- package/app/dashboard/model/formatter.js.map +1 -0
- package/app/dashboard/model/formatter.ts +275 -0
- package/app/dashboard/model/models-dbg.js +13 -0
- package/app/dashboard/model/models-dbg.js.map +1 -0
- package/app/dashboard/model/models.js +2 -0
- package/app/dashboard/model/models.js.map +1 -0
- package/app/dashboard/model/models.ts +13 -0
- package/app/dashboard/resources/sap-ui-custom-dbg.js +4695 -0
- package/app/dashboard/resources/sap-ui-custom-dbg.js.map +1 -0
- package/app/dashboard/resources/sap-ui-custom.js +5794 -0
- package/app/dashboard/resources/sap-ui-custom.js.map +1 -0
- package/app/dashboard/service/CacheStatisticsService-dbg.js +267 -0
- package/app/dashboard/service/CacheStatisticsService-dbg.js.map +1 -0
- package/app/dashboard/service/CacheStatisticsService.js +2 -0
- package/app/dashboard/service/CacheStatisticsService.js.map +1 -0
- package/app/dashboard/service/CacheStatisticsService.ts +397 -0
- package/app/dashboard/view/App.view.xml +18 -0
- package/app/dashboard/view/Cache.view.xml +777 -0
- package/app/dashboard/view/Main.view.xml +57 -0
- package/app/dashboard/view/SingleMetric.view.xml +337 -0
- package/cds-plugin.js +52 -0
- package/db/cache-store.cds +12 -0
- package/db/statistics.cds +128 -0
- package/index.cds +2 -128
- package/lib/CachingService.js +13 -0
- package/lib/add.js +17 -0
- package/lib/operations/AsyncOperations.js +162 -111
- package/lib/operations/BasicOperations.js +35 -0
- package/lib/operations/CapOperations.js +92 -40
- package/lib/support/CacheStatisticsHandler.js +35 -10
- package/lib/support/CacheStoreManager.js +29 -0
- package/lib/support/KeyvCDS.js +149 -0
- package/lib/support/MultitenancyDetector.js +25 -0
- package/lib/support/RuntimeConfigurationManager.js +69 -37
- package/lib/support/StatisticsPersistenceManager.js +18 -2
- package/lib/support/Telemetry.js +137 -0
- package/lib/util.js +29 -11
- package/package.json +43 -11
- package/srv/caching-api-service.js +47 -2
|
@@ -0,0 +1 @@
|
|
|
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":"gTACOA,EAAcC,EAAAC,GAcrB,MAGqBC,EAAcH,EAAcI,OAAA,iDAGtCC,OAAM,SAAAC,IACTC,wBAAAC,MAGAA,KAAKC,QAAU,IAAIC,EAAU,CACzBC,YAAa,OACbC,WAAY,GACZC,QAAS,MACTC,eAAgB,MAChBC,iBAAkB,MAClBC,aAAc,GAGdC,UAAW,GACXC,YAAa,GACbC,UAAW,KAGXC,OAAQ,GACRC,SAAU,GAGVC,UAAW,GAGXC,eAAgB,MAChBC,kBAAmB,QAEvBhB,KAAKiB,UAAUC,SAASlB,KAAKC,QAAS,MAGtCD,KAAKmB,YAAYC,SAAS,SAASC,qBAAqBrB,KAAKsB,eAAgBtB,KAEjF,EAEOsB,eAAc,SAAAC,EAACC,GAClB,MAAMC,MAAEA,GAAUD,EAAME,aAAa,aACzB1B,KAAK2B,SAAS,OAAQC,YAAY,iBAAkBH,GACpDzB,KAAK2B,SAAS,OAAQC,YAAY,UAAW,yBAEzD5B,KAAKiB,UAAUY,YAAY,CACvBC,KAAM,YAAcL,EAAQ,KAC5BM,OAAQ,CACJC,OAASR,IACL,MAAMS,EAAUjC,KAAKiB,UAAUiB,oBAAoBC,kBACnD,GAAIF,EAAS,CACT,MAAMR,EAAQQ,EAAQG,YAAY,iBAClCpC,KAAKC,QAAQ2B,YAAY,UAAWH,GACpCzB,KAAKqC,iBACLrC,KAAKsC,oBACT,KAIhB,EAKcD,eAAcE,eAAAC,EAACC,EAAmB,OAC5C,MAAMC,EAAQ1C,KAAKiB,UAAU0B,KAAK,gBAClC,MAAMC,EAAS,IAAIC,EAAO,QAASC,EAAeC,GAAgB/C,KAAK2B,SAAS,OAAQS,YAAY,mBACpG,GAAIM,EAAMM,WAAW,QAAQC,cAAe,CACxCP,EAAMM,WAAW,QAAQE,QAC7B,CACA,GAAIT,EAAS,CACUC,EAAMM,WAAW,QAASP,SACjD,KAAO,CACgBC,EAAMM,WAAW,QAASJ,OAAOA,EACxD,CACJ,EAKMN,mBAAkBC,eAAAY,EAACV,EAAmB,OACxC,MAAMC,EAAQ1C,KAAKiB,UAAU0B,KAAK,mBAClC,MAAMC,EAAS,IAAIC,EAAO,QAASC,EAAeC,GAAgB/C,KAAK2B,SAAS,OAAQS,YAAY,mBACpG,GAAIM,EAAMM,WAAW,QAAQC,cAAe,CACxCP,EAAMM,WAAW,QAAQE,QAC7B,CACA,GAAIT,EAAS,CACUC,EAAMM,WAAW,QAASP,SACjD,KAAO,CACgBC,EAAMM,WAAW,QAASJ,OAAOA,EACxD,CACJ,EAMaQ,mBAAkBb,eAAAc,IAC3B,MAAMC,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBAExD,IACInC,KAAKC,QAAQ2B,YAAY,kBAAmB,MAC5C5B,KAAKC,QAAQ2B,YAAY,oBAAqB,MAC9C5B,KAAKC,QAAQsD,aAAa,KAG1B,MAAMC,EAAQxD,KAAK2B,WACnB,MAAMM,EAAUuB,EAAMC,YAAY,uDAAwDH,SACpFrB,EAAQyB,SACd,MAAQC,MAAOC,SAAkB3B,EAAQ4B,gBACzC,IAAK,MAAMC,KAASF,EAAS,CACzBE,EAAMC,KAAOD,EAAMC,KAAKC,KAAK,KACjC,CAEAhE,KAAKC,QAAQ2B,YAAY,gBAAiBgC,EAE9C,CAAE,MAAOK,GACLC,QAAQD,MAAM,+BAAgCA,GAC9CE,EAAWF,MAAM,+BACrB,CAAC,QACGjE,KAAKC,QAAQ2B,YAAY,kBAAmB,MAChD,CACJ,EAKOwC,mBAAkB,SAAAC,EAAC7C,GACtB,MAAM8C,EAAc9C,EAAME,aAAa,cACvC,GAAI4C,EAAa,CACb,MAAMC,EAASD,EAAYE,YAC3B,MAAMC,EAAYzE,KAAKiB,UAAUiB,oBAAoBC,kBAAkBC,YAAY,QAGnFpC,KAAKmB,YAAYuD,MAAM,eAAgB,CACnCjD,MAAOgD,EACPE,SAAUJ,EAAOK,KAIT5E,KAAK2B,SAAS,OAAQC,YAAY,UAAW,0BAC7D,CACJ,EAKaiD,SAAQtC,eAAAuC,IACjB,MAAMxB,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBACxD,MAAM4C,EAAM/E,KAAKC,QAAQmC,YAAY,cACrC,MAAMuB,EAAQ3D,KAAKC,QAAQmC,YAAY,gBACvC,MAAM4C,EAAMhF,KAAKC,QAAQmC,YAAY,cAErC,IAAK2C,IAAQpB,EAAO,CAChBQ,EAAWF,MAAM,qCACjB,MACJ,CAEA,IACI,MAAMT,EAAQxD,KAAK2B,WACnB,MAAMM,EAAUuB,EAAMC,YAAY,qDAAsDH,GACxFrB,EAAQgD,aAAa,MAAOF,GAC5B9C,EAAQgD,aAAa,QAAStB,GAC9B1B,EAAQgD,aAAa,MAAOD,SACtB/C,EAAQyB,SAGdwB,EAAaC,KAAK,oCAGlBnF,KAAKC,QAAQ2B,YAAY,aAAc,IACvC5B,KAAKC,QAAQ2B,YAAY,eAAgB,IACzC5B,KAAKC,QAAQ2B,YAAY,aAAc,KAE3C,CAAE,MAAOqC,GACLC,QAAQD,MAAM,6BAA8BA,GAC5CE,EAAWF,MAAM,+BACrB,CACJ,EAKamB,SAAQ7C,eAAA8C,IACjB,MAAM/B,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBACxD,MAAM4C,EAAM/E,KAAKC,QAAQmC,YAAY,WAErC,IAAK2C,EAAK,CACNZ,EAAWF,MAAM,wBACjB,MACJ,CAEA,IACI,MAAMT,EAAQxD,KAAK2B,WACnB,MAAM2D,EAAS9B,EAAMC,YAAY,qDAAsDH,GACvFgC,EAAOL,aAAa,MAAOF,SACrBO,EAAO5B,SAEb,MAAM6B,QAAeD,EAAOzB,gBAC5B7D,KAAKC,QAAQ2B,YAAY,YAAa2D,EAAO5B,OAAS,YAE1D,CAAE,MAAOM,GACLC,QAAQD,MAAM,6BAA8BA,GAC5CjE,KAAKC,QAAQ2B,YAAY,YAAa,2CAC1C,CACJ,EAKa4D,YAAWjD,eAAAkD,IACpB,MAAMnC,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBACxD,MAAM4C,EAAM/E,KAAKC,QAAQmC,YAAY,cAErC,IAAK2C,EAAK,CACNZ,EAAWF,MAAM,wBACjB,MACJ,CAEA,IACI,MAAMT,EAAQxD,KAAK2B,WACnB,MAAMM,EAAUuB,EAAMC,YAAY,wDAAyDH,GAC3FrB,EAAQgD,aAAa,MAAOF,SACtB9C,EAAQyB,SAEdwB,EAAaC,KAAK,oCAGlBnF,KAAKC,QAAQ2B,YAAY,aAAc,GAE3C,CAAE,MAAOqC,GACLC,QAAQD,MAAM,8BAA+BA,GAC7CE,EAAWF,MAAM,+BACrB,CACJ,EAKayB,sBAAqBnD,eAAAoD,EAACnE,GAC/B,MAAMoE,EAAUpE,EAAME,aAAa,SACnC,MAAM4B,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBAExD,IACI,MAAMqB,EAAQxD,KAAK2B,WACnB,MAAMM,EAAUuB,EAAMC,YAAY,8DAA+DH,GACjGrB,EAAQgD,aAAa,UAAWW,SAC1B3D,EAAQyB,SAEdwB,EAAaC,KAAK,WAAWS,EAAU,UAAY,0BACvD,CAAE,MAAO3B,GACLC,QAAQD,MAAM,iCAAkCA,GAChDE,EAAWF,MAAM,oCAEjBjE,KAAKC,QAAQ2B,YAAY,kBAAmBgE,EAChD,CACJ,EAKaC,yBAAwBtD,eAAAuD,EAACtE,GAClC,MAAMoE,EAAUpE,EAAME,aAAa,SACnC,MAAM4B,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBAExD,IACI,MAAMqB,EAAQxD,KAAK2B,WACnB,MAAMM,EAAUuB,EAAMC,YAAY,iEAAkEH,GACpGrB,EAAQgD,aAAa,UAAWW,SAC1B3D,EAAQyB,SAEdwB,EAAaC,KAAK,eAAeS,EAAU,UAAY,0BAE3D,CAAE,MAAO3B,GACLC,QAAQD,MAAM,qCAAsCA,GACpDE,EAAWF,MAAM,wCAEjBjE,KAAKC,QAAQ2B,YAAY,qBAAsBgE,EACnD,CACJ,EAKaG,aAAYxD,eAAAyD,IACrB,MAAM1C,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBAExDgC,EAAW8B,QAAQ,2EAA4E,CAC3FC,QAAS,CAAC/B,EAAWgC,OAAOC,GAAIjC,EAAWgC,OAAOE,QAClDC,iBAAkBnC,EAAWgC,OAAOC,GACpCG,QAAShE,UACL,GAAI+C,IAAWnB,EAAWgC,OAAOC,GAAI,CACjC,IACI,MAAM5C,EAAQxD,KAAK2B,WACnB,MAAMM,EAAUuB,EAAMC,YAAY,kDAAmDH,SAC/ErB,EAAQyB,SAEdS,EAAWqC,QAAQ,oCAGbxG,KAAKyG,WAEf,CAAE,MAAOxC,GACLC,QAAQD,MAAM,wBAAyBA,GACvCE,EAAWF,MAAM,wBACrB,CACJ,IAGZ,EAKawC,UAASlE,eAAAmE,IAClB,GAAI1G,KAAKiB,UAAUiB,oBAAoBC,kBAAmB,OAChDnC,KAAKqC,eAAe,YACpBrC,KAAKsC,mBAAmB,KAClC,CACJ,EAEOqE,YAAW,SAAAC,IACd5G,KAAKmB,YAAYuD,MAAM,OAC3B,EAEOmC,iBAAgB,SAAAC,IACP9G,KAAK2B,SAAS,OAAQC,YAAY,UAAW,sBAC7D,EAEOmF,qBAAoB,SAAAC,IACXhH,KAAK2B,SAAS,OAAQC,YAAY,UAAW,wBAC7D,EAKOqF,sBAAqB,SAAAC,EAAC1F,GAEzB,MAAM8C,EAAc9C,EAAME,aAAa,cACvC,GAAI4C,EAAa,CACb,MAAMC,EAASD,EAAYE,YAC3B,MAAMC,EAAYzE,KAAKiB,UAAUiB,oBAAoBC,kBAAkBC,YAAY,QAGnFpC,KAAKmB,YAAYuD,MAAM,kBAAmB,CACtCjD,MAAOgD,EACP0C,YAAa5C,EAAOK,KAIZ5E,KAAK2B,SAAS,OAAQC,YAAY,UAAW,0BAC7D,CACJ,EAKawF,wBAAuB7E,eAAA8E,UAC1BrH,KAAKsC,mBAAmB,KAClC,EAEagF,qBAAoB/E,eAAAgF,UACvBvH,KAAKqC,eAAe,KAC9B,EAEamF,yBAAwBjF,eAAAkF,EAACjG,GAClC,MAAMS,EAAUT,EAAMkG,YAAYC,oBAElC,MAAMC,EAAYC,IACd,IACI,OAAOC,KAAKC,UAAUD,KAAKE,MAAMH,GAAO,KAAM,EAClD,CAAE,MAAO5D,GACL,OAAO4D,CACX,GAGJ,MAAMI,EAAY,IAAI/H,EAAU,CAC5BgI,SAAUN,EAAS3F,EAAQG,YAAY,aACvC+F,QAASP,EAAS3F,EAAQG,YAAY,YACtCgG,MAAOR,EAAS3F,EAAQG,YAAY,UACpCiG,aAAcT,EAAS3F,EAAQG,YAAY,iBAC3CkG,QAASrG,EAAQG,YAAY,aAGjC,MAAMmG,QAAiBC,EAASC,KAAK,CACjCC,WAAY,0zDA8BZC,WAAY3I,OAGhB,MAAM4I,EAAUL,EAChBK,EAAQ1H,SAAS+G,EAAW,aAC5BW,EAAQC,OAAOrH,EAAMkG,YACzB,EAKaoB,eAAcvG,eAAAwG,IACvB,MAAMzF,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBACxD,IAAKmB,EAAc,CACf,MACJ,CAEA,IACI,MAAME,EAAQxD,KAAK2B,WACnB,MAAM2D,EAAS9B,EAAMC,YAAY,yDAA0DH,SACrFgC,EAAO5B,SAEbwB,EAAaC,KAAK,sCAGZnF,KAAKsH,sBAEf,CAAE,MAAOrD,GACLC,QAAQD,MAAM,0BAA2BA,GACzCE,EAAWF,MAAM,0BACrB,CACJ,EAKa+E,kBAAiBzG,eAAA0G,IAC1B,MAAM3F,EAAetD,KAAKiB,UAAUiB,oBAAoBC,kBACxD,IAAKmB,EAAc,CACf,MACJ,CAEA,IACI,MAAME,EAAQxD,KAAK2B,WACnB,MAAM2D,EAAS9B,EAAMC,YAAY,4DAA6DH,SACxFgC,EAAO5B,SAEbwB,EAAaC,KAAK,0CAGZnF,KAAKoH,yBAEf,CAAE,MAAOnD,GACLC,QAAQD,MAAM,8BAA+BA,GAC7CE,EAAWF,MAAM,8BACrB,CACJ,IAAC,OArdgBtE,CAAK","ignoreList":[]}
|
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import MessageBox from "sap/m/MessageBox";
|
|
2
|
+
import BaseController from "./BaseController";
|
|
3
|
+
import ODataModel from "sap/ui/model/odata/v4/ODataModel";
|
|
4
|
+
import JSONModel from "sap/ui/model/json/JSONModel";
|
|
5
|
+
import { Route$PatternMatchedEvent } from "sap/ui/core/routing/Route";
|
|
6
|
+
import Table, { Table$RowSelectionChangeEvent } from "sap/ui/table/Table";
|
|
7
|
+
import MessageToast from "sap/m/MessageToast";
|
|
8
|
+
import Context from "sap/ui/model/odata/v4/Context";
|
|
9
|
+
import Filter from "sap/ui/model/Filter";
|
|
10
|
+
import FilterOperator from "sap/ui/model/FilterOperator";
|
|
11
|
+
import ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
|
|
12
|
+
import { Button$PressEvent } from "sap/m/Button";
|
|
13
|
+
import Fragment from "sap/ui/core/Fragment";
|
|
14
|
+
import Popover from "sap/m/Popover";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @namespace cds.plugin.caching.dashboard.controller
|
|
18
|
+
*/
|
|
19
|
+
export default class Cache extends BaseController {
|
|
20
|
+
private uiModel: JSONModel;
|
|
21
|
+
|
|
22
|
+
public onInit(): void {
|
|
23
|
+
super.onInit();
|
|
24
|
+
|
|
25
|
+
// Create a JSON model for UI data binding
|
|
26
|
+
this.uiModel = new JSONModel({
|
|
27
|
+
selectedTab: "main",
|
|
28
|
+
statistics: [],
|
|
29
|
+
loading: false,
|
|
30
|
+
loadingEntries: false,
|
|
31
|
+
showEntriesTable: false,
|
|
32
|
+
cacheEntries: [],
|
|
33
|
+
|
|
34
|
+
// Create
|
|
35
|
+
createKey: "",
|
|
36
|
+
createValue: "",
|
|
37
|
+
createTtl: 3600,
|
|
38
|
+
|
|
39
|
+
// Get
|
|
40
|
+
getKey: "",
|
|
41
|
+
getValue: "",
|
|
42
|
+
|
|
43
|
+
// Delete
|
|
44
|
+
deleteKey: "",
|
|
45
|
+
|
|
46
|
+
// Metrics
|
|
47
|
+
metricsEnabled: false,
|
|
48
|
+
keyMetricsEnabled: false,
|
|
49
|
+
});
|
|
50
|
+
this.getView().setModel(this.uiModel, "ui");
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
this.getRouter().getRoute("cache").attachPatternMatched(this.onRouteMatched, this);
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public onRouteMatched(event: Route$PatternMatchedEvent): void {
|
|
58
|
+
const { cache } = event.getParameter("arguments") as { cache: string };
|
|
59
|
+
(<JSONModel>this.getModel("app")).setProperty("/selectedCache", cache);
|
|
60
|
+
(<JSONModel>this.getModel("app")).setProperty("/layout", "TwoColumnsMidExpanded");
|
|
61
|
+
|
|
62
|
+
this.getView().bindElement({
|
|
63
|
+
path: "/Caches('" + cache + "')",
|
|
64
|
+
events: {
|
|
65
|
+
change: (event: any) => {
|
|
66
|
+
const context = this.getView().getElementBinding().getBoundContext();
|
|
67
|
+
if (context) {
|
|
68
|
+
const cache = context.getProperty("configuration");
|
|
69
|
+
this.uiModel.setProperty("/config", cache);
|
|
70
|
+
this.loadStatistics();
|
|
71
|
+
this.loadKeyMetricsData();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Load statistics based on current filters
|
|
80
|
+
*/
|
|
81
|
+
private async loadStatistics(refresh: boolean = false): Promise<void> {
|
|
82
|
+
const table = this.getView().byId("metricsTable") as Table;
|
|
83
|
+
const filter = new Filter("cache", FilterOperator.EQ, (<JSONModel>this.getModel("app")).getProperty("/selectedCache"));
|
|
84
|
+
if (table.getBinding("rows").isSuspended()) {
|
|
85
|
+
table.getBinding("rows").resume();
|
|
86
|
+
}
|
|
87
|
+
if (refresh) {
|
|
88
|
+
(<ODataListBinding>table.getBinding("rows")).refresh();
|
|
89
|
+
} else {
|
|
90
|
+
(<ODataListBinding>table.getBinding("rows")).filter(filter);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Load key tracking data
|
|
96
|
+
*/
|
|
97
|
+
async loadKeyMetricsData(refresh: boolean = false): Promise<void> {
|
|
98
|
+
const table = this.getView().byId("keyMetricsTable") as Table;
|
|
99
|
+
const filter = new Filter("cache", FilterOperator.EQ, (<JSONModel>this.getModel("app")).getProperty("/selectedCache"));
|
|
100
|
+
if (table.getBinding("rows").isSuspended()) {
|
|
101
|
+
table.getBinding("rows").resume();
|
|
102
|
+
}
|
|
103
|
+
if (refresh) {
|
|
104
|
+
(<ODataListBinding>table.getBinding("rows")).refresh();
|
|
105
|
+
} else {
|
|
106
|
+
(<ODataListBinding>table.getBinding("rows")).filter(filter);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Load cache entries
|
|
113
|
+
*/
|
|
114
|
+
public async onLoadCacheEntries(): Promise<void> {
|
|
115
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
this.uiModel.setProperty("/loadingEntries", true);
|
|
119
|
+
this.uiModel.setProperty("/showEntriesTable", true);
|
|
120
|
+
this.uiModel.setSizeLimit(100_000);
|
|
121
|
+
|
|
122
|
+
// Call the backend to get cache entries
|
|
123
|
+
const model = this.getModel() as ODataModel;
|
|
124
|
+
const context = model.bindContext(`plugin.cds_caching.CachingApiService.getEntries(...)`, cacheContext);
|
|
125
|
+
await context.invoke();
|
|
126
|
+
const { value: entries } = await context.requestObject();
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
entry.tags = entry.tags.join(", ");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
this.uiModel.setProperty("/cacheEntries", entries);
|
|
132
|
+
|
|
133
|
+
} catch (error) {
|
|
134
|
+
console.error("Error loading cache entries:", error);
|
|
135
|
+
MessageBox.error("Failed to load cache entries");
|
|
136
|
+
} finally {
|
|
137
|
+
this.uiModel.setProperty("/loadingEntries", false);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Handle statistics row selection
|
|
143
|
+
*/
|
|
144
|
+
public onMetricsRowSelect(event: Table$RowSelectionChangeEvent): void {
|
|
145
|
+
const selectedRow = event.getParameter("rowContext");
|
|
146
|
+
if (selectedRow) {
|
|
147
|
+
const metric = selectedRow.getObject() as any;
|
|
148
|
+
const cacheName = this.getView().getElementBinding().getBoundContext().getProperty("name");
|
|
149
|
+
|
|
150
|
+
// Navigate to single metric view
|
|
151
|
+
this.getRouter().navTo("singleMetric", {
|
|
152
|
+
cache: cacheName,
|
|
153
|
+
metricId: metric.ID
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Set layout to three columns
|
|
157
|
+
(<JSONModel>this.getModel("app")).setProperty("/layout", "ThreeColumnsEndExpanded");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Set cache entry
|
|
163
|
+
*/
|
|
164
|
+
public async onSetKey(): Promise<void> {
|
|
165
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
166
|
+
const key = this.uiModel.getProperty("/createKey");
|
|
167
|
+
const value = this.uiModel.getProperty("/createValue");
|
|
168
|
+
const ttl = this.uiModel.getProperty("/createTtl");
|
|
169
|
+
|
|
170
|
+
if (!key || !value) {
|
|
171
|
+
MessageBox.error("Please provide both key and value");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
try {
|
|
176
|
+
const model = this.getModel() as ODataModel;
|
|
177
|
+
const context = model.bindContext(`plugin.cds_caching.CachingApiService.setEntry(...)`, cacheContext);
|
|
178
|
+
context.setParameter("key", key);
|
|
179
|
+
context.setParameter("value", value);
|
|
180
|
+
context.setParameter("ttl", ttl);
|
|
181
|
+
await context.invoke();
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
MessageToast.show("Cache entry created successfully");
|
|
185
|
+
|
|
186
|
+
// Clear form
|
|
187
|
+
this.uiModel.setProperty("/createKey", "");
|
|
188
|
+
this.uiModel.setProperty("/createValue", "");
|
|
189
|
+
this.uiModel.setProperty("/createTtl", 3600);
|
|
190
|
+
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error("Error setting cache entry:", error);
|
|
193
|
+
MessageBox.error("Failed to create cache entry");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Get cache entry
|
|
199
|
+
*/
|
|
200
|
+
public async onGetKey(): Promise<void> {
|
|
201
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
202
|
+
const key = this.uiModel.getProperty("/getKey");
|
|
203
|
+
|
|
204
|
+
if (!key) {
|
|
205
|
+
MessageBox.error("Please provide a key");
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
const model = this.getModel() as ODataModel;
|
|
211
|
+
const action = model.bindContext(`plugin.cds_caching.CachingApiService.getEntry(...)`, cacheContext);
|
|
212
|
+
action.setParameter("key", key);
|
|
213
|
+
await action.invoke();
|
|
214
|
+
|
|
215
|
+
const result = await action.requestObject();
|
|
216
|
+
this.uiModel.setProperty("/getValue", result.value || "Not found");
|
|
217
|
+
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error("Error getting cache entry:", error);
|
|
220
|
+
this.uiModel.setProperty("/getValue", "Error: Entry not found or error occurred");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Delete cache entry
|
|
226
|
+
*/
|
|
227
|
+
public async onDeleteKey(): Promise<void> {
|
|
228
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
229
|
+
const key = this.uiModel.getProperty("/deleteKey");
|
|
230
|
+
|
|
231
|
+
if (!key) {
|
|
232
|
+
MessageBox.error("Please provide a key");
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
try {
|
|
237
|
+
const model = this.getModel() as ODataModel;
|
|
238
|
+
const context = model.bindContext(`plugin.cds_caching.CachingApiService.deleteEntry(...)`, cacheContext);
|
|
239
|
+
context.setParameter("key", key);
|
|
240
|
+
await context.invoke();
|
|
241
|
+
|
|
242
|
+
MessageToast.show("Cache entry deleted successfully");
|
|
243
|
+
|
|
244
|
+
// Clear form
|
|
245
|
+
this.uiModel.setProperty("/deleteKey", "");
|
|
246
|
+
|
|
247
|
+
} catch (error) {
|
|
248
|
+
console.error("Error deleting cache entry:", error);
|
|
249
|
+
MessageBox.error("Failed to delete cache entry");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Enable/disable statistics
|
|
255
|
+
*/
|
|
256
|
+
public async onEnableMetricsChange(event: any): Promise<void> {
|
|
257
|
+
const enabled = event.getParameter("state");
|
|
258
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
const model = this.getModel() as ODataModel;
|
|
262
|
+
const context = model.bindContext(`plugin.cds_caching.CachingApiService.setMetricsEnabled(...)`, cacheContext);
|
|
263
|
+
context.setParameter("enabled", enabled);
|
|
264
|
+
await context.invoke();
|
|
265
|
+
|
|
266
|
+
MessageToast.show(`Metrics ${enabled ? 'enabled' : 'disabled'} successfully`);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
console.error("Error setting metrics enabled:", error);
|
|
269
|
+
MessageBox.error("Failed to update metrics setting");
|
|
270
|
+
// Revert the switch
|
|
271
|
+
this.uiModel.setProperty("/enableMetrics", !enabled);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Enable/disable key tracking
|
|
277
|
+
*/
|
|
278
|
+
public async onEnableKeyMetricsChange(event: any): Promise<void> {
|
|
279
|
+
const enabled = event.getParameter("state");
|
|
280
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
const model = this.getModel() as ODataModel;
|
|
284
|
+
const context = model.bindContext(`plugin.cds_caching.CachingApiService.setKeyMetricsEnabled(...)`, cacheContext);
|
|
285
|
+
context.setParameter("enabled", enabled);
|
|
286
|
+
await context.invoke();
|
|
287
|
+
|
|
288
|
+
MessageToast.show(`Key metrics ${enabled ? 'enabled' : 'disabled'} successfully`);
|
|
289
|
+
|
|
290
|
+
} catch (error) {
|
|
291
|
+
console.error("Error setting key metrics enabled:", error);
|
|
292
|
+
MessageBox.error("Failed to update key metrics setting");
|
|
293
|
+
// Revert the switch
|
|
294
|
+
this.uiModel.setProperty("/enableKeyMetrics", !enabled);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Clear cache
|
|
300
|
+
*/
|
|
301
|
+
public async onClearCache(): Promise<void> {
|
|
302
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
303
|
+
|
|
304
|
+
MessageBox.confirm("Are you sure you want to clear this cache? This action cannot be undone.", {
|
|
305
|
+
actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],
|
|
306
|
+
emphasizedAction: MessageBox.Action.OK,
|
|
307
|
+
onClose: async (action: string) => {
|
|
308
|
+
if (action === MessageBox.Action.OK) {
|
|
309
|
+
try {
|
|
310
|
+
const model = this.getModel() as ODataModel;
|
|
311
|
+
const context = model.bindContext(`plugin.cds_caching.CachingApiService.clear(...)`, cacheContext);
|
|
312
|
+
await context.invoke();
|
|
313
|
+
|
|
314
|
+
MessageBox.success("Cache cleared successfully");
|
|
315
|
+
|
|
316
|
+
// Refresh the data
|
|
317
|
+
await this.onRefresh();
|
|
318
|
+
|
|
319
|
+
} catch (error) {
|
|
320
|
+
console.error("Error clearing cache:", error);
|
|
321
|
+
MessageBox.error("Failed to clear cache");
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Handle refresh button press
|
|
330
|
+
*/
|
|
331
|
+
public async onRefresh(): Promise<void> {
|
|
332
|
+
if (this.getView().getElementBinding().getBoundContext()) {
|
|
333
|
+
await this.loadStatistics(true);
|
|
334
|
+
await this.loadKeyMetricsData(true);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
public handleClose(): void {
|
|
339
|
+
this.getRouter().navTo("main");
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
public handleFullScreen(): void {
|
|
343
|
+
(<JSONModel>this.getModel("app")).setProperty("/layout", "MidColumnFullScreen");
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
public handleExitFullScreen(): void {
|
|
347
|
+
(<JSONModel>this.getModel("app")).setProperty("/layout", "TwoColumnsMidExpanded");
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Handle key row selection
|
|
352
|
+
*/
|
|
353
|
+
public onKeyMetricsRowSelect(event: any): void {
|
|
354
|
+
|
|
355
|
+
const selectedRow = event.getParameter("rowContext");
|
|
356
|
+
if (selectedRow) {
|
|
357
|
+
const metric = selectedRow.getObject() as any;
|
|
358
|
+
const cacheName = this.getView().getElementBinding().getBoundContext().getProperty("name");
|
|
359
|
+
|
|
360
|
+
// Navigate to single metric view
|
|
361
|
+
this.getRouter().navTo("singleKeyMetric", {
|
|
362
|
+
cache: cacheName,
|
|
363
|
+
keyMetricId: metric.ID
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// Set layout to three columns
|
|
367
|
+
(<JSONModel>this.getModel("app")).setProperty("/layout", "ThreeColumnsEndExpanded");
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Refresh key data
|
|
373
|
+
*/
|
|
374
|
+
public async onRefreshKeyMetricsData(): Promise<void> {
|
|
375
|
+
await this.loadKeyMetricsData(true);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
public async onRefreshMetricsData(): Promise<void> {
|
|
379
|
+
await this.loadStatistics(true);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
public async onShowKeyMetricsMetadata(event: Button$PressEvent): Promise<void> {
|
|
383
|
+
const context = event.getSource().getBindingContext() as Context;
|
|
384
|
+
|
|
385
|
+
const saveJson = (json: string) => {
|
|
386
|
+
try {
|
|
387
|
+
return JSON.stringify(JSON.parse(json), null, 2)
|
|
388
|
+
} catch (error) {
|
|
389
|
+
return json
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
const localData = new JSONModel({
|
|
394
|
+
metadata: saveJson(context.getProperty("metadata")),
|
|
395
|
+
subject: saveJson(context.getProperty("subject")),
|
|
396
|
+
query: saveJson(context.getProperty("query")),
|
|
397
|
+
cacheOptions: saveJson(context.getProperty("cacheOptions")),
|
|
398
|
+
keyName: context.getProperty("keyName"),
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
const fragment = await Fragment.load({
|
|
402
|
+
definition: `<core:FragmentDefinition xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:form="sap.ui.layout.form">
|
|
403
|
+
<Popover title="{localData>/keyName}" placement="Bottom" contentWidth="30rem">
|
|
404
|
+
<content>
|
|
405
|
+
<IconTabBar>
|
|
406
|
+
<items>
|
|
407
|
+
<IconTabFilter text="Metadata">
|
|
408
|
+
<content>
|
|
409
|
+
<TextArea value="{localData>/metadata}" rows="20" width="100%" editable="false" />
|
|
410
|
+
</content>
|
|
411
|
+
</IconTabFilter>
|
|
412
|
+
<IconTabFilter text="Subject" >
|
|
413
|
+
<content>
|
|
414
|
+
<TextArea value="{localData>/subject}" rows="20" width="100%" editable="false" />
|
|
415
|
+
</content>
|
|
416
|
+
</IconTabFilter>
|
|
417
|
+
<IconTabFilter text="Query" >
|
|
418
|
+
<content>
|
|
419
|
+
<TextArea value="{localData>/query}" rows="20" width="100%" editable="false" />
|
|
420
|
+
</content>
|
|
421
|
+
</IconTabFilter>
|
|
422
|
+
<IconTabFilter text="Cache Options" >
|
|
423
|
+
<content>
|
|
424
|
+
<TextArea value="{localData>/cacheOptions}" rows="20" width="100%" editable="false" />
|
|
425
|
+
</content>
|
|
426
|
+
</IconTabFilter>
|
|
427
|
+
</items>
|
|
428
|
+
</IconTabBar>
|
|
429
|
+
</content>
|
|
430
|
+
</Popover>
|
|
431
|
+
</core:FragmentDefinition>`,
|
|
432
|
+
controller: this,
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
const popover = fragment as Popover;
|
|
436
|
+
popover.setModel(localData, "localData");
|
|
437
|
+
popover.openBy(event.getSource());
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Clear statistics
|
|
442
|
+
*/
|
|
443
|
+
public async onClearMetrics(): Promise<void> {
|
|
444
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
445
|
+
if (!cacheContext) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
try {
|
|
450
|
+
const model = this.getModel() as ODataModel;
|
|
451
|
+
const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearMetrics(...)`, cacheContext);
|
|
452
|
+
await action.invoke();
|
|
453
|
+
|
|
454
|
+
MessageToast.show("Metrics cleared successfully");
|
|
455
|
+
|
|
456
|
+
// Refresh the data
|
|
457
|
+
await this.onRefreshMetricsData();
|
|
458
|
+
|
|
459
|
+
} catch (error) {
|
|
460
|
+
console.error("Error clearing metrics:", error);
|
|
461
|
+
MessageBox.error("Failed to clear metrics");
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Clear key metrics
|
|
467
|
+
*/
|
|
468
|
+
public async onClearKeyMetrics(): Promise<void> {
|
|
469
|
+
const cacheContext = this.getView().getElementBinding().getBoundContext() as Context;
|
|
470
|
+
if (!cacheContext) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
try {
|
|
475
|
+
const model = this.getModel() as ODataModel;
|
|
476
|
+
const action = model.bindContext(`plugin.cds_caching.CachingApiService.clearKeyMetrics(...)`, cacheContext);
|
|
477
|
+
await action.invoke();
|
|
478
|
+
|
|
479
|
+
MessageToast.show("Key metrics cleared successfully");
|
|
480
|
+
|
|
481
|
+
// Refresh the data
|
|
482
|
+
await this.onRefreshKeyMetricsData();
|
|
483
|
+
|
|
484
|
+
} catch (error) {
|
|
485
|
+
console.error("Error clearing key metrics:", error);
|
|
486
|
+
MessageBox.error("Failed to clear key metrics");
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
sap.ui.define(["./BaseController"], function (__BaseController) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
function _interopRequireDefault(obj) {
|
|
5
|
+
return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
|
|
6
|
+
}
|
|
7
|
+
const BaseController = _interopRequireDefault(__BaseController);
|
|
8
|
+
/**
|
|
9
|
+
* @namespace cds.plugin.caching.dashboard.controller
|
|
10
|
+
*/
|
|
11
|
+
const Main = BaseController.extend("cds.plugin.caching.dashboard.controller.Main", {
|
|
12
|
+
onInit: function _onInit() {
|
|
13
|
+
this.getRouter().getRoute("main").attachPatternMatched(this.onRouteMatched, this);
|
|
14
|
+
},
|
|
15
|
+
onRouteMatched: function _onRouteMatched(event) {
|
|
16
|
+
// Set layout to one column for main view
|
|
17
|
+
this.getModel("app").setProperty("/layout", "OneColumn");
|
|
18
|
+
this.getView().byId("cachesList").getBinding("items").refresh();
|
|
19
|
+
},
|
|
20
|
+
onCacheSelect: function _onCacheSelect(event) {
|
|
21
|
+
const cache = event.getParameter("listItem").getBindingContext().getProperty("name");
|
|
22
|
+
this.getRouter().navTo("cache", {
|
|
23
|
+
cache: cache
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
onRefresh: function _onRefresh() {
|
|
27
|
+
this.getView().byId("cachesList").getBinding("items").refresh();
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
return Main;
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=Main-dbg.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main-dbg.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","Main","extend","onInit","_onInit","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","getModel","setProperty","getView","byId","getBinding","refresh","onCacheSelect","_onCacheSelect","cache","getParameter","getBindingContext","getProperty","navTo","onRefresh","_onRefresh"],"sources":["Main.controller.ts"],"sourcesContent":["import { ListBase$ItemPressEvent } from \"sap/m/ListBase\";\nimport BaseController from \"./BaseController\";\nimport MessageBox from \"sap/m/MessageBox\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class Main extends BaseController {\n\n\tpublic onInit(): void {\n\t\tthis.getRouter().getRoute(\"main\").attachPatternMatched(this.onRouteMatched, this);\n\t}\n\n\tpublic onRouteMatched(event: Route$PatternMatchedEvent): void {\n\t\t// Set layout to one column for main view\n\t\t(<any>this.getModel(\"app\")).setProperty(\"/layout\", \"OneColumn\");\n\t\tthis.getView().byId(\"cachesList\").getBinding(\"items\").refresh();\n\t}\n\n\tpublic onCacheSelect(event: ListBase$ItemPressEvent): void {\n\t\tconst cache = event.getParameter(\"listItem\").getBindingContext().getProperty(\"name\");\n\t\tthis.getRouter().navTo(\"cache\", { cache: cache });\n\t}\n\n\tpublic onRefresh(): void {\n\t\tthis.getView().byId(\"cachesList\").getBinding(\"items\").refresh();\n\t}\n\n}\n"],"mappings":";;;;;;QACOA,cAAc,GAAAC,sBAAA,CAAAC,gBAAA;EAKrB;AACA;AACA;EAFA,MAGqBC,IAAI,GAASH,cAAc,CAAAI,MAAA;IAExCC,MAAM,WAAAC,QAAA,EAAS;MACrB,IAAI,CAACC,SAAS,CAAC,CAAC,CAACC,QAAQ,CAAC,MAAM,CAAC,CAACC,oBAAoB,CAAC,IAAI,CAACC,cAAc,EAAE,IAAI,CAAC;IAClF,CAAC;IAEMA,cAAc,WAAAC,gBAACC,KAAgC,EAAQ;MAC7D;MACM,IAAI,CAACC,QAAQ,CAAC,KAAK,CAAC,CAAEC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC;MAC/D,IAAI,CAACC,OAAO,CAAC,CAAC,CAACC,IAAI,CAAC,YAAY,CAAC,CAACC,UAAU,CAAC,OAAO,CAAC,CAACC,OAAO,CAAC,CAAC;IAChE,CAAC;IAEMC,aAAa,WAAAC,eAACR,KAA8B,EAAQ;MAC1D,MAAMS,KAAK,GAAGT,KAAK,CAACU,YAAY,CAAC,UAAU,CAAC,CAACC,iBAAiB,CAAC,CAAC,CAACC,WAAW,CAAC,MAAM,CAAC;MACpF,IAAI,CAACjB,SAAS,CAAC,CAAC,CAACkB,KAAK,CAAC,OAAO,EAAE;QAAEJ,KAAK,EAAEA;MAAM,CAAC,CAAC;IAClD,CAAC;IAEMK,SAAS,WAAAC,WAAA,EAAS;MACxB,IAAI,CAACZ,OAAO,CAAC,CAAC,CAACC,IAAI,CAAC,YAAY,CAAC,CAACC,UAAU,CAAC,OAAO,CAAC,CAACC,OAAO,CAAC,CAAC;IAChE;EAAC;EAAA,OAnBmBf,IAAI;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
sap.ui.define(["./BaseController"],function(e){"use strict";function t(e){return e&&e.__esModule&&typeof e.default!=="undefined"?e.default:e}const n=t(e);const i=n.extend("cds.plugin.caching.dashboard.controller.Main",{onInit:function e(){this.getRouter().getRoute("main").attachPatternMatched(this.onRouteMatched,this)},onRouteMatched:function e(t){this.getModel("app").setProperty("/layout","OneColumn");this.getView().byId("cachesList").getBinding("items").refresh()},onCacheSelect:function e(t){const n=t.getParameter("listItem").getBindingContext().getProperty("name");this.getRouter().navTo("cache",{cache:n})},onRefresh:function e(){this.getView().byId("cachesList").getBinding("items").refresh()}});return i});
|
|
2
|
+
//# sourceMappingURL=Main.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","Main","extend","onInit","_onInit","this","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","getModel","setProperty","getView","byId","getBinding","refresh","onCacheSelect","_onCacheSelect","cache","getParameter","getBindingContext","getProperty","navTo","onRefresh","_onRefresh"],"sources":["Main.controller.ts"],"sourcesContent":["import { ListBase$ItemPressEvent } from \"sap/m/ListBase\";\nimport BaseController from \"./BaseController\";\nimport MessageBox from \"sap/m/MessageBox\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class Main extends BaseController {\n\n\tpublic onInit(): void {\n\t\tthis.getRouter().getRoute(\"main\").attachPatternMatched(this.onRouteMatched, this);\n\t}\n\n\tpublic onRouteMatched(event: Route$PatternMatchedEvent): void {\n\t\t// Set layout to one column for main view\n\t\t(<any>this.getModel(\"app\")).setProperty(\"/layout\", \"OneColumn\");\n\t\tthis.getView().byId(\"cachesList\").getBinding(\"items\").refresh();\n\t}\n\n\tpublic onCacheSelect(event: ListBase$ItemPressEvent): void {\n\t\tconst cache = event.getParameter(\"listItem\").getBindingContext().getProperty(\"name\");\n\t\tthis.getRouter().navTo(\"cache\", { cache: cache });\n\t}\n\n\tpublic onRefresh(): void {\n\t\tthis.getView().byId(\"cachesList\").getBinding(\"items\").refresh();\n\t}\n\n}\n"],"mappings":"mJACOA,EAAcC,EAAAC,GAKrB,MAGqBC,EAAaH,EAAcI,OAAA,gDAExCC,OAAM,SAAAC,IACZC,KAAKC,YAAYC,SAAS,QAAQC,qBAAqBH,KAAKI,eAAgBJ,KAC7E,EAEOI,eAAc,SAAAC,EAACC,GAEfN,KAAKO,SAAS,OAAQC,YAAY,UAAW,aACnDR,KAAKS,UAAUC,KAAK,cAAcC,WAAW,SAASC,SACvD,EAEOC,cAAa,SAAAC,EAACR,GACpB,MAAMS,EAAQT,EAAMU,aAAa,YAAYC,oBAAoBC,YAAY,QAC7ElB,KAAKC,YAAYkB,MAAM,QAAS,CAAEJ,MAAOA,GAC1C,EAEOK,UAAS,SAAAC,IACfrB,KAAKS,UAAUC,KAAK,cAAcC,WAAW,SAASC,SACvD,IAAC,OAnBmBhB,CAAI","ignoreList":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ListBase$ItemPressEvent } from "sap/m/ListBase";
|
|
2
|
+
import BaseController from "./BaseController";
|
|
3
|
+
import MessageBox from "sap/m/MessageBox";
|
|
4
|
+
import ODataModel from "sap/ui/model/odata/v4/ODataModel";
|
|
5
|
+
import { Route$PatternMatchedEvent } from "sap/ui/core/routing/Route";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @namespace cds.plugin.caching.dashboard.controller
|
|
9
|
+
*/
|
|
10
|
+
export default class Main extends BaseController {
|
|
11
|
+
|
|
12
|
+
public onInit(): void {
|
|
13
|
+
this.getRouter().getRoute("main").attachPatternMatched(this.onRouteMatched, this);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public onRouteMatched(event: Route$PatternMatchedEvent): void {
|
|
17
|
+
// Set layout to one column for main view
|
|
18
|
+
(<any>this.getModel("app")).setProperty("/layout", "OneColumn");
|
|
19
|
+
this.getView().byId("cachesList").getBinding("items").refresh();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public onCacheSelect(event: ListBase$ItemPressEvent): void {
|
|
23
|
+
const cache = event.getParameter("listItem").getBindingContext().getProperty("name");
|
|
24
|
+
this.getRouter().navTo("cache", { cache: cache });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public onRefresh(): void {
|
|
28
|
+
this.getView().byId("cachesList").getBinding("items").refresh();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
}
|